Nie było czatu.
Był zwykły formularz.
Techniczne case study prompt injection w aplikacji, w której LLM działał za API: request/response, output handling, downstream impact i mapowanie do OWASP LLM Top 10.
pole formularza
dalej
schematem
sam model
LLM nie musi mieć czatu, żeby dało się go zmanipulować
Wielu ludzi kojarzy prompt injection z oknem czatu i tekstem „ignore previous instructions”. W praktyce coraz częściej model siedzi głębiej: generuje opis oferty, klasyfikuje zgłoszenie, streszcza formularz, tworzy odpowiedź konsultanta albo normalizuje dane. Użytkownik nie widzi czatu, ale jego pola trafiają do promptu.
Ten case jest zanonimizowany. Endpointy, pola, identyfikatory i odpowiedzi są syntetyczne. Payloady są reprezentatywne i bezpieczne: pokazują wpływ na format i reguły, ale nie zawierają instrukcji eksfiltracji realnych danych ani sekretów.
Model ukryty za zwykłym API
Aplikacja traktowała pola formularza jako zwykłą treść biznesową. Backend sklejał je z instrukcjami systemowymi i kontekstem wewnętrznym. Brakowało separacji między danymi użytkownika a instrukcjami dla modelu.
Najpierw sprawdzamy, czy input wpływa na output
Baseline pozwala zobaczyć normalny format odpowiedzi. Dopiero potem dodajemy neutralny marker i sprawdzamy, czy model traktuje go jako treść do streszczenia, czy jako instrukcję.
Pole opisu zaczęło sterować formatem odpowiedzi
Sama zmiana tonu nie zawsze jest krytyczna. Problem zaczyna się wtedy, gdy ten sam mechanizm pozwala ominąć polityki, wymusić format przetwarzany dalej przez system, wygenerować treść phishingową, wstrzyknąć HTML albo ujawnić elementy kontekstu.
Injection stał się groźny, bo output był dalej przetwarzany
Najciekawszy fragment nie był w samym LLM, tylko po LLM. Wygenerowana odpowiedź trafiała do bazy, panelu pracownika i maila. To oznacza, że prompt injection mógł przejść w XSS, manipulację workflow albo fałszywe rekomendacje biznesowe.
W raporcie rozdzieliliśmy więc dwie klasy: prompt injection oraz improper output handling. To ważne, bo naprawa też jest inna. Nie wystarczy „lepszy prompt”, jeśli aplikacja bez walidacji ufa wynikowi modelu.
Jak odróżnić ciekawostkę od podatności
Prompt injection przez formularz staje się wysokim ryzykiem, gdy output modelu jest zapisywany, renderowany jako HTML, wysyłany mailem, używany do decyzji workflow albo łączony z danymi wewnętrznymi.
Zapytaj, co system robi z oszukaną odpowiedzią.
OWASP LLM Top 10 w praktyce
Prompt Injection
Dane użytkownika zostały zinterpretowane jako instrukcje sterujące zachowaniem modelu.
Improper Output Handling
Output modelu był renderowany i wykorzystywany dalej bez wystarczającej walidacji, kodowania i separacji kontekstów.
Excessive Agency
Jeżeli rekomendacja modelu wpływa na workflow, model zaczyna mieć sprawczość i musi mieć ograniczenia oraz audyt.
Sensitive Information Disclosure
Testowaliśmy, czy model ujawnia elementy kontekstu wewnętrznego; w tym case ten wariant był częściowo ograniczony.
Warstwy obrony dla LLM za formularzem
1. Separacja danych i instrukcji. Input użytkownika musi być oznaczony jako dane, a nie doklejany swobodnie do promptu.
2. Walidacja schematu outputu. Model powinien zwracać ograniczony JSON walidowany po stronie serwera. Niepoprawny format = odrzucenie, nie automatyczna naprawa.
3. Encoding kontekstowy. Output renderowany w HTML, mailu, PDF albo systemie ticketowym musi być kodowany dla danego kontekstu.
4. Human-in-the-loop przy decyzjach. Model może sugerować, ale nie powinien sam zatwierdzać akcji biznesowej bez kontroli i logu.
Masz LLM ukryty za formularzem lub API?
Sprawdzimy prompt injection, output handling, kosztowe nadużycia, wycieki kontekstu i wpływ odpowiedzi modelu na realne procesy biznesowe.
Zamów test bezpieczeństwa →