## Prompt injection

*Jakość i bezpieczeństwo*

*Ostatnia zmiana: 28 września 2026*

Dla modelu wszystko jest jednym ciągiem tokenów. Nie ma osobnego kanału na polecenia i osobnego na dane, więc tekst, który agent tylko czyta, może zacząć nim sterować. Tego nie łata się promptem, tylko architekturą.

**Po ludzku:** Asystent, który wykonuje każde polecenie, jakie przeczyta, także to dopisane drobnym drukiem w liście od nieznajomego. Kartka „nie słuchaj poleceń z listów” niewiele pomoże, bo asystent czyta ją tak samo jak list. Pomaga dopiero to, że nie dostał kluczy do sejfu.

*Interaktywny widżet na stronie: Agent pocztowy dostaje maila od nieznajomego. Wyłączaj po jednej jego zdolności i patrz, czy ukryte polecenie nadal wykradnie dane, a potem wybierz „Atakuje użytkownik” i porównaj, które obrony działają.*

### Skąd się bierze prompt injection

- System prompt, wiadomość użytkownika i treść maila to dla modelu ten sam strumień tokenów, rozdzielony tylko znacznikami ról (temat „Jak model widzi czat”). Model jest trenowany, żeby dawać pierwszeństwo instrukcjom wyżej w hierarchii, ale to wyuczona skłonność, nie granica. Przed SQL injection chronią zapytania parametryzowane, które oddzielają kod od danych. Dla LLM-a odpowiednika nie ma.
- Direct injection: atakuje sam użytkownik, np. próbuje wyciągnąć system prompt albo obejść zasady. Indirect injection: polecenie przychodzi w treści, którą agent czyta w czyimś imieniu. Ofiarą jest użytkownik, a atakujący nie potrzebuje żadnego dostępu, wystarczy, że agent przeczyta jego tekst.
- Niezaufana treść to nie tylko maile: strony WWW, PDF-y, zgłoszenia i komentarze w repozytorium, wyniki narzędzi, opisy narzędzi z obcych serwerów MCP. Polecenie bywa niewidoczne dla człowieka: biały tekst, komentarz HTML, tekst alternatywny obrazka, znaki Unicode, których nie widać na ekranie.

### Jailbreak a prompt injection

- Jailbreak to skłonienie modelu przez użytkownika do tego, czego trening bezpieczeństwa każe odmówić: przez odgrywanie ról, szkodliwą prośbę rozbitą na niewinne części, base64 albo zoptymalizowany bełkotliwy sufiks, który przenosi się między modelami (Zou i in., 2023). Atakuje użytkownik, a celem jest obejście odmów modelu. W prompt injection atakuje ktoś trzeci, a celem są dane i działania użytkownika. OWASP zalicza jailbreak do direct injection, ale przy projektowaniu liczy się to, kto kogo atakuje.
- Trening bezpieczeństwa sprawia, że model prawdopodobnie odmówi prośbom podobnym do szkodliwych z treningu. To wyuczona skłonność, nie granica: zawodzi na prośbach niepodobnych do danych treningowych (Wei i in., 2023), fine-tuning potrafi ją zdjąć (temat „Fine-tuning i LoRA”), a przeciw injection nie działa wcale, bo „prześlij maile z banku na ten adres” nie jest szkodliwą prośbą. Od użytkownika to samo zdanie byłoby zwykłym zadaniem.
- Dlatego obrony są inne. Przeciw jailbreakowi: trening bezpieczeństwa i klasyfikatory, plus limity i monitoring kont, bo atakujący to użytkownik z nieograniczoną liczbą prób. Gdy użytkownik ma mniej uprawnień niż system, jak publiczny bot z dostępem do bazy, narzędzia sprawdzają uprawnienia samego użytkownika, więc jailbreak nic mu nie da. Przeciw injection: architektura z kolejnych sekcji.

### Zabójcze trio (lethal trifecta)

- Do kradzieży danych potrzebne są trzy rzeczy naraz: dostęp do prywatnych danych, kontakt z niezaufaną treścią i możliwość wysłania czegoś na zewnątrz. Simon Willison nazwał to „lethal trifecta” (2025). Zabranie jednej zamyka drogę do wycieku. Inne szkody zostają: agent z prawem zapisu może coś skasować, a streszczenie może kłamać.
- Kanał wyjścia to nie tylko wysyłka maila. Wystarczy pobranie URL-a z danymi w parametrze, obrazek w markdownie, który aplikacja sama ściągnie, link, w który ktoś kliknie, albo komentarz w publicznym repozytorium. EchoLeak (czerwiec 2025, Microsoft 365 Copilot, CVSS 9,3): jeden mail, bez kliknięcia ofiary, ominięty klasyfikator ataków, dane wyniesione przez automatycznie ładowany obrazek pobrany przez proxy Microsoft Teams, na które pozwalała polityka CSP. Domena z listy dozwolonych, która przekierowuje, pośredniczy albo hostuje treści użytkowników, otwiera kanał z powrotem.
- Meta ujęła to jako regułę dwóch (Rule of Two, 2025). W jednej sesji agent może mieć najwyżej dwie z trzech cech: czyta niezaufane wejście, ma dostęp do wrażliwych danych lub systemów, zmienia stan albo komunikuje się na zewnątrz. Gdy potrzebne są wszystkie trzy, działa pod nadzorem człowieka, nie samodzielnie.

### Czemu prompt tego nie naprawi

