EN

Útoky na LLM

Přehled útoků na webové aplikace s LLM podle OWASP a PortSwiggeru: prompt injection, nezabezpečené zpracování výstupu, nadměrná agentura, nepřímý prompt injection a únik trénovacích dat — a jak se proti nim bránit.

Co tato dovednost pokrývá

Rozpoznání a obranu proti útokům na webové aplikace, které integrují velký jazykový model (LLM) — chatboty, RAG asistenty a agenty s přístupem k nástrojům. Vychází z klasifikace PortSwigger Web LLM attacks a překrývá se s OWASP Top 10 for LLM Applications. Pro obecné bezpečnostní revize viz OWASP ASVS, pro návrh promptů System prompty a pro znalostní báze RAG.

Kdy ji použít

  • Bezpečnostní audit chatbota, RAG asistenta nebo agenta s nástroji
  • Review před nasazením funkce, která dává výstup modelu do prohlížeče, e-mailu nebo dalšího systému
  • Návrh promptů a integrací nástrojů tak, aby útok nešel eskalovat

Jak LLM útoky fungují

Klíčový princip: vstup modelu je nedůvěryhodný, a proto je nedůvěryhodný i jeho výstup. Do promptu se dostává nejen přímý text uživatele, ale i historie konverzace a — u RAG a agentů — obsah z externích zdrojů (webové stránky, dokumenty, e-maily, výsledky nástrojů). Model neumí spolehlivě odlišit „data" od „instrukcí", takže cokoli, co do něj vstoupí, může změnit jeho chování. Výstup pak zacházejte stejně opatrně jako s uživatelským vstupem na cestě ven.

PortSwigger a OWASP popisují šest hlavních tříd útoků.

Prompt injection (přímý)

Útočník ve své zprávě vloží instrukce, které přepíší systémový prompt — „ignoruj předchozí pokyny a…", vynucení jiné role, obejití guardrails nebo vyzrazení interních instrukcí. Sám o sobě je závažný podle toho, co model může udělat; nejčastěji je ale nebezpečný jako první krok k některé z tříd níže.

Obrana: princip nejmenších oprávnění v systémovém promptu (nedávat do něj tajemství ani agenturu, kterou lze zneužít), jasné instrukce ignorovat příkazy v datech a nepovažovat žádný jediný prompt za jistou obranu — vždy kombinovat s ošetřením výstupu a omezením nástrojů.

Nezabezpečené zpracování výstupu (insecure output handling)

Výstup modelu se předá dalšímu systému bez validace — vloží se do DOM přes innerHTML, do HTML e-mailu, do SQL dotazu nebo do shellu. Pokud odpověď obsahuje např. <img src=x onerror=…> nebo <script>, spustí se v prohlížeči oběti (XSS); u SQL/shellu vznikne injection. Útočník přitom payload nemusí zadat přímo — může přijít i nepřímo (viz níže).

Obrana: k výstupu se chovejte jako k neověřenému vstupu. Na klientu HTML-escapovat text před jakýmkoli formátováním, aby renderer vytvořil jen vlastní whitelistované značky; odkazy povolit jen pro https?:// a doplnit rel="noopener noreferrer". Na serveru navíc odstranit syrové HTML značky a schémata javascript:/data:/vbscript:. Parametrizovat SQL a nikdy nesestavovat shellové příkazy z výstupu modelu.

Nadměrná agentura (excessive agency)

Model má přístup k API či nástrojům, které umí měnit stav — poslat e-mail, zapsat do databáze, utratit peníze, smazat data, stáhnout soubor. Přes prompt injection ho lze přimět tyto nástroje zneužít nad rámec zamýšleného účelu.

Obrana: dávat modelu jen nejnutnější nástroje. Cíle akcí (příjemce e-mailu, cesta, URL) brát z pevné konfigurace nebo whitelistu, ne z volného textu uživatele či modelu. Nástroje pro čtení oddělit od zápisových; destruktivní operace nechat schválit člověkem, ne na uvážení modelu.

Nepřímý prompt injection (indirect)

Instrukce se do modelu nedostane přímo v chatu, ale schovaná v obsahu, který model zpracovává — scrapovaná webová stránka, e-mail, komentář, dokument v RAG znalostní bázi. Když je pak tento text zařazen do promptu, model může skryté příkazy vykonat — třeba vypsat XSS payload jiným uživatelům nebo vyzradit data. Je zákeřný tím, že oběť ani nemusí být ten, kdo obsah vložil.

Obrana: nedůvěryhodný obsah v promptu jasně ohraničit (delimiter) a označit jako „pouze data, nikdy instrukce"; do systémového promptu přidat pokyn ignorovat příkazy uvnitř znalostní báze. Kombinovat s ošetřením výstupu — kdyby injekce prošla, XSS payload se neutralizuje až na výstupu.

Otrávení trénovacích dat (training data poisoning)

Data, na kterých je model trénovaný nebo doladěný — případně obsah indexovaný do znalostní báze — jsou kompromitovaná, takže model vrací nepravdivé či zavádějící informace, nebo obsahuje skrytá zadní vrátka. Vzniká z nedůvěryhodných či příliš širokých datových zdrojů.

Obrana: kurátorovat trénovací i indexovaná data z ověřených zdrojů. U RAG aplikací, které lokálně netrénují, se riziko redukuje na „znalostní báze je nedůvěryhodná" — řešte ji jako nepřímý prompt injection.

Únik citlivých trénovacích dat (leaking sensitive training data)

Útočník cílenými dotazy vytáhne důvěrné informace, které se model „naučil" nebo které má v kontextu — dokončováním frází, dotazy typu „připomeň mi…" nebo obcházením filtrů. Týká se i tajemství vložených do systémového promptu.

Obrana: tajemství (klíče, interní URL, osobní údaje) nikdy nedávat do promptu ani do znalostní báze — co tam není, nejde vytáhnout. Omezovat, jaká data se do kontextu vůbec dostanou, a filtrovat výstup na citlivé vzory.

Doporučené postupy

  • Vstup i výstup jsou nedůvěryhodné. Escapujte a sanitizujte výstup modelu na každém sinku (DOM, e-mail, SQL, shell).
  • Nejmenší oprávnění. Model dostane jen nezbytné nástroje; citlivé cíle z konfigurace, ne z textu.
  • Oddělte data od instrukcí. Ohraničte nedůvěryhodný obsah v promptu a instruujte model ignorovat příkazy v datech.
  • Obrana do hloubky. Systémový prompt sám o sobě není bezpečnostní hranice — kombinujte prompt, ošetření výstupu a omezení nástrojů.
  • Žádná tajemství v promptu ani znalostní bázi.
  • Testujte útoky. Ověřte payloady (<img onerror>, <script>, javascript: odkaz), zkuste nepřímou injekci přes zaindexovanou stránku a pokus o zneužití nástrojů.

Zdroj klasifikace: PortSwigger — Web LLM attacks.