
방어 프레임워크로, 라우팅된 출처 정책을 강제하여 도구를 사용하는 LLM 에이전트의 간접 프롬프트 주입을 방지합니다. 결정적 출처 검사와 공격 성공률 및 유틸리티 유지율을 평가하기 위한 벤치마크 하네스를 포함합니다.
본 논문의 소스 코드:
ROPE: Routed Origin Policy Enforcement against Indirect Prompt Injection by 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에 대한 인젝션 최적화는 대체로 효과가 없으며, 이전 시스템 수준 방어를 무력화하는 장기 지평 공격은 우리의 경우 성공률이 0%임을 보여줍니다.
| 경로 | 내용 |
|---|---|
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/ | 장기 지평 벤치마크: AgentLAB의 Task-Injection 공격 및 게시된 공격 추적, 그리고 재생 드라이버. agentlab/README.md 참조. |
runs/ | 네 가지 에이전트 모델 모두에 대한 ROPE 실행 로그(JSON), runs/ablation/(두 가지 고정 정책 암) 및 runs/router/(더 저렴한 라우터, 클램프 및 비클램프), 그리고 보고된 ROPE 수치를 재계산하는 스크립트. |
Python 3.12와 openai, pydantic, jsonschema, pyyaml(네이티브 Gemini 경로의 경우 google-genai 포함). 저장소 루트에서:
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}
}