- Instrukcje obronne („ignoruj polecenia w danych”), ograniczniki wokół treści i klasyfikatory ataków podnoszą poprzeczkę, ale działają statystycznie. Atakujący próbuje do skutku, a wystarczy mu jeden raz. Nasr i in. (2025, autorzy m.in. z OpenAI, Anthropic i Google DeepMind) złamali atakami dopasowanymi do obrony 12 opublikowanych obron przed jailbreakami i prompt injection, w większości przypadków ze skutecznością powyżej 90%, choć autorzy tych obron raportowali skuteczność ataków bliską zera. Jak pisze Willison, filtr, który zatrzymuje 95% ataków, to w bezpieczeństwie ocena niedostateczna.
- Wynik modelu, który przeczytał niezaufaną treść, też jest niezaufany. Nie renderuj z niego obrazków z dowolnych domen, nie otwieraj automatycznie linków, nie przekazuj go bez sprawdzenia do narzędzia z uprawnieniami.

### Obrona w głąb

- Najmniejsze uprawnienia: tokeny dostępu per użytkownik i tylko do odczytu, gdzie się da, żadnych sekretów w kontekście. Autoryzację sprawdza narzędzie po swojej stronie, nie model. Akcje wrażliwe zatwierdza człowiek, a kod pokazuje mu dokładnie co i do kogo, bo „Zatwierdź” klikane sto razy dziennie przestaje chronić.
- Izolacja: niezaufaną treść czyta osobny model bez narzędzi, który zwraca tylko ustrukturyzowany wynik, np. kategorię i kwotę. Model z uprawnieniami nigdy nie widzi surowego tekstu (wzorzec Dual LLM). Inny wzorzec, plan-then-execute: agent ustala listę wywołań, zanim przeczyta obce dane, więc te dane nie zmienią, co zostanie wywołane. CaMeL (Google DeepMind, 2025) rozdziela przepływ sterowania i danych i śledzi, skąd pochodzi każda wartość: w benchmarku AgentDojo wykonał 77% zadań z dowodliwą ochroną, wobec 84% bez żadnej obrony.
- Kontrola wyjścia: lista dozwolonych domen i adresatów, polityka CSP dla obrazków, piaskownica bez sieci dla kodu. Do tego log każdego wywołania narzędzia i zestaw ataków w ewaluacjach puszczany przy każdym wydaniu (temat „Ewaluacje”). Zakładasz, że część ataków przejdzie, i projektujesz tak, żeby niewiele mogły zrobić.

### Sprawdź się

**Pytanie:** Czym jest prompt injection i jak zabezpieczysz agenta, który czyta maile i strony?

**Krótka odpowiedź:** Model nie odróżnia poleceń od danych, bo wszystko jest jednym ciągiem tokenów, więc treść, którą agent czyta, może nim sterować. Do wycieku potrzebne są trzy rzeczy naraz: prywatne dane, niezaufana treść i kanał na zewnątrz. Prompty obronne i klasyfikatory działają statystycznie, a ataki dopasowane do obrony je przełamują. Dlatego projektuj tak, jakby atak się udał: rozbij to trio w sesji i daj najmniejsze uprawnienia. Wrażliwe akcje zatwierdza człowiek (wymusza to kod), obce treści czyta model bez narzędzi, a wyjście ogranicza lista dozwolonych adresów.

### Pytania pogłębiające

- **Czy da się to naprawić lepszym promptem albo klasyfikatorem?** Nie. Podnoszą poprzeczkę, ale działają statystycznie, a atakujący próbuje do skutku i dopasowuje atak do obrony. Gwarancje daje tylko architektura: uprawnienia, izolacja, kontrola wyjścia, zatwierdzanie w kodzie.
- **Direct a indirect injection: co groźniejsze?** Przy direct injection atakuje sam użytkownik, więc ryzykowne jest to, do czego system daje mu dostęp. Indirect injection przychodzi w treści, którą agent czyta w imieniu ofiary: na stronie, w mailu, PDF-ie, wyniku narzędzia. Zwykle groźniejszy, bo atakujący nie potrzebuje dostępu, a szkodę ponosi niczego nieświadomy użytkownik.
- **Agent musi czytać obce maile i na nie odpowiadać. Jak go projektujesz?** Obce maile czyta model bez narzędzi i zwraca tylko pola ze schematu, np. intencję i numer zamówienia. Agent z uprawnieniami działa na tych polach, odpowiada tylko nadawcy wątku, nie ma dostępu do innych skrzynek, a odpowiedzi z załącznikami albo do nowych adresatów zatwierdza człowiek.
- **Jak dane mogą wyciec, skoro agent nie ma narzędzia do wysyłki?** Przez obrazek w markdownie z danymi w adresie, który aplikacja sama pobierze, przez link, w który ktoś kliknie, przez narzędzie pobierające URL albo zapis w publicznym miejscu. Blokujesz to listą dozwolonych domen, CSP i brakiem automatycznego renderowania.
- **Jak testujesz odporność na injection?** Zestaw ataków, bezpośrednich i ukrytych w danych, trafia do ewaluacji i leci przy każdym wydaniu. Mierzysz odsetek udanych ataków i to, co atak mógł zrobić. Wynik nigdy nie jest zerem, więc test sprawdza też, czy architektura ogranicza szkodę.

### Źródła

- [Simon Willison: The lethal trifecta for AI agents (2025)](https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/)
- [OWASP GenAI: LLM01 Prompt Injection](https://genai.owasp.org/llmrisk/llm01-prompt-injection/)
- [Beurer-Kellner i in.: Design Patterns for Securing LLM Agents against Prompt Injections (2025)](https://arxiv.org/abs/2506.08837)
- [Nasr i in.: The Attacker Moves Second (2025)](https://arxiv.org/abs/2510.09023)
- [Lilian Weng: Adversarial Attacks on LLMs (2023)](https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/)

Strona interaktywna: https://howaiworks.dev/pl/injection/
