에이전트가 천사라면 거버넌스는 필요 없다: 신뢰된 툴 경계에서의 Out-of-Band 정책 강제(OBPE)
If Agents Were Angels, No Governance Would Be Necessary: Out-of-Band Policy Enforcement at a Trusted Tool Boundary
TL;DR Highlight
에이전트 밖 툴 경계에서 정책을 강제했더니 보안 실패율이 57.6%에서 0.2%로 떨어졌다
Who Should Read
사람 계정 권한을 그대로 에이전트에 줘서 데이터 유출과 프롬프트 인젝션이 걱정인 에이전트 백엔드 개발자
Core Mechanics
- 프롬프트 규칙은 답변만 순하게 만든다
- 프롬프트 6개 규칙으로 최종 답변의 정확한 값 노출은 27.5%에서 3.7%로 줄었다.
- 하지만 모델 컨텍스트에 데이터가 들어간 비율은 55.1%에서 52.1%로 거의 그대로였다.
- 금지된 백엔드 동작도 8.1%에서 5.5%로만 줄었다.
- OBPE는 에이전트 바깥의 툴 경계다
- 에이전트와 백엔드 사이 프록시가 호출 요청과 응답을 모두 중계한다.
- 요청 단계에서 쿼리를 좁히고, 응답 단계에서 레코드·필드를 걸러내거나 값을 가린다.
- 에이전트는 정책을 고르거나 신원을 속일 수 없다고 가정한다.
- 정책은 두 층이고 에이전트 쪽은 줄이기만 한다
- 데이터 소유자 정책이 최대 권한(천장)을 정한다.
- 에이전트별 정책은 그 안에서 권한을 좁히기만 하고 넓힐 수 없다.
- 규칙 매칭 순서가 바뀌어도 결과 정책 계획은 같다고 모델에서 증명했다.
- 허용된 호출도 보류할 수 있다
- 인자 값이나 외부 상태가 비즈니스 규칙에 걸리면 호출을 deny/defer(승인 대기)로 바꾼다.
- 대기 중인 호출은 에이전트가 읽거나 위조할 수 없는 채널에서 처리된다.
- 공개 코드는 hold와 no-dispatch까지만 구현했고 실제 승인 후 실행은 빠져 있다.
Evidence
- 주 비교에서 트레이스 실패율이 크게 감소
- 프롬프트만 쓴 에이전트 57.6%에서 프롬프트+OBPE 0.2%로 줄었다(4개 모델, 3,621 trial).
- 시나리오 클러스터 동일 가중 기준 감소폭은 41.2%p [95% CI 27.7, 54.9]였다.
- safe-useful 완료가 올랐다
- Judge A 기준 22.0%에서 58.9%, Judge B 기준 22.1%에서 54.4%였다.
- 클러스터 가중 쌍체 상승은 각각 21.8%p [9.5, 35.2], 19.1%p [6.9, 32.2]였다.
- 출력 리뷰어 대비 OBPE가 우세
- Sonnet 기준 Haiku 4.5 출력 리뷰어 arm의 트레이스 실패는 58.6%, OBPE는 0.0%였다.
- 리뷰어는 모델 호출 930회를 추가로 썼고 OBPE는 추가 호출이 없었다.
- 레드팀과 연산자 단계별 효과
- 적응형 레드팀 20개 태스크에서 트레이스 실패는 프롬프트만 173/231(74.9%), OBPE 2/227(0.9%)이었다.
- Sonnet에서 레코드 제어만은 46.7% 보호, 패턴 마스킹까지 전부 넣으면 100.0%였다.
How to Apply
- 툴 응답에서 민감 필드를 프록시로 제거하기
- 오늘 쓰는 툴 호출 하나를 골라 응답에서 비밀번호·이메일·내부 메모 필드를 모델에 넘기기 전에 삭제하는 래퍼를 붙여라.
- 프롬프트로 숨기지 말고 코드에서 필드 허용 목록(allowlist)으로 걸러라.
- 에이전트 앞에 읽기/쓰기 허용 목록 두기
- 에이전트가 쓰는 에이전트용 자격 증명 외에 작업별로 허용할 액션·리소스·쿼리 범위를 소유자 정책에 명시하라.
- 에이전트별 정책은 그 범위를 줄이는 용도로만 써라.
- 쿼리에 정책 조건을 AND로 붙이고 결과 수를 제한하기
- 호출자 필터에 정책 필터를 AND로 합치고, 결과 개수 상한은 백엔드와 별개로 받은 후 다시 잘라라.
- 조건을 합칠 수 없으면 호출 전에 거부하라.
- 결제·배포 같은 위험 호출은 승인 대기로 돌리기
- 업무 시간 외 배포나 금액 임계치 초과 호출은 에이전트가 읽을 수 없는 채널로 승인 요청을 보내라.
- 승인은 요청 전체 스냅샷에 묶고 기한이 지나면 거부 처리하라.
Try It
# Claude나 ChatGPT에 붙여넣는 프롬프트 (논문 방법의 간이 버전: 실제 OBPE는 프롬프트가 아닌 프록시 코드로 강제함)
아래는 우리 에이전트가 쓰는 툴의 호출 정의와 응답 예시야.
{{툴 정의와 응답 JSON 예시}}
이 툴 경계에 정책 강제 레이어를 설계한다고 가정하고 다음을 표로 정리해줘.
1. 응답 필드 중 모델 컨텍스트에 절대 들어가면 안 되는 것(제거 대상)
2. 마스킹이 필요한 필드와 마스킹 방식
3. 호출 전에 쿼리에 AND로 붙여야 할 정책 조건과 결과 개수 상한
4. 인자 값이나 상태에 따라 승인 대기(defer)로 돌릴 호출 조건
5. 필터 결과 개수나 이름 규칙으로 값이 추론될 수 있는 경로
이어서 해 볼 것: 1번 필드를 실제 응답에서 제거하는 파이썬 함수를 작성해달라고 요청해봐.Terminology
관련 논문
같은 시뮬레이션, 다른 근거: 도구 출력을 파일로 넘기면 LLM 에이전트 정확도가 어디서 깎이나
긴 툴 출력을 파일로 넘기자 GPT-5.1은 정확도 11.3%p 하락, 정식 출력 지정하니 회복
가짜 뉴스가 진짜 폭락을: LLM 트레이딩 에이전트 대상 정보 주입 공격
가짜 헤드라인 한 줄로 LLM 트레이딩 에이전트 62%를 조종했다(프롬프트 주입은 14%)
Harness Engineering 101: LLM은 뇌, harness는 몸
에이전트는 JSON 배열을 관리하는 루프이고, 16개 챕터로 직접 만들어 본다
Harness²: 에이전트 harness를 스스로 고쳐 쓰는 재귀 최적화 프레임워크
모델은 고정하고 harness를 재귀로 고쳤더니 벤치마크 점수가 최대 11.8%p 올랐다
해고된 Savannah 경찰관, ICE 요원 남편에게 Flock 계정 공유
경찰관이 Flock 계정을 남편(ICE 요원)에게 공유했고, 감사에서 983건 검색이 드러나 해고됐다
tmux와 Claude Code: 세션, send-keys, 그리고 한계선
tmux로 Claude Code 여러 개를 돌리면 편하지만 에이전트 4개쯤에서 한계가 온다
Hybrid Reasoning Agents: 잠재 공간에서 생각하고 텍스트로 행동하는 LLM 에이전트
잠재 공간 추론과 텍스트 도구 호출을 섞었더니 성능 10.4%↑, 토큰 최대 54.7%↓
Original Abstract (Expand)
Give an agent a human's credential and it inherits the person's reach without the judgment that limits its use. It can sweep every reachable record into model context, where hidden instructions steer its next call, and every request stays credential-valid while the agent exceeds its job or absorbs a secret. Prompts are a brittle guardrail: one fallible reasoner interprets the task and enforces its limits. We present Out-of-Band Policy Enforcement (OBPE), a trusted boundary outside agent reasoning. It authorizes the typed operation and resource, narrows the query before the backend call, then filters records and fields or masks values in the response. Semantic gating can deny or hold an authorized call on argument values or external state. A data policy owner sets the maximum grant; agent policy can only narrow it. We prove, under stated conditions, that the policy plan is order-independent and agent policy cannot widen the ceiling. Field removal covers one execution; masking and history rules claim less. We release an HTTP proxy prototype simplified from our production system, with conformance tests tying its typed Cedar policy core to the model. Against Jira and ServiceNow mocks, our benchmark compares prompted agents with and without OBPE on four models, including 20 adaptive red-team tasks. A trace failure means protected data entered agent context, an exact value appeared in the answer, or a forbidden effect completed. In 3,621 trials it fell from 57.6% to 0.2%, a cluster-weighted reduction of 41.2 points [95% CI: 27.7, 54.9]; fulfillment fell from 79.1% to 60.9%, while paired safe-useful completion rose 21.8 points [9.5, 35.2]. Some answers reconstructed a value that never entered context or used filtered row counts as an oracle: shaping one execution is not noninterference. Write controls, durable approval, and temporal and aggregate policies lie outside this evaluation.