ADR 소개
회사 노트북에서 Claude Code, Cursor, Codex CLI 같은 코딩 에이전트가 동작하기 시작하면 보안팀의 모니터링이 힘들어지기 시작합니다. 기존 엔드포인트 탐지 및 대응(EDR, Endpoint Detection and Response) 도구는 어떤 파일이 쓰였고 어떤 프로세스가 떴는지는 알려주지만, 그 파일을 쓰라고 지시한 프롬프트가 무엇이었는지, 에이전트가 어떤 도구를 왜 호출했는지는 남기지 않습니다. 이러한 문제는 프롬프트 인젝션(Prompt Injection)처럼 의도에 따라 악성 여부가 달라지는 공격에서는 더 판단하기가 어려워집니다. 파일을 한 줄 썼다는 로그만 보면 정상 업무와 자격 증명 유출이 똑같이 생겼기 때문입니다.
이번에 소개할 ADR(Agentic AI Detection and Response)은 Uber가 이 간극을 메우려고 만들어 사내에 배포하고, 그 일부를 오픈소스로 공개한 에이전트 보안 시스템입니다. 접근은 크게 두 가지로 나뉩니다: 하나는 코딩 에이전트가 로컬에 남기는 로그를 직접 읽어 프롬프트, 도구 호출, 실행 이력을 하나의 스키마로 정규화하는 것이고, 다른 하나는 그렇게 모은 세션을 1차적으로 상대적으로 저렴한 분류(classification) 및 2차로 상대적으로 비싼 추론(reasoning)으로 나눠 검사해 비용을 감당 가능한 수준으로 낮추는 것입니다.
ADR을 설명한 Uber의 논문은 MLSys 2026에 채택됐고, 저자들은 ADR 시스템이 Uber 프로덕션에서 10개월 넘게 실행되며 7,200대 이상의 호스트와 하루 1만 건 이상의 에이전트 세션을 처리했다고 밝히고 있습니다. 다만 공개된 것은 시스템 전체가 아니라 센서, 벤치마크, 탐지기 세 부분이며 나머지 구성 요소는 저장소에 들어 있지 않습니다. 이번 글에서는 공개된 범위가 정확히 무엇인지, 논문이 보고한 수치가 어떤 조건에서 나온 것인지, 어떤 팀이 지금 바로 써볼 수 있는지를 정리하려고 합니다.
ADR을 구성하는 다섯 가지와 실제로 공개된 세 가지
ADR은 다섯 가지 기능으로 나뉩니다. 사내 단말에 어떤 AI 도구가 깔려 있는지 목록화하는 Discovery, 에이전트가 무엇을 하고 있는지 수집하는 Observability, 방어 성능을 측정하는 Benchmark, 위험 행동을 찾아내는 Detection, 위험한 동작을 실행 전에 막는 Prevention 입니다. 이렇게 5가지 기능들 중 저장소에 들어 있는 것은 가운데 세 가지에 해당하는 ADR Sensor, ADR-Bench, ADR Detector 뿐이고, ADR 개발팀은 Discovery와 Prevention을 아직 공개하지 않았다고 README에 밝혀 두었습니다.
논문에 등장하지만 저장소에 없는 것이 하나 더 있습니다. 배포 전에 공격 시나리오를 자동으로 만들어 탐지기를 단련시키는 오프라인 엔진 ADR Explorer입니다. 저장소의 docs/REPRODUCIBILITY.md는 이 엔진과 프로덕션 배포 결과(논문 §6)가 저장소에 포함되지 않는다고 표로 정리해 두었습니다. 논문 그림 3이 보여주는 전체 구조에서 어느 블록이 손에 들어오고 어느 블록이 그림으로만 남는지를 먼저 확인해 두는 편이 좋습니다:
ADR Sensor: 코딩 에이전트 7종의 로그를 하나의 스키마로
ADR Sensor는 로컬에 쌓인 에이전트 로그를 읽어 공통 형식으로 바꾸는 파이썬 라이브러리입니다. 에이전트마다 로그를 남기는 방식이 제각각이라(Claude Code는 ~/.claude/projects/ 아래 JSONL(JSON Lines), Cursor는 state.vscdb SQLite, Cline은 JSON 태스크 파일, Warp와 opencode는 각자의 SQLite 데이터베이스), 이 정규화가 곧 도구의 값어치입니다. 지원 대상은 Claude Code, Cursor, Cline, Claude Desktop, Codex CLI, Warp, opencode 일곱 가지이고, 각각 macOS, Linux, Windows 중 해당 에이전트가 도는 운영체제에서만 수집이 시도됩니다.
정규화 결과는 AgentEvent 라는 단일 스키마이고, 세션 식별자, 시각, 대화 이력, 사용한 도구, 모델 정보를 담습니다. OpenCode처럼 도구 이름을 <Server>_<Tool> 로 이어 붙이는 에이전트에서는 내장 도구가 아니면서 밑줄이 들어간 이름을 MCP 도구로 판정해 server_name 을 채우는 식으로, 에이전트별 관행까지 흡수합니다. Claude Desktop의 경우 사람이 직접 대화한 세션과 백그라운드로 위임된 실행을 구분해 후자에 is_dispatch: true 플래그를 붙이는데, 사람이 지켜보지 않은 실행에 다른 탐지 규칙을 걸 수 있게 하려는 설계입니다.
설치는 PyPI 패키지 한 줄로 끝납니다:
pip install adr-sensor
명령줄에서는 수집 대상을 고르고 출력 형식을 정하는 정도만 지정하면 됩니다:
# 지원하는 모든 에이전트에서 수집
adr-sensor
# 특정 에이전트만 수집
adr-sensor --source claude
adr-sensor --source cursor
# JSONL로 내보내기, 최근 2주가 아닌 전체 이력 포함
adr-sensor --output-format jsonl --all-history
파이썬에서 직접 다룰 때는 AgentObserver 가 진입점입니다:
from adr_sensor import AgentObserver
observer = AgentObserver()
events, configs = observer.ingest_all()
for event in events:
print(f"Source: {event.source}, Session: {event.session_id}")
for msg in event.chat_history:
for tool in msg.tools or []:
print(f" Tool: {tool.tool_name} ({tool.tool_type})")
ADR Detector의 2단 구조가 해결하는 비용 문제
모든 에이전트 이벤트를 대형 언어 모델(LLM)에 한 번씩 물어보는 방식은 하루 1만 세션 규모에서 감당이 되지 않습니다. ADR Detector는 이 문제를 계층으로 나눠 풉니다. 1차는 재현율을 우선한 값싼 분류 단계로 gpt-4o 를 쓰고, 여기서 걸러진 의심 세션만 2차로 넘어가 claude-sonnet-4-6 기반 추론 에이전트가 사내 정책, 소스 코드, 위협 인텔리전스를 참조하며 깊게 판단합니다. 저자들은 이 구조가 실제 보안 관제 센터(SOC, Security Operations Center)의 먼저 넓고 얕게 훑고 난 뒤, 깊게 살펴보는 업무 흐름을 그대로 옮긴 것이라고 설명합니다.
2차 판단에 쓰이는 사내 맥락은 MCP 서버 형태로 연결됩니다. 저장소에는 소스 코드 분석, 위협 인텔리전스, 정책 저장소 세 가지 컨텍스트 제공 서버가 들어 있습니다. Uber는 MCP(Model Context Protocol)를 공격 표면인 동시에 방어 도구를 붙이는 통로로 쓰고 있는 셈입니다.
ADR-Bench: 과제 303개와 MCP 서버 133개
ADR-Bench는 탐지기를 평가하기 위한 벤치마크입니다. 저장소에는 과제 303개(정상 261개, 악성 42개)와 MCP 서버 133개 정의가 들어 있고, 서버는 정상 업무 도구 78개, 취약점이 심어진 도구 25개, 기업 환경을 흉내 낸 서버 12개로 나뉩니다. 취약 서버 중 하나(location_harvester)는 weather_forecast_service 라는 다른 이름으로 커뮤니티 서버인 척 등록되어 있는데, 공급망 사칭을 시험하기 위한 장치입니다.
악성 과제 42개가 다루는 위협은 자격 증명 노출, 데이터 유출, 도구가 명시된 업무 범위를 넘어서는 행위, 과도한 사용자 추적, 거래 도구에서의 가격 조작, 에이전트 제어 흐름 탈취, 허위 데이터 생성입니다. 여기에 공개 프롬프트 인젝션 벤치마크인 AgentDojo (
AgentDojo: LLM 에이전트의 프롬프트 인젝션 공격과 방어를 평가하는 동적 실험 플랫폼)를 함께 실행할 수 있게 통합해 두어, 자체 벤치마크와 외부 벤치마크를 같은 파이프라인에서 비교할 수 있습니다.
기존 탐지기와 비교한 ADR-Bench 결과
ADR 논문에서 언급한 ADR-Bench 302개 과제 기준 성능과 비용은 다음과 같습니다:
| 탐지기 | 정밀도 | 재현율 | F1 | 오탐(FP) | 과제당 비용 | 지연 시간 |
|---|---|---|---|---|---|---|
| ADR | 1.000 | 0.667 | 0.800 | 0 | $0.024 | 18.5초 |
| ALRPHFS | 0.333 | 0.405 | 0.366 | 34 | $0.001 | 9.2초 |
| GuardAgent | 0.231 | 0.214 | 0.222 | 30 | $0.012 | 9.4초 |
| LlamaFirewall | 0.167 | 0.190 | 0.178 | 40 | $0.459 | 93.8초 |
ADR은 악성 과제 42개 중 28개를 잡아 재현율 0.667에 그쳤지만, 정상 과제 260개에서 오탐이 한 건도 없었습니다. 비교 대상 세 가지가 30~40건씩 오탐을 낸 것과 대비되는 부분입니다. 저자들은 이 균형이 의도된 선택이라고 밝히면서, 오탐 한 건마다 비싼 사고 대응이 따라붙는 기업 환경에서는 정밀도를 우선해야 배포가 가능하다고 설명합니다. 공개 벤치마크인 AgentDojo 93개 과제에서는 반대로 모든 공격을 탐지하면서 오경보가 3건이었습니다.
위협 종류별로 나눠 보면 탐지율의 편차가 큽니다:
위 그래프를 통해 ADR이 보안 통제 우회와 운영 방해에서는 100%를 기록한 반면 권한 남용에서는 20%에 그쳤다는 점을 알아볼 수 있습니다. 권한 남용은 네 탐지기 모두 20~60% 사이에 머물러 있고, GuardAgent가 60%로 이 항목만은 ADR보다 높습니다.
한 가지 더 짚어 둘 것은 표의 ALRPHFS와 GuardAgent 행이 저장소에서 재현되지 않는다는 점입니다. 두 베이스라인 코드는 라이선스 문제로 저장소에서 제거됐고, 표의 값은 논문이 공개한 수치를 옮긴 것입니다. 직접 돌려 볼 수 있는 비교 대상은 ADR과 LlamaFirewall 두 가지입니다.
Uber 프로덕션에서 10개월 동안 확인한 것
논문에서는 Uber의 사내 맥북 단말에 배포한 결과를 정리하여 공개하였습니다. 채택 규모는 7,200대 이상의 호스트로 늘었고, 하루 1만 건 이상의 에이전트 세션이 처리됐습니다. 가장 자주 걸린 것은 자격 증명 노출로, 26개 범주에 걸쳐 수백 건이 사내망 밖으로 무심코 공유된 상태였습니다. 이 결과를 근거로 실행 전 차단 계층을 앞단에 붙였고, 수십만 건의 세션에서 나온 고유 자격 증명 212개 중 206개를 정밀도 97.2%로 잡아냈습니다.
같은 절에서 저자들은 오탐으로 분류된 사례의 성격도 밝혀 둡니다. 사람이 검토한 알림 중 참 양성이 34%, 악성은 아니지만 참인 경우가 17%, 오탐이 49%였는데, 후자 대부분은 여러 파일에 걸친 대형 코드베이스 분석처럼 맥락이 복잡한 세션이었습니다. 악성이 아닌 참 양성은 주로 사내 공격 보안팀과 모의 침투 활동에서 나왔고, 저자들은 사용자 역할과 맥락상 의도를 모델링할 필요가 있다는 신호로 읽고 있습니다.
한편 벤치마크와 프로덕션의 분포가 다르다는 점도 함께 적혀 있습니다. ADR-Bench는 기업에서 일어날 만한 공격 전술을 넓게 덮도록 설계된 것이지 실제 사고 발생 빈도를 반영한 것이 아니며, 실제 환경에서는 비밀, 자격 증명, 데이터 유출이 상대적으로 자주 일어나고 나머지 범주는 매우 드물게 나타납니다.
ADR이 맞는 팀과 맞지 않는 팀
사내에 코딩 에이전트가 이미 여러 종류 퍼져 있고 "누가 무엇을 시켰는지" 부터 남겨야 하는 단계라면 ADR Sensor 하나만으로도 값어치가 있습니다. pip install 로 끝나고, 출력이 JSON/JSONL이라 기존 보안 정보 및 이벤트 관리(SIEM, Security Information and Event Management) 파이프라인에 넣기 쉬우며, 지원하는 일곱 가지 에이전트가 현재 실무에서 쓰이는 대부분을 덮습니다. 에이전트 보안 탐지기를 연구하는 쪽에도 맞습니다. ADR-Bench는 MCP 서버 133개와 공격 기법 17종을 갖춘 재현 가능한 평가 환경이고, 논문 그림을 다시 그리는 절차까지 문서로 남아 있습니다.
반대로 "Uber가 쓰는 그 시스템"을 그대로 들여오려는 기대라면 맞지 않습니다. 위험한 동작을 실행 전에 막는 Prevention과 단말 인벤토리를 만드는 Discovery가 빠져 있어, 공개된 범위만으로는 탐지에서 멈추고 차단까지 가지 않습니다. 탐지기를 기본 설정으로 실행하려면 Anthropic과 OpenAI API 키가 둘 다 필요하고 Claude CLI도 설치해야 하므로, 키 없이 동작을 확인하려면 --detector llamafirewall 로 축소 실행해야 합니다. 그리고 Detection/ 은 ADR 개발팀이 연구용 산출물이며 프로덕션 배포용이 아니라고 명시한 코드입니다. 벤치마크 재현을 위해 의존성이 특정 버전으로 고정되어 있어 알려진 취약점(CVE)이 남아 있고, 합성 자격 증명과 프롬프트 인젝션 페이로드, 취약점이 심어진 MCP 서버가 함께 들어 있으므로 컨테이너나 가상 머신 같은 격리 환경에서만 실행해야 합니다.
ADR 설치 및 사용법
관측용 센서와 벤치마크와 탐지기는 설치 경로가 다릅니다. 센서는 위에서 본 pip install adr-sensor 로 끝나고, 벤치마크와 탐지기는 저장소를 받아 uv로 의존성을 맞춥니다:
git clone https://github.com/uber/ADR
cd ADR/Detection
uv sync
export ANTHROPIC_API_KEY="..." OPENAI_API_KEY="..."
벤치마크 실행과 탐지 분석은 두 단계로 나뉩니다:
# 1단계: ADR-Bench 303개 과제 실행 (--tasks 로 일부만 지정 가능)
uv run python main_benchmark.py
# 공개 프롬프트 인젝션 벤치마크로 실행
uv run python main_benchmark.py --benchmark agentdojo
# 2단계: 실행 결과를 탐지기로 분석 (기본 탐지기는 adr)
uv run python main_detector.py --results-dir benchmark/adr_bench_20251017_151604
uv run python main_detector.py --detector llamafirewall --results-dir benchmark/adr_bench_20251017_151604
논문 그림을 다시 그리려면 실제 에이전트 실행을 건너뛰고 미리 저장된 대화 기록을 펼친 뒤 탐지기와 그래프 스크립트를 실행하면 됩니다. 전체 절차는 저장소의 docs/REPRODUCIBILITY.md에 정리되어 있습니다.
ADR의 라이선스
ADR은 Apache-2.0으로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.
단, Detection/benchmark/agentdojo/ 에 포함된 AgentDojo 코드는 별도의 MIT 라이선스를 따르는 서드파티 구성 요소이므로, 해당 디렉토리를 함께 배포할 계획이라면 두 라이선스의 고지 의무를 각각 확인해야 합니다.
ADR 논문
ADR 프로젝트 GitHub 저장소
더 읽어보기
-
MCP-Scan: MCP Server 및 도구들의 보안 문제를 진단하는 CLI 도구 (feat. Invariant Labs)
-
Anthropic, AI 에이전트 배포를 위한 Zero Trust 보안 프레임워크 eBook 공개 [영문/PDF/36p]
이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. ![]()
이 도구를 직접 설치해 사용해보셨다면, 파이토치 한국 사용자 모임
회원들을 위해 경험이나 팁을 댓글로 남겨주세요! ![]()


