
Defense framework, обеспечивающий соблюдение политики маршрутизации источника (routed origin policy) для предотвращения непрямой инъекции промптов в LLM-агентов, использующих инструменты, с детерминированными проверками источника и тестовыми стендами для оценки успешности атак и сохранения полезности.
Исходный код нашей статьи:
ROPE: Routed Origin Policy Enforcement against Indirect Prompt Injection авторы: Xinhang Ma, Chaowei Xiao, William Yeoh, Ning Zhang, Yevgeniy Vorobeychik
Непрямая инъекция подсказок (IPI) внедряет инструкции в контент, который читает LLM-агент, использующий инструменты, направляя агента на вредоносные вызовы инструментов. Самые сильные защиты находятся на системном уровне и используют такие методы, как проверка инструментов с учётом условий задачи для предотвращения выполнения вредоносных инструментов, а также контроль информационных потоков для избежания выполнения инструментов с недоверенными параметрами. Однако по мере роста возможностей агентов пользователи делегируют автоматизации всё больше задач. Следовательно, последовательности выполнения инструментов и значения параметров всё чаще определяются во время выполнения и не могут быть надёжно проверены с использованием информации, содержащейся только в пользовательском запросе, без значительной потери полезности. Мы представляем ROPE (Routed Origin Policy Enforcement), который основан на структурном понятии доверия: значение может достичь изменяющего состояние инструмента только в том случае, если оно неопровержимо прослеживается до пользователя, источника, явно названного пользователем, или собственных авторитетных записей пользователя. Принудительное соблюдение тогда представляет собой детерминированную проверку происхождения по аудируемому набору чувствительных параметров инструментов, и единственная зависимость от языковой модели касается исключительно доверенного пользовательского запроса, недоступного атакующему. Наш подход обеспечивает две доказуемые гарантии: 1) на каждом шаге траектории ни одно значение, единственным происхождением которого является контент, доступный для записи атакующему, не достигает защищённого по происхождению параметра, и 2) никакой переформулирование инъекции не меняет решение о допуске. Благодаря обширной экспериментальной оценке мы показываем, что на четырёх моделях агентов в открытых наборах задач агентов ROPE удерживает показатель успешности атак на уровне 1.6–2.6%, сохраняя при этом 82–100% незащищённой чистой полезности, значительно превосходя современные системные защиты по полезности и достигая сопоставимой или лучшей безопасности в сложных динамических рабочих процессах. Кроме того, мы показываем, что оптимизация инъекции против ROPE в значительной степени неэффективна, в то время как долгосрочные атаки, которые преодолевают предыдущие системные защиты, в нашем случае достигают нулевого показателя успешности.
Python 3.12 с openai, pydantic, jsonschema, pyyaml (и google-genai для нативного
пути Gemini). Из корня репозитория:
export PYTHONPATH=$PWD/autodojo/src:$PWD/src
cd runs
python aggregate.py # CU / UA / ASR для каждого набора + общие показатели (оба бенчмарка)
python adaptive_rope.py # статическая vs адаптивная, CU/UA/ASR (атака AutoDojo, оба бенчмарка)
python longhorizon_rope.py # долгосрочная (AgentLAB Task-Injection)
python ablation.py # абляция политики: всегда полностью специфицированная / всегда открытая для действий
python router.py # более дешёвые маршрутизаторы, с зажимом принудительного соблюдения и без
python failures.py # перепись сбоев: каждый остаточный успех атаки + сбои чистых задач
python buckets.py # таблицы по категориям (корзина недостаточной спецификации)
python router_deviation.py # подсчёты ослабления/ужесточения для каждого маршрутизатора относительно аудируемого минимума
Каждый скрипт пересчитывает свою таблицу из журналов и выводит её; ни один не содержит ожидаемых значений.
buckets.py и router_deviation.py требуют установки PYTHONPATH как указано выше (они читают определения
наборов и кэшированные области); остальные читают только прилагаемые JSON-журналы.
runs/<model>/<suite>/user_task_*/, runs/ablation/<policy>/<suite>/user_task_*/ и
runs/router/<router>[-clamp]/<suite>/user_task_*/ содержат по одному JSON на каждую оценённую ячейку: none/ (чистая),
important_instructions/ (статическая атака), autodojo/ (адаптивная атака) и
agentlab_longhorizon/ (долгосрочная поэтапная атака).
Исправления оценки. Три оракула бенчмарка некорректны для защит, блокирующих выполнение.
runs/corrections.py выполняет три пересчёта на основе эффектов — slack IT5,
dailylife IT7, github IT1 — и агрегаторы применяют их; в docstring каждого модуля документирован
артефакт и исправление. CU и UA никогда не изменяются.
# конфигурация основного результата (кэшированный маршрутизатор opus, строгое сопоставление, без зажима):
python -m rope.run_eval --suite github --attack important_instructions
python -m rope.run_eval --suite github --attack none # чистая полезность
python -m rope.run_eval --suite github --defense passthrough # базовый уровень без защиты
# более дешёвые маршрутизаторы из исследования маршрутизаторов, при необходимости с зажимом до аудируемого минимума:
python -m rope.run_eval --suite github --router gemini-3-flash --clamp
# живой маршрутизатор (пересчёт области во время выполнения с любой моделью, совместимой с OpenAI):
python -m rope.run_eval --suite github --router live --router-model openai/gpt-4o-mini --clamp
# адаптивная атака: воспроизведение кэшированных оптимизированных инъекций AutoDojo
AUTODOJO_CACHE=$PWD/autodojo/variant_generation/variants/github/openai/gpt-4o-mini/routed/injections.json \
python -m rope.run_eval --suite github --attack autodojo
# долгосрочная атака: воспроизведение кэшированных следов AgentLAB (см. agentlab/README.md)
python agentlab/run_eval.py --suite banking --user-task user_task_0 --injection-task injection_task_0
Переменные окружения: OPENROUTER_API_KEY (модель агента и живой маршрутизатор; все опубликованные запуски вызывают
модели агентов через OpenRouter),
ROPE_AGENT_MODEL (по умолчанию openai/gpt-4o-mini),
ROPE_PIPELINE_TAG для пометки журналов запусков (должен содержать имя модели AgentDojo, чтобы шаблоны атак разрешались).
Кэшированные маршрутизаторы делают защиту полностью детерминированной и не требующей API на стороне маршрутизации: opus
покрывает все шесть наборов; gemini-3-flash и gpt-oss-20b покрывают наборы AgentDyn (область
исследования маршрутизаторов). Чтобы оценить собственный маршрутизатор, кэшируйте его один раз и используйте как встроенный:
python -m rope.cache_router --router my-router --router-model <llm-id> --suite github
python -m rope.run_eval --router my-router --suite github --attack important_instructions
Этот репозиторий включает или основан на: AgentDojo и AgentDyn (наборы бенчмарков), AutoDojo (адаптивная атака) и AgentLAB (долгосрочный бенчмарк и следы атак Task-Injection). Подробности см. в соответствующих статьях.
Если вы находите эту работу полезной, мы будем признательны за цитирование:
@article{rope,
title={ROPE: Routed Origin Policy Enforcement against Indirect Prompt Injection},
author={Ma, Xinhang and Xiao, Chaowei and Yeoh, William and Zhang, Ning and Vorobeychik, Yevgeniy},
journal={arXiv preprint arXiv:2608.27496},
year={2026}
}
| Путь | Содержимое |
|---|
src/rope/ | Защита: маршрутизатор, область задач, компилятор политик, трекер происхождения, защита времени выполнения. |
src/rope/scopes/_floor/<suite>.json | Аудируемая таблица чувствительных инструментов/параметров для каждого набора (общая для всех маршрутизаторов). |
src/rope/scopes/<router>/<suite>.json | Кэшированные области задач для трёх оценённых маршрутизаторов (opus, gemini-3-flash, gpt-oss-20b) — автономное воспроизведение выходных данных маршрутизаторов из статьи. |
src/common/ | Кэш завершений LLM, используемый маршрутизатором (только вызовы доверенных входных данных). |
autodojo/ | Основной испытательный стенд и адаптивная атака: напрямую поддерживает все шесть оценённых наборов: banking, slack, travel (три из четырёх AgentDojo) и github, shopping, dailylife (из AgentDyn). |
agentlab/ | Долгосрочный бенчмарк: атака Task-Injection от AgentLAB и её опубликованные следы атак, а также драйвер воспроизведения. См. agentlab/README.md. |
runs/ | Журналы запусков ROPE (JSON) для всех четырёх моделей агентов, а также runs/ablation/ (два плеча фиксированной политики) и runs/router/ (более дешёвые маршрутизаторы, с зажимом и без), а также скрипты, которые пересчитывают из них опубликованные показатели ROPE. |