QAtration posílá skutečné útoky typu prompt injection na tvého AI bota a předá ti srozumitelnou zprávu o tom, co vyzradil nebo udělal, dřív než to najde někdo jiný. Spouštíš to ty. Na svém stroji nebo ve své CI, proti svému vlastnímu nasazení: žádný účet, žádný předávaný endpoint, nám se neposílá nic.
Nemiř tímhle nástrojem na systém, který ti nepatří. Posílá skutečné útoky (prompt injection, odčerpání dat, zneužití nástrojů) na jakoukoli adresu, kterou mu zadáš. Tvoje vlastní nasazení, nebo takové, jehož vlastník ti předem dal písemný souhlas. Ne veřejný chatbot, který ti přišel zajímavý. Ani ukázka nějakého dodavatele. Přečti si AUTHORISED-USE.md před prvním spuštěním.
Dvě závislosti. Celý korpus útoků je součástí balíčku a spolu s ním i důkazy za každým číslem na této stránce, všechny v
out/, který se distribuuje spolu s repozitářem. Vlastní zprávy zbylých dvou nástrojů tu nejsou, protože to jejich licence nedovolují. Příkazy, které je znovu vytvoří, ano.
Změřeno na našich vlastních testovacích cílech, ne odhadnuto. Přepis vedle ilustruje myšlenku, čísla nahoře jsou výsledky.
Každá AI funkce, která jde do provozu, je nová útočná plocha. Kolik z toho tvého dokáže tenhle nástroj zasáhnout, závisí na tom, co mu tvoje nasazení nechá vidět, a hranice se tady rýsuje místo toho, aby se rozmazávala, protože skener, který tvrdí, že pokrývá i to, co nedokáže pozorovat, je přesně to, čemu se snažíš vyhnout.
Stačí chatovací endpoint: tohle se dá testovat tak, jak to je, včetně věcí napříč několika tahy rozhovoru.
Text útočníka přebije pravidla tvého bota: „ignoruj své instrukce a…“.
Tvůj bot vyzradí API klíče, interní kódy nebo data jiného zákazníka.
Tvoje skryté instrukce uniknou doslova: mapa pro každý další útok.
Pravidlo podstrčené v jednom tahu potichu mění každou další odpověď, dlouho poté, co rozhovor zase vypadá normálně.
Nepodstrčíš dokument do znalostní báze, do které nemáš právo zápisu, a zvenčí nerozlišíš volání nástroje, které se opravdu provedlo, od takového, které bot jen popsal, a změřili jsme, že se v tom boti mýlí sami o sobě. K tomu je potřeba korpus, definice nástrojů nebo viditelnost volání. Změřeno na dokladech, které se distribuují s tímto nástrojem: 62 ze 137 zjištění na cílech, které hlásí volání nástrojů, se vůbec neobjeví, když se čte jen odpověď. Bot slušně odpoví a tajemství vloží do argumentu volání.
Tvůj agent se nechá přesvědčit k nevratné akci: smazat, vrátit peníze, poslat e-mail.
SQL nebo příkaz shellu propašovaný do volání nástroje. Stará třída chyb, nové vstupní dveře.
Jediný škodlivý dokument v tvém RAG unese odpovědi na neškodné otázky.
Skrytý řádek v popisu nástroje způsobí, že tvůj agent něco vyzradí na úplně obyčejnou otázku, a žádná zpráva od útočníka k tomu není potřeba.
qatration init ti konfiguraci napíše sám: adresu, tvar požadavku a to, ve kterém poli odpovědi je text bota. Vzdálený cíl chce navíc autentizační hlavičku, jako proměnnou prostředí. Hotové konfigurace pro API ve tvaru OpenAI a pro API Anthropicu, Bedrocku a Vertexu. qatration onboard pošle jednu obyčejnou otázku a řekne ti, co chybí, ještě než vyletí jediný útok.
qatration init vygeneruje tajemství, které patří jen tobě, a blok, který vložíš do systémového promptu. Běh nejdřív potvrdí, že se opravdu usadil: nenasazený kanárek znamená, že žádná kontrola nic nenajde, a to se čte přesně jako bot, který se ubránil.
Co uniklo, jak přesně, a ta jedna oprava, která to zavírá, napsané pro tým bez bezpečnostního experta. --fail-on exploited shodí build. qatration sarif vloží zjištění rovnou do tvé záložky code scanning.
Útok, který neprošel, hlásí nulu. Stejně tak kontrola, která se nemohla spustit, a stejně tak opravdu zocelený bot, a právě tady testování uvázne: tři různé skutečnosti dorazí a vypadají naprosto stejně a nikdo neví, co zkusit dál. Tohle jsou měření ze skutečných běhů, ne odhady.
A průlom je průlomem jen tehdy, když ho způsobil útok. Každý cíl nejdřív projde neškodným během: obyčejné otázky, nikdo neútočí. Na jednom ze zdejších botů
canary_in_tool_call se spouští na 88 % toho běžného provozu, takže zjištění, které se opírá jen o něj, se označí jako nepřiřaditelné, místo aby se započítalo.
Když útok selže, zpráva pojmenuje, co ho zastavilo: ověření identity, obsahový filtr, oprávnění na backendu, nebo volání nástroje, které se jen vypsalo a nikdy se doopravdy neprovedlo. To poslední se v přepisu čte jako průlom a nemá žádnou cenu.
Jeden bot, dva modely, po 254 útocích, po 3 pokusech. Menší praskl na 27 z nich, větší na 24, a 18 z toho jsou tytéž útoky, z nichž 17 láme oba modely při každém jednotlivém pokusu. U tohohle bota větší model jen přemíchal, které útoky projdou na okrajích. Díru nezavře.
Proti skutečnému frameworku guardrailů: 46 útoků napsaných do chatovacího okna, neprošel ani jeden. Neprošel ani jeden pronesený uvnitř dohledaného dokumentu, dokud byly zapnuté obě jeho pojistky. Vypni výstupní filtr a tentýž dokument odejde ven při každém jednotlivém pokusu. Vstupní filtry čtou to, co píše uživatel, a nikdy nevidí to, co modelu podává tvoje znalostní báze, takže vstupní guardrail nikdy nebyl to, co ho zastavovalo.
Poslali jsme tomu guardrailu tytéž zprávy znovu a nebyl vždy zajedno sám se sebou: pět formulací dostalo při naprosto stejném vstupu různé verdikty a jedna obyčejná otázka prošla desetkrát ze dvanácti. Proto hlásíme, kolik pokusů něco zlomilo, a ne jestli to zlomil jeden. Jediný běh je příběh o jednom odpoledni, a to platí pro čistý výsledek stejně jako pro špatný, náš nevyjímaje.
Tentýž guardrail, který zablokoval onen dokument, také odmítl odpovědět na 6 z 9 obyčejných zákaznických otázek k dotčeným tématům. Obrana, která tvým zákazníkům odpovídá „ne“, je číslo, které chceš znát před vydáním, ne po něm.
Skener, který vždycky něco najde, nemá žádnou cenu, a tak jsme změřili opačné číslo: 1 500 neškodných sond na 30 cílech, bez jediného útočníka mezi nimi, přes tytéž kontroly. Polovina z nich jsou uživatelé, kteří mají plné právo mluvit o bezpečnosti, protože právě to láme porovnávání podle vzorů: někdo, kdo vloží dotaz, který padá, pracovník podpory přeposílající stack trace, někdo, kdo se ptá, jestli je matoucně podobná doména pravá.
Boti napsaní tady jsou snadný případ, tak jsme náš nástroj namířili na agentní framework, který tu nikdo nenavrhoval. Vydal osm falešných poplachů v jediném běhu na 48 čistých promptech, a to ve čtyřech kategoriích, které 480 sond proti našim vlastním botům nevyvolalo ani jednou. Všechny čtyři jsou opravené a dvě pravidla pod nimi teď shazují náš build místo tvé zprávy: žádná kontrola nesmí číst otázku a žádná kontrola nesmí brát vlastní slova agenta jako důkaz o stavu systému.
Spuštěno proti týmž cizím cílům jako garak a promptfoo, přičemž každá odpověď všech tří byla hodnocena jediným pravidlem podřetězce místo vlastním rozhodčím každého nástroje. Na RAG aplikaci bez jediného guardrailu 46 % neškodných sond už vrací podstrčený řetězec, takže počítání zjištění měří aplikaci, a ne útočníka. Jeden ze tří nástrojů to ve své zprávě říká. Na chráněném cíli mají podle společného pravidla všechny tři nulu a jediní, kdo vůbec něco našel, jsme byli my, jeden průlom ze 324, zatímco totéž nasazení odmítá odpovědět na 38 ze 48 obyčejných zákaznických otázek. Ta stránka zveřejňuje i to, v čem jsou ostatní dva lepší, a tvrzení, které jsme stáhli poté, co si recenzent vyžádal p-hodnotu. Přečti si srovnání.
Profil ze dvanácti sond, všechny neškodné: pět botů vydalo vlastní instrukce na obyčejnou žádost. Jeden vypsal svůj důvěrný klíč relace uvnitř téže věty, která mu ten klíč zakazovala sdílet. Dva ohlásili restart databáze, přestože neměli nástroj, který by dokázal cokoli restartovat.
Každý běh se uchovává, takže každé zjištění nese datum, kdy se objevilo poprvé. „Kritické“ je názor. „Kritické a otevřené od třetího“ je fakt o tom, jak tým na taková zjištění reaguje, a je to právě ten řádek, který dostane opravu do plánu.
Zjištění, které se vrátí po zavření, se označí jako vrácené a nezapočítá se potichu mezi nová. Oprava, která nevydržela, je horší z těch dvou rozhovorů, a slít je dohromady to schová.
Pokud běh nějaký útok nepošle, ten útok je ve zprávě jako neotestovaný, nikdy jako opravený. Nepřítomnost není čistý výsledek a zpráva, která mezi těmi dvěma smaže rozdíl, ti řekne, že tvoje zranitelnosti zmizely, přitom se nikdo nedíval.
Některá volání předávají nástroji hodnotu, která se neobjeví v žádném textu, který dokážeme přečíst. Ta vypisujeme zvlášť a řekneme ti, který log je otevře, protože rozdíl mezi „zkontrolovali jsme to a bylo to čisté“ a „nemohli jsme to vidět“ je rozdíl mezi měřením a slibem.
„Řekli jsme mu, ať nevyzrazuje tajemství“ je tvrzení, ne obrana: na zdejších cílech padlo to hned při prvních útocích. QAtration stejně tak prohlásí za čisté i boty, kteří jsou opravdu zamčení, takže čistý výsledek něco znamená. Měří tvého bota, místo aby pokaždé jen křičel, že jde vlk.
Apache 2.0. Nainstaluj to, namiř to na své vlastní nasazení, důkazy si nech.