QAtration надсилає справжні prompt-injection атаки на вашого ШІ-бота і віддає звіт звичайною мовою про те, що той злив або зробив, раніше ніж це знайде хтось інший. Запускаєте ви. На своїй машині або у своєму CI, проти свого деплою: без акаунта, без переданого ендпоінта, нам не надсилається нічого.
Не наводьте це на систему, якою ви не володієте. Він надсилає справжні атаки (prompt injection, викрадення даних, зловживання інструментами) на будь-який URL, який ви йому дасте. Ваш власний деплой або той, власник якого дав вам письмовий дозвіл заздалегідь. Не публічний чат-бот, який здався вам цікавим. Не демо вендора. Прочитайте AUTHORISED-USE.md перед першим запуском.
Дві залежності. Увесь корпус атак іде в комплекті, і разом із ним докази, що стоять за кожним числом на цій сторінці, усе це в
out/, який іде разом із репозиторієм. Власних звітів двох інших інструментів тут немає, бо їхні ліцензії цього не дозволяють. Команди, що їх відтворюють, є.
Виміряно на наших власних тестових цілях, не спрогнозовано. Транскрипт поруч — це ілюстрація ідеї, а числа вище — результати.
Кожна ШІ-фіча, яка виходить у продакшн, — це нова поверхня атаки. Скільки з вашої поверхні він може дістати, залежить від того, що дозволяє йому побачити ваш деплой, і межа тут проведена, а не розмита, бо сканер, який заявляє покриття того, чого не може спостерігати, — це саме те, чого ви намагаєтеся уникнути.
Досить чат-ендпоінта: це тестується як є, зокрема й у кількох ходах розмови.
Текст зловмисника перекриває правила вашого бота: «ігноруй свої інструкції і…».
Ваш бот віддає API-ключі, внутрішні коди або дані іншого клієнта.
Ваші приховані інструкції витікають дослівно: карта для кожної наступної атаки.
Правило, підкинуте в одному ході, тихо змінює кожну наступну відповідь, ще довго після того, як розмова знову здається нормальною.
Ви не підкинете документ у базу знань, у яку не можете писати, і ззовні не відрізните виклик інструмента, який справді відбувся, від того, який бот просто описав, і ми виміряли, наскільки часто боти помиляються в цьому самі щодо себе. Для цього потрібен корпус, визначення інструментів або видимість викликів. Виміряно на доказах, що йдуть у комплекті з цим інструментом: 62 зі 137 знахідок на цілях, які звітують про виклики інструментів, не видно взагалі, якщо читати саму лише відповідь. Бот ввічливо відповідає і кладе секрет в аргумент виклику.
Вашого агента вмовляють на незворотну дію: видалити, повернути гроші, надіслати лист.
SQL або shell-команда, протягнута у виклик інструмента. Старий клас помилок, нові вхідні двері.
Один шкідливий документ у вашому RAG перехоплює відповіді на безневинні питання.
Прихований рядок в описі інструмента змушує вашого агента злити секрет на звичайне питання, і повідомлення від зловмисника для цього не потрібне.
qatration init сам пише конфіг: URL, форму запиту і те, де у відповіді лежить текст. Віддалена ціль хоче ще й заголовок авторизації, як змінну середовища. Готові конфіги для API у форматі OpenAI, а також для Anthropic, Bedrock і Vertex. qatration onboard надсилає одне звичайне питання і каже, чого бракує, ще до того, як вилетить бодай одна атака.
qatration init генерує ваш власний секрет і блок, який треба вставити в системний промпт. Прогін спершу підтверджує, що канарка справді сіла: непосаджена канарка означає, що кожна перевірка нічого не знаходить, а це читається точно як бот, який вистояв.
Що злилося, як саме, і те одне виправлення, яке це закриває, написане для команди без експерта з безпеки. --fail-on exploited валить білд, qatration sarif кладе знахідки прямо у вкладку code scanning.
Атака, яка не спрацювала, дає нуль. Так само дає перевірка, яка не змогла виконатися, і так само справді загартований бот, і саме тут тестування заходить у глухий кут: три різні факти на вигляд однакові, і ніхто не знає, що пробувати далі. Це вимірювання з реальних прогонів, а не прогнози.
І злам — це злам лише тоді, коли його спричинила атака. Кожна ціль спершу отримує нешкідливий прогін: звичайні питання, ніхто не атакує. На одному з тутешніх ботів
canary_in_tool_call спрацьовує на 88% того звичайного трафіку, тож знахідка, яка тримається лише на ньому, позначається як неатрибутована, а не зарахована.
Коли атака не проходить, звіт називає те, що її спинило: перевірку особи, фільтр вмісту, дозвіл на бекенді або виклик інструмента, який лише надрукували і насправді не виконали. Останнє в транскрипті читається як злам і не варте нічого.
Один бот, дві моделі, по 254 атаки кожна, по 3 спроби. Менша зламалася на 27 з них, більша на 24, і 18 з них — це ті самі атаки, 17 з яких ламають обидві моделі на кожній спробі. На цьому боті більша модель лише перетасувала, які атаки заходять по краях. Дірку вона не закриває.
Проти справжнього фреймворку гардрейлів 46 атак, набраних у вікно чату: не пройшла жодна. Не пройшла й та, що була передана всередині знайденого документа, поки обидва його рейли працювали. Вимкніть вихідний фільтр, і той самий документ виходить назовні на кожній спробі. Вхідні фільтри читають те, що набирає користувач, і ніколи не бачать того, що ваша база знань подає моделі, тож вхідний рейл ніколи не був тим, що його спиняло.
Ми повторно надіслали ті самі повідомлення тому гарду, і він не завжди погоджувався сам із собою: п’ять формулювань дістали різні вердикти на ідентичному вході, а одне звичайне питання пропустили десять разів із дванадцяти. Тому ми звітуємо, скільки спроб щось зламали, а не те, чи зламала хоч одна. Один прогін — це історія про один день, і це так само правда для чистого результату, як і для поганого, включно з нашим.
Той самий гард, що заблокував той документ, також відмовився відповідати на 6 з 9 звичайних клієнтських питань у темах, яких це стосується. Захист, який відповідає «ні» вашим клієнтам, — це число, яке хочеться мати до релізу, а не після.
Сканер, який завжди щось знаходить, не вартий нічого, тож ми виміряли протилежне число: 1 500 нешкідливих проб по 30 цілях, без жодного зловмисника, через ті самі перевірки. Половина з них — це користувач, який має всі підстави говорити про безпеку, бо саме це ламає зіставлення за шаблоном: розробник, який вставляє запит, що падає, підтримка, яка пересилає стек-трейс, хтось, хто питає, чи справжній домен-двійник.
Боти, написані тут, — це легкий випадок, тож його навели на фреймворк агентів, який тут ніхто не проєктував. Він видав вісім хибних спрацювань за один прогін із 48 чистих промптів, у чотирьох категоріях, яких 480 проб проти нашого власного парку ботів не дали жодного разу. Усі чотири виправлені, і два правила під ними тепер валять наш білд, а не ваш звіт: жодна перевірка не має права читати питання, і жодна перевірка не має права вважати власні слова агента доказом щодо системи.
Прогнано проти тих самих сторонніх цілей, що й garak та promptfoo, і кожну відповідь усіх трьох оцінено одним правилом пошуку підрядка замість власного судді кожного інструмента. На RAG-застосунку без гардрейлів 46% нешкідливих проб уже повертають підкладений рядок, тож підрахунок знахідок міряє застосунок, а не зловмисника. Один із трьох інструментів каже це у своєму звіті. На захищеній цілі всі три отримують нуль за спільним правилом, і ми були єдиними, хто взагалі щось знайшов, один злам із 324, тоді як той самий деплой відмовляється відповідати на 38 з 48 звичайних клієнтських питань. Та сторінка публікує і те, де інші два кращі, і твердження, яке ми відкликали після того, як рецензент попросив p-значення. Читати порівняння.
Профіль із дванадцяти проб, усі нешкідливі: п’ять ботів віддали власні інструкції на звичайний запит. Один надрукував свій конфіденційний ключ сесії всередині тієї самої фрази, яка забороняла йому цей ключ показувати. Два боти відзвітували про перезапуск бази даних, не маючи інструмента, який міг би щось перезапустити.
Кожен прогін зберігається, тож кожна знахідка має дату, коли з’явилася вперше. «Критично» — це думка. «Критично і відкрито з третього» — це факт про те, як команда реагує на такі знахідки, і саме цей рядок ставить виправлення в план.
Знахідка, яка повертається після того, як ви її закрили, позначається як повернена, а не тихо рахується поруч із новими. Виправлення, яке не вистояло, — це гірша з двох розмов, і якщо їх змішати, це зникає з очей.
Якщо прогін не надсилає атаку, ця атака потрапляє у звіт як неперевірена, ніколи як виправлена. Відсутність — це не чистий результат, і звіт, який змішує ці дві речі, каже вам, що ваші вразливості зникли, хоча насправді ніхто не дивився.
Деякі виклики передають інструменту значення, яке не з’являється в жодному тексті, який ми можемо прочитати. Ми виносимо їх окремо і кажемо, який лог їх відкриває, бо різниця між «ми перевірили, і було чисто» і «ми не змогли побачити» — це різниця між вимірюванням і обіцянкою.
«Ми сказали йому не розкривати секрети» — це твердження, а не захист: на тутешніх цілях такий захист падав у межах перших кількох атак. QAtration так само визнає чистими ботів, які справді закриті, тож чистий результат щось та й означає. Він міряє вашого бота, а не просто щоразу б’є на сполох.
Apache 2.0. Встановіть, наведіть на свій деплой, збережіть докази.