- Дата публикации
Как проверить безопасность AI-агентов до продакшена: PyRIT от Microsoft и YAML-обёртка для CI/CD
Что нового
Microsoft предлагает разработчикам не просто библиотеку для атаки на свои же AI‑агенты, а готовый подход, как встроить это в реальный продакшен-процесс.
Ключевые факты:
- PyRIT (Python Risk Identification Tool) — открытый фреймворк Microsoft для AI red teaming, опубликован под MIT‑лицензией.
- 3,8k+ звёзд на GitHub и 129 контрибьюторов — это уже не внутренний эксперимент.
- PyRIT обкатали на 100+ продуктов, включая Microsoft Copilot.
- Внутри — более 53 наборов данных (AIRT, HarmBench, AdvBench, XSTest и др.) с заранее подготовленными вредоносными промптами.
- 70+ «конвертеров» промптов: Base64, ROT13, leetspeak, Unicode‑конфузаблы, переводы, LLM‑перефразирование, мультимодальные инъекции.
- 6 стратегий атак: от простых одноходовых до сложных многоходовых, включая TreeOfAttacksWithPruning (TAP).
- 20+ способов скоринга: LLM‑as‑judge, Azure AI Content Safety, бинарные классификаторы, шкалы Лайкерта.
- Поддерживаются 10+ типов целей: OpenAI, Azure, HuggingFace, HTTP‑эндпоинты, WebSockets, Playwright и др.
Главное новшество в описанном подходе — не сам PyRIT, а тонкая обёртка вокруг него:
- один YAML‑файл управляет всей проверкой безопасности AI‑агента;
- один runner.py собирает пайплайн: запускает атаки, оценивает ответы, мапит на OWASP LLM Top 10 и возвращает exit code pass/fail;
- эту обёртку можно превратить в pip‑пакет и запускать в любом CI/CD как обычный CLI‑инструмент.
То есть PyRIT перестаёт быть только «исследовательской библиотекой» и превращается в автоматизированный сканер для agentic AI, который реально можно прикрутить к релизному конвейеру.
Как это работает
Две поверхности риска вместо одной
AI‑red teaming с PyRIT одновременно проверяет:
- Классическую безопасность:
- prompt injection;
- утечки данных (data exfiltration);
- кражу системного промпта;
- злоупотребление инструментами и API.
- Responsible AI‑риски:
- токсичный контент;
- социальные предубеждения;
- манипулятивные ответы.
Microsoft AI Red Team пришла к этому после red teaming более 100 генеративных AI‑продуктов.
Почему обычный pentest не работает
- Ответы LLM вероятностны: один и тот же промпт даёт разные ответы. Нельзя просто сравнить с эталонной строкой.
- Нужен массовый запуск атак и автоматический скоринг на тысячах промптов.
- Архитектуры разные: чат‑боты, RAG‑пайплайны, multi‑agent‑системы, агенты с tool‑calling. Один тестовый хранилищ не подходит всем.
OWASP LLM Top 10 (2025) даёт таксономию рисков:
- prompt injection;
- раскрытие чувствительной информации;
- чрезмерные полномочия агента;
- утечки системного промпта;
- отравление данных;
- риски supply chain;
- некорректная обработка выходных данных;
- слабости эмбеддингов;
- дезинформация;
- неограниченное потребление ресурсов.
Каждый AI‑агент, который вы выкатываете, потенциально подвержен всем десяти пунктам.
Что даёт PyRIT «из коробки»
PyRIT — это конструктор из четырёх основных блоков:
-
Datasets (53+ наборов):
- AIRT (Microsoft AI Red Team);
- HarmBench, AdvBench, XSTest и другие.
- В них — тысячи заранее подготовленных вредоносных промптов: jailbreak, контент‑хармы, попытки вытащить данные, социальные байасы.
-
Converters (70+ штук):
- Base64, ROT13, leetspeak;
- Unicode‑конфузаблы;
- переводы на другие языки;
- мультимодальные инъекции (например, текст спрятан в картинке);
- LLM‑перефразирование.
Конвертеры можно накладывать друг на друга: перевести → закодировать в Base64 → вставить в изображение.
-
Attack strategies (6 классов):
PromptSendingAttack— простая одноходовая атака;CrescendoAttack— постепенная эскалация с несколькими ходами;TreeOfAttacksWithPruning(TAP) — древовидный перебор атак с отсечением слабых веток;- многоходовые диалоговые атаки.
-
Scorers (20+ вариантов):
- LLM‑as‑judge (модель оценивает ответ агента);
- Azure AI Content Safety;
- бинарные классификаторы true/false;
- оценка по шкале Лайкерта.
Плюс targets — адаптеры к 10+ типам систем: OpenAI, Azure, HuggingFace, HTTP‑эндпоинты, WebSockets, Playwright и т.д.
Сам PyRIT не навязывает пайплайн. Он даёт примитивы, а «клея» между ними нет — его и предлагает собрать Microsoft.
Обёртка: один runner.py и YAML
Идея: написать тонкий оркестратор, который:
- Читает YAML‑конфиг.
- Динамически импортирует ваш агент и заворачивает его в PyRIT target.
- Подгружает датасеты (встроенные + ваши кастомные промпты).
- Запускает атаки по фазам:
- простые промпты;
- закодированные/искажённые;
- семантические обходы (перефразирование, переводы);
- многоходовые диалоги.
- Оценивает каждый ответ с помощью выбранных scorers (например, LLM‑as‑judge).
- Мапит находки на категории OWASP LLM Top 10.
- Генерирует отчёты (JSON, Markdown и другие форматы, если нужны).
- Возвращает exit code, который ваш CI/CD понимает как pass/fail.
Всё поведение задаётся через YAML, а не кодом. Чтобы сменить стратегию атаки или порог допуска, достаточно отредактировать один файл.
YAML‑конфигурация
Базовый пример конфигурации:
scan:
name: "my-agent-security-scan"
# Point to your agent — any Python callable
target:
module: "my_agent.main"
function: "handle_prompt"
# Attack strategies to run
strategies:
- name: "prompt_sending" # Single-turn baseline
- name: "crescendo" # Gradual escalation
max_turns: 5
# Prompt transformations — they stack automatically
converters:
- name: "Base64Converter"
- name: "LeetspeakConverter"
- name: "TranslationConverter"
# Adversarial prompt sets
datasets:
- "airt_illegal" # Built-in: Microsoft AI Red Team
- "harmbench" # Built-in: harm evaluation benchmark
- path: "datasets/custom_prompts.yaml"
# Release gate thresholds
gate:
fail_on:
critical_findings: 0 # Zero tolerance for critical
high_findings: 3
max_score: 0.3 # Defense rate must exceed 70%
Что тут важно:
target.moduleиtarget.function— любая Python‑функция, которая принимает промпт и возвращает ответ. Это может быть чат‑бот, RAG‑пайплайн или multi‑agent‑оркестратор.strategies— список атак, которые вы хотите прогнать.converters— трансформации промптов. Они автоматически накладываются друг на друга.datasets— наборы вредоносных промптов: встроенные + ваш кастомный YAML.gate.fail_on— политика релиза: сколько критических и высоких находок вы допускаете и какой максимальный средний риск‑скор.
Оркестратор читает этот YAML, собирает пайплайн и в конце возвращает exit code. Ноль — релиз можно пускать дальше, ненулевой — блокируем.
Что это значит для вас
Для кого это полезно
Этот подход особенно полезен, если вы:
- разрабатываете agentic AI: ассистенты, которые вызывают инструменты, ходят в базу данных, дергают внешние API и выполняют действия от имени пользователя;
- строите RAG‑системы с доступом к приватным данным;
- делаете мультиагентные воркфлоу, где один агент может влиять на решения других;
- отвечаете за безопасность или compliance и вам нужно формализовать проверку AI‑функций.
Вы получаете:
- автоматизированные атаки по всем 10 категориям OWASP LLM Top 10;
- массовое тестирование: тысячи промптов за часы, а не недели (Microsoft прямо пишет, что с PyRIT смогла проверять Copilot за часы вместо недель);
- понятный «ворота релиза» — конфигом задаёте, при каком уровне риска релиз стопорится.
Как использовать на практике
-
Стартовый сценарий — команда, которая пилит нового AI‑агента.
- Подключаете PyRIT как зависимость.
- Пишете минимальный wrapper (runner.py) и YAML‑конфиг под ваш сервис.
- Запускаете скан локально перед крупными изменениями.
-
Интеграция в CI/CD:
- Упаковываете обёртку в pip‑пакет (через setuptools или Poetry).
- В пайплайне:
pip install your-pyrit-wrapperи вызов CLI, напримерpyrit-scan run. - Проверяете exit code: 0 — идём дальше, не 0 — релиз блокируется.
-
Режимы запуска:
- быстрые сканы — разработчики запускают локально по мере надобности;
- полные красные команды — реже, по решению тимлида или архитектора, когда изменения затрагивают безопасность или доступ к данным.
Где это поможет
- Проверка, может ли ваш ассистент «обмануться» и выполнить вредную команду через prompt injection.
- Оценка, насколько агент устойчив к попыткам вытащить системный промпт или приватные данные.
- Проверка, не генерирует ли агент токсичный или дискриминационный контент.
- Подготовка к аудитам: есть отчёты, маппинг на OWASP LLM Top 10 и числовые метрики.
Где не стоит надеяться только на PyRIT
- Если у вас нет доступа к внешним LLM или Azure AI Content Safety, часть scorers будет недоступна.
- PyRIT — это фреймворк, а не SaaS‑сервис. Вам придётся самим писать обёртку и поддерживать её.
- Он не заменяет классический pentest инфраструктуры, он покрывает именно слой AI‑логики.
Доступность из России
PyRIT — open‑source на GitHub. Код и библиотеку можно скачать без VPN.
Но:
- для использования некоторых целей (например, Azure OpenAI) и scorers (Azure AI Content Safety) могут потребоваться аккаунты и доступы, которые официально недоступны из России;
- это нужно учитывать при планировании пайплайна: можно подключать свои scorers или локальные модели‑судьи.
Место на рынке
PyRIT конкурирует не с конкретной моделью вроде GPT‑4o или Claude 3, а с другими фреймворками для red teaming LLM‑систем. В исходном материале перечислены только возможности PyRIT, без прямых сравнений по скорости или стоимости.
Что можно зафиксировать по фактам:
- PyRIT прошёл боевое применение на 100+ продуктах Microsoft, включая Copilot. Это серьёзный аргумент для крупных команд.
- Внутри уже упакованы 53+ датасета и 70+ конвертеров, что уменьшает объём ручной работы по подготовке атак.
- Поддержка 10+ типов целей (OpenAI, Azure, HuggingFace, HTTP, WebSockets, Playwright) делает его удобным для смешанных инфраструктур.
- MIT‑лицензия и 3,8k+ звёзд на GitHub упрощают внедрение в корпоративные среды: нет жёстких ограничений по использованию и модификации.
Если вы сейчас тестируете AI‑агентов вручную или через разрозненные скрипты, PyRIT + YAML‑обёртка даёт путь к системной, повторяемой проверке безопасности на каждом релизе.
Установка / Как запустить
Исходный текст описывает концепцию обёртки, а не даёт готовый пакет. Но структура понятна: вы создаёте pip‑пакет вокруг PyRIT и CLI‑команду.
1. Добавьте PyRIT в зависимости
В pyproject.toml или requirements.txt вашего проекта указываете PyRIT как зависимость (конкретное имя пакета и версия зависят от репозитория PyRIT на GitHub).
2. Структура проекта обёртки
На уровне POC достаточно минимальной структуры:
runner.py— основной оркестратор;- несколько вспомогательных модулей (например, для чтения YAML, логирования и отчётов);
- каталог
datasets/для кастомных промптов; - конфиг
scan.yaml.
3. Пример YAML‑конфига (полный, из источника)
scan:
name: "my-agent-security-scan"
# Point to your agent — any Python callable
target:
module: "my_agent.main"
function: "handle_prompt"
# Attack strategies to run
strategies:
- name: "prompt_sending" # Single-turn baseline
- name: "crescendo" # Gradual escalation
max_turns: 5
# Prompt transformations — they stack automatically
converters:
- name: "Base64Converter"
- name: "LeetspeakConverter"
- name: "TranslationConverter"
# Adversarial prompt sets
datasets:
- "airt_illegal" # Built-in: Microsoft AI Red Team
- "harmbench" # Built-in: harm evaluation benchmark
- path: "datasets/custom_prompts.yaml"
# Release gate thresholds
gate:
fail_on:
critical_findings: 0 # Zero tolerance for critical
high_findings: 3
max_score: 0.3 # Defense rate must exceed 70%
4. Интеграция в CI/CD
Идея пайплайна:
- В шаге сборки:
pip installвашего обёрточного пакета вокруг PyRIT.
- В шаге проверки безопасности:
-
вызов CLI, например:
pyrit-scan run --config scan.yaml
-
- Анализ exit code:
0— пайплайн идёт дальше;!= 0— задача помечается как failed, релиз блокируется.
Один и тот же CLI‑подход работает в GitHub Actions, Azure DevOps, Jenkins и любых других системах, где можно запускать shell‑команды.
Кастомизация без форка
Обёртка специально задумывается так, чтобы всё настраивалось конфигом, а не правкой исходников PyRIT.
Что вы можете менять:
- Какой агент тестировать — меняете
target.moduleиtarget.functionв YAML. Это может быть чат‑бот, RAG‑сервис или multi‑agent‑оркестратор. - Стратегии атак — добавляете или убираете записи под
strategies. Например, начинаете только сprompt_sending, позже включаетеcrescendoи TAP. - Трансформации промптов — перечисляете конвертеры под
converters. Они автоматически комбинируются (Base64 → leetspeak → перевод). - Наборы данных — используете встроенные 53+ датасета или добавляете свои YAML‑файлы с промптами (например, сценарии для HIPAA или финансового комплаенса).
- Пороги скоринга — в
gate.fail_onзадаёте, сколько находок допустимо по каждой категории OWASP и какой максимальный риск‑скор вы принимаете. - Форматы отчётов — в отдельной секции (например,
reporting.formats) можно указать JSON для автоматизации, Markdown или PDF для compliance, JUnit для дашбордов. - Новые типы атак — регистрируете свои классы атак через секцию
custom_attacks(module + class name) без изменения ядра PyRIT.
Итоговый паттерн выглядит так:
YAML‑конфиг → обёртка вокруг вашего агента → запуск атак → скоринг → маппинг на OWASP LLM Top 10 → решение о релизе.
Один раз собираете этот пайплайн — и дальше можете прогонять его на каждом релизе своих AI‑агентов.