Wstrzykiwanie poleceń (Prompt Injection) do LLM i bezpieczeństwo Guardrails
Modele LLM nie posiadają wyraźnej granicy między instrukcjami a danymi. Wszystko w oknie kontekstowym stanowi jeden strumień tokenów. Prompt injection następuje wtedy, gdy dane atakującego zaczynają pełnić rolę instrukcji. Nie da się osiągnąć bezpieczeństwa poprzez samo filtrowanie. Należy zarządzać tym za pomocą strategii obrony w głąb (defense-in-depth).
Nieskuteczność powszechnych metod obrony:
- Listy blokowane słów kluczowych: Atakujący używają synonimów, literówek lub innych języków, aby je ominąć. Filtrowanie ciągów znaków nie oznacza filtrowania intencji.
- Redakcja wyjścia: Atakujący mogą fragmentować lub kodować poufne dane, tak aby dosłowne dopasowanie ciągu znaków zawiodło.
- Sędziowie LLM: Osobny model może zostać poddany inżynierii społecznej, aby uwierzył, że dana tajemnica jest nieszkodliwa.
- Weryfikacja ludzka: Ludzie widzą wyrenderowany tekst, a nie surowe bajty. Nie są w stanie dostrzec ukrytych znaków używanych w ASCII smuggling.
ASCII Smuggling stanowi poważne zagrożenie. Wykorzystuje on niewidoczne znaki, takie jak tagi Unicode lub spacje o zerowej szerokości, aby ukryć instrukcje. Model je odczytuje, ale człowiek nie widzi nic. Umożliwia to podszywanie się pod tożsamość oraz eksfiltrację danych za pośrednictwem poczty e-mail lub kalendarzy.
Jak bronić swojej aplikacji:
- Oczyszczaj surowe ładunki (payloads): Usuwaj znaki sterujące i znaki o zerowej szerokości, zanim dotrą do modelu.
- Stosuj listy dozwolone (allowlists): Zamiast gonić za „złośliwymi” kategoriami, zdefiniuj konkretne kategorie Unicode, których potrzebujesz.
- Normalizuj dane: Stosuj normalizację NFKC dla wszystkich danych wejściowych.
- Minimalizuj poufne dane: Nie umieszczaj wrażliwych danych w oknie kontekstowym, jeśli model ich nie potrzebuje.
- Traktuj RAG jako niezaufane: Przyjmij założenie, że każdy dokument pobierany dla modelu jest potencjalnym wektorem wstrzykiwania.
- Monitoruj anomalie: Oznaczaj dane wejściowe, w których widoczna długość różni się od liczby surowych punktów kodowych (code-points).
Bezpieczeństwo to wada całego potoku (pipeline), a nie tylko wada modelu. Rozwiązanie tkwi w kodzie Twojej aplikacji.
Źródło: https://dev.to/geekaara/llm-prompt-injection-guardrail-security-glm
Opcjonalna społeczność edukacyjna: https://t.me/GyaanSetuAi