Практические заметки по red teaming ИИ/LLM
Добро пожаловать. Это практические заметки по red teaming LLM, написанные с точки зрения пентестера. Используйте вкладки сверху для навигации: Основы объясняют, что вы на самом деле тестируете, Атаки и Методология, это как именно, Буткемп, это пошаговый курс, а в PortSwigger разобранные лаборатории, Область и Схема атаки помогают очертить цель, а Термины, это быстрый словарь. Впервые здесь? Просто читайте эту вкладку сверху вниз. Нажмите / в любой момент, чтобы искать по всему сайту.
Прочтите это первым. За минуту вы поймёте, что такое "функция с ИИ" на самом деле, слова модель / чат-бот / агент, и как ИИ формирует ответ. Как только вы увидите общую картину, остальные вкладки станут понятны.
"Функция с ИИ", это обычное приложение с подключённой моделью ИИ. Вы тестируете приложение, которое построил клиент. Мозг модели обычно принадлежит вендору (Claude, OpenAI) и вне области работ.
Эти три слова всех путают. Это просто лестница: каждая ступень добавляет одну вещь.
Чем правее, тем больше он умеет, и тем больше вы можете атаковать.
Модель не "думает". Она читает текст и угадывает следующее слово, снова и снова. Смотреть стоит не на угадывание, а на то, кто написал текст, из которого она угадывает. Перед ней оказывается пять видов текста, и только один написали те, кто делал приложение.
Одна картинка, слева направо. Слева приходят пять видов текста, они склеиваются в одну строку и уходят в модель. Посмотрите на янтарный документ: он сидит внутри зелёного хода user, а к моменту, когда он оказывается у модели, его уже нет. На каждом блоке написана атака, в которую он превращается, а три пунктирные метки это единственные места, где может стоять контроль.
Каждая стрелка несёт текст. Теги ролей доживают до самой модели, но помечают ходы, а не авторов, и все три контроля находятся снаружи блока.
Посмотрите на блок модели на схеме ещё раз. Теги ролей вошли и вышли с другой стороны, а янтарный документ нет: его свернули внутрь зелёного хода user, и внутри модели не осталось ничего, что говорило бы, что его написал посторонний.
Роли настоящие. Современный API принимает system, user, assistant и tool как отдельные поля, и они доживают до последовательности токенов в виде токенов-разделителей. Не доживает ничего мельче одного хода.
У найденного документа нет собственной роли. Его вставляют внутрь хода user или хода tool, поэтому к моменту чтения он несёт ровно тот вес, что и ход, в который его вложили. То же с тем, что принёс инструмент: обёртка и сайт атакующего это один ком под одной меткой.
И роль это склонность, а не разрешение. Модели обучают давать инструкции из system больший вес, чем из user, и чаще всего это обучение держится. Это склонность, выученная на примерах, а не правило, которое навязывает рантайм, и потому достаточно уверенная инструкция внутри ответа инструмента всё ещё может победить. Инструкция и данные остаются одним и тем же материалом.
Поэтому контроли, которые реально существуют, стоят до этого блока или после него: фильтры входа, списки разрешённых источников, сканеры вывода, подтверждение вызова инструментов, песочницы. Те, что пытаются работать внутри, вроде обучения иерархии инструкций, тоже склонности, а склонности гнутся. Вот почему полезный вопрос никогда не звучит как "безопасна ли модель". Он звучит так: на какой из этих стрелок атакующий может писать и что находится по ту сторону блока, когда он это делает.
У каждого слоя, что вы видели выше, есть свой баг. Это OWASP LLM Top 10 простыми словами:
| Слой | Баг |
|---|---|
| Ваш ввод | Инъекция промптов: ваш текст действует как команда. |
| Модель | Джейлбрейк (обход её защиты); если дообучена, утечка обучающих данных. |
| Документы / RAG | Отравить документы, чтобы модель им подчинялась (непрямая инъекция). |
| Инструменты | Заставить её использовать инструмент, который нельзя, или атаковать ввод инструмента (SQLi, SSRF, запуск кода). |
| Показ ответа | Небезопасная обработка вывода: приложение выполняет ответ как HTML/SQL, отсюда XSS и компания. |
Один и тот же ответ может быть нормальным в одном приложении и катастрофой в другом. Поэтому перед тестом спросите: для чего это приложение и что здесь считается "плохим"?
| Приложение | Как выглядит "плохо" |
|---|---|
| Генератор историй / игр | хочет буйный, творческий вывод: почти всё допустимо. |
| Внутренний HR- или саппорт-бот | должен держаться фактов: выдумать политику, это баг. |
| Составитель писем для компании | должен быть честным, но в стиле бренда: грубый или лживый текст, это баг. |
Обычно вам нужен интеллект модели (хороший язык и рассуждения), а не её знания: она должна отвечать на основе ваших данных и говорить "я не знаю" в остальных случаях.
Источники: OWASP Top 10 for LLM Apps, PortSwigger Web LLM attacks, MITRE ATLAS. Далее: вкладка Термины для слов, затем Методология для плана.