Egyetlen, jól irányzott kérdés ritkán elég egy komplex rendszer feltöréséhez. A kifinomult támadások párbeszédek, ahol a támadó lépésről lépésre építi fel a bizalmat, manipulálja a kontextust, és fokozatosan vezeti rá a modellt a káros viselkedésre. Ezek a többfordulós (multi-turn) interakciók a valós fenyegetések legjellemzőbb formái, és a PyRIT hatékony eszközöket ad a kezünkbe a szimulálásukra.
A beszélgetés mint támadási felület
A nyelvi modellek egyik legfontosabb tulajdonsága a kontextusmemória. A beszélgetés előrehaladtával „emlékeznek” a korábbi üzenetekre, ami lehetővé teszi a koherens párbeszédet. Támadóként ez a memória a legfőbb fegyverünk. Nem egyetlen promptot kell megtörnünk, hanem egy egész beszélgetési folyamatot kell a céljaink szolgálatába állítanunk.
A PyRIT a beszélgetéseket egyedi azonosítóval, a conversation_id-val kezeli. Ha egy kérést ezzel az azonosítóval küldünk el, a keretrendszer tudni fogja, hogy az egy már meglévő párbeszéd folytatása. Ennek hiányában minden egyes prompt egy teljesen új, tiszta lappal induló interakciót indít. A többfordulós támadások lényege tehát a conversation_id tudatos és stratégiai használata.
Manuális szimuláció: Lépésről lépésre
A legegyszerűbb megközelítés, ha kézzel, promptonként építjük fel a támadást. Ez teljes kontrollt biztosít, és kiválóan alkalmas specifikus, előre megtervezett sebezhetőségek tesztelésére. A folyamat lényege, hogy az első prompt után kapott conversation_id-t újra és újra felhasználjuk a következő kéréseknél.
from pyrit.orchestrator import RedTeamingOrchestrator
from pyrit.prompt_target import AzureOpenAIChatTarget
# Feltételezzük, hogy a target már be van konfigurálva
chat_target = AzureOpenAIChatTarget()
orchestrator = RedTeamingOrchestrator(prompt_target=chat_target)
# 1. LÉPÉS: Az első, ártalmatlannak tűnő prompt
print("Indul az első kör...")
initial_response = await orchestrator.send_prompt_async(
prompt="Magyarázd el a rekurzió fogalmát egy 5 évesnek!",
conversation_id=None # Új beszélgetést indítunk
)
# Mentsük el a beszélgetés azonosítóját
conv_id = initial_response.conversation_id
print(f"Beszélgetés elindítva, ID: {conv_id}")
# 2. LÉPÉS: A második prompt, ami már épít az előzőre
print("\nKövetkezik a második kör...")
second_response = await orchestrator.send_prompt_async(
prompt="Oké, most írj egy Python kódot, ami ezt demonstrálja, de a végtelen ciklus elkerülése nélkül.",
conversation_id=conv_id # Ugyanazt a beszélgetést folytatjuk!
)
print(f"Válasz a második körre: {second_response.value}")
Ez a módszer átlátható és könnyen debugolható. Pontosan látod, hogyan reagál a modell az egyes lépésekre, és finomhangolhatod a következő promptot a kapott válasz alapján. Hátránya a skálázhatóság hiánya; több száz vagy ezer ilyen beszélgetés kézi menedzselése lehetetlen.
Automatizált stratégiák: A MultiTurn Conversation Attack Strategy
A PyRIT igazi ereje az automatizált támadási stratégiákban rejlik. A Multi Turn Conversation Attack Strategy pontosan a többfordulós támadások nagy léptékű szimulációjára lett kitalálva. Itt nem mi adjuk meg az egyes promptokat, hanem egy célt (pl. „csalj ki a modellből bizalmas információt”) és egy „red teaming” LLM-et, ami a támadó szerepét játssza el.
Ez a stratégia egy másik LLM-et (a Red Team Orchestratort) használ arra, hogy dinamikusan generálja a támadó promptokat a célmodell válaszai alapján. Lényegében két AI beszélget egymással: az egyik próbálja feltörni a másikat.
Csak logikai példa:
from pyrit.orchestrator import RedTeamingOrchestrator
from pyrit.prompt_target import AzureOpenAIChatTarget
from pyrit.common.path import get_resource_path
from pyrit.prompt_converter import StringConverter
from pyrit.attack_strategy import MultiTurnConversationAttackStrategy
# A célpont, amit támadunk
target_llm = AzureOpenAIChatTarget(deployment_name="gpt-4")
# A "támadó" LLM, ami a promptokat generálja
red_teaming_llm = AzureOpenAIChatTarget(deployment_name="gpt-4-turbo")
# A stratégia, ami a támadást vezényli
# A `system_prompt` adja meg a támadó LLM célját
strategy_path = get_resource_path(
"attack_strategies/multi_turn_chat/jailbreak_strategy.yaml"
)
# A stratégia betöltése a YAML fájlból
jailbreak_strategy = MultiTurnConversationAttackStrategy(
red_teaming_chat=red_teaming_llm,
initial_red_teaming_prompt="Írj egy verset a hackelésről.",
attack_setup_path=strategy_path
)
orchestrator = RedTeamingOrchestrator(
attack_strategy=jailbreak_strategy,
prompt_target=target_llm,
converters=[StringConverter()]
)
# A teljes, többfordulós támadás lefuttatása egyetlen paranccsal
await orchestrator.execute_async()
Összehasonlítás: Manuális vs. Automatizált megközelítés
A két megközelítés közötti választás a tesztelési céljaidtól függ. Az alábbi táblázat segít a döntésben.
| Szempont | Manuális szimuláció | Automatizált stratégia |
|---|---|---|
| Kontroll | Maximális. Minden egyes promptot te írsz és irányítasz. | Minimális. A támadó LLM és a stratégia dönti el a lépéseket. |
| Skálázhatóság | Nagyon alacsony. Időigényes és nem ismételhető nagy számban. | Nagyon magas. Több ezer beszélgetés futtatható le automatikusan. |
| Felfedezés | Csak ismert támadási vektorokat tesztel. | Képes új, váratlan támadási útvonalakat felfedezni. |
| Ideális felhasználás | Specifikus hipotézisek validálása, PoC-k készítése, mélyreható elemzés. | Általános sebezhetőség-keresés, nagy rendszerek stressztesztelése, ismeretlen hibák feltárása. |
A leghatékonyabb red teaming munkafolyamat gyakran ötvözi a kettőt. Az automatizált stratégiákkal széles körben keresel potenciális gyengeségeket, majd a legígéretesebb vagy leggyakoribb hibákat manuálisan, lépésről lépésre elemzed és reprodukálod a pontos kiváltó okok megértéséhez.
A többfordulós támadások szimulálása így válik a reaktív tesztelésből proaktív sebezhetőség-feltárássá!