2026년 7월 중순 이후 AI 개발 도구 보안 흐름에서 반복되는 메시지는 꽤 선명합니다. agent를 sandbox 안에 넣는 것만으로는 부족합니다. agent가 만든 파일, 설정, URL, 브라우저 클릭, tool output, extension message가 다른 시스템으로 넘어가는 순간 새로운 신뢰 경계가 생깁니다. 이 경계를 통과한 산출물은 더 이상 “모델의 답변"이 아닙니다. host 도구나 브라우저 확장, CI runner가 실행할 수 있는 입력입니다.
Pillar Security는 2026년 7월 20일 공개한 “The Week of Sandbox Escapes"에서 Cursor, Codex CLI, Gemini CLI, Antigravity의 sandbox escape와 boundary bypass를 다뤘습니다. 핵심은 agent가 sandbox를 직접 깨지 않아도 된다는 점이었습니다. agent가 허용된 workspace 안에 파일을 쓰고, 나중에 host IDE, Git, Docker, hook, extension이 그 파일을 신뢰하면 경계가 열립니다. Manifold Security는 2026년 7월 14일 Claude for Chrome 확장에 대해, 다른 브라우저 확장이 synthetic click이나 skipPermissions=true 같은 경로로 privileged action을 유도할 수 있다고 보고했습니다. Chrome DevTools MCP changelog도 2026년 7월 3일 1.5.0에서 allow/block list, output path validation, secure PID directory 같은 hardening을 기록했습니다.
서로 다른 사건처럼 보이지만 방향은 같습니다. 개발 도구는 이제 agent, browser, MCP, local daemon, CI가 이어진 실행 표면입니다. 그래서 오늘의 질문은 “agent가 안전한가"가 아니라, agent가 만든 산출물이 실행되기 전 격리·검증되는가입니다. 이 글은 Agent Sandbox Handoff, Agent Resource Provenance Gate, Tool Permission Manifest, Execution Receipt와 이어집니다.
참고 신호:
- Pillar Security, The Week of Sandbox Escapes: https://www.pillar.security/blog/the-week-of-sandbox-escapes
- Manifold Security, ClaudeBleed Reopened: https://www.manifold.security/blog/claude-for-chrome-extension-bypass
- ChromeDevTools MCP changelog: https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/CHANGELOG.md
이 글에서 얻는 것
- agent 산출물을 텍스트 결과가 아니라 실행 가능한 future input으로 보는 이유를 이해합니다.
- sandbox handoff, browser extension click trust, MCP output path validation이 같은 운영 문제로 묶이는 지점을 봅니다.
- artifact quarantine gate를 파일, 브라우저 action, CI 산출물, tool result에 적용하는 기준을 정리합니다.
- quarantine window, risk class, approval, execution receipt를 어떤 숫자와 정책으로 운영할지 가져갑니다.
핵심 개념/이슈
1) agent artifact는 답변이 아니라 다음 실행자의 입력이다
사람이 문서를 작성하면 대부분 읽고 끝납니다. 하지만 agent가 개발 환경에서 만드는 산출물은 다릅니다. .vscode/tasks.json, package.json, Git config, Dockerfile, shell script, browser automation URL, MCP tool output, CI workflow YAML은 모두 나중에 다른 시스템이 해석합니다. 이 파일들은 텍스트이면서 동시에 실행 규칙입니다.
그래서 agent artifact를 아래처럼 분류해야 합니다.
| 산출물 유형 | 예시 | 다음 소비자 | 위험 |
|---|---|---|---|
| executable config | .vscode/tasks.json, hooks, package scripts | IDE, Git, package manager | sandbox 밖 명령 실행 |
| privileged path | Dockerfile, compose, devcontainer | Docker daemon, CI runner | host mount, secret 노출 |
| browser action | URL, click target, form value | browser extension, web agent | 계정 권한 오용 |
| MCP/tool result | file path, origin, status, rendered HTML | agent runtime, host app | 신뢰 메타데이터 오염 |
| release artifact | generated patch, migration, workflow | CI/CD, reviewer | 공급망 변경 |
이 관점이 잡히면 “agent가 파일을 쓸 수 있다"는 권한을 더 세밀하게 보게 됩니다. 어떤 파일은 안전한 문서이고, 어떤 파일은 다음 실행자의 설정입니다. 둘을 같은 write permission으로 묶으면 위험합니다.
2) quarantine gate는 실행 전 멈춤 지점이다
격리라는 말이 거창하게 들릴 수 있지만 실무에서는 간단합니다. agent가 만든 산출물이 곧바로 host나 browser에서 실행되지 않게 중간 상태를 둡니다. 이 상태에서 provenance, risk class, diff, approval, hash, origin을 확인합니다. package registry의 quarantine, 보안 스캐너의 release gate, feature flag의 shadow mode와 비슷한 사고방식입니다.
기본 정책은 아래처럼 시작할 수 있습니다.
| Risk class | 예시 | 기본 정책 | quarantine window |
|---|---|---|---|
| R0 | Markdown, 테스트 fixture, comment-only change | 자동 허용 | 없음 |
| R1 | 일반 source/test 변경 | CI smoke 후 허용 | PR 단위 |
| R2 | script, package config, IDE task, Dockerfile | owner approval 필요 | 24시간 high-risk |
| R3 | CI workflow, hook, cloud/IAM, secret path, browser action | security or platform approval | 72시간 high-risk |
| R4 | external send, deploy, payment/admin action | 수동 승인과 receipt 필수 | 실행 단위 |
핵심은 agent가 만든 산출물이라는 이유만으로 모두 막는 것이 아닙니다. 실행 표면과 권한 표면에 닿는 산출물만 더 보수적으로 다룹니다. 문서 초안과 단위 테스트는 빠르게 흐르게 두고, host 자동 실행과 계정 권한이 걸린 산출물은 gate를 통과하게 합니다.
3) browser agent는 user gesture를 다시 정의하게 만든다
브라우저는 원래 사람의 클릭과 확장의 동작을 구분하려고 노력합니다. 하지만 AI 브라우저 agent나 브라우저 확장이 들어오면 질문이 복잡해집니다. 사용자가 한 번 계정을 연결하고 “act without asking” 비슷한 모드를 켜두면, 이후 click, URL, side panel, permission prompt가 어떤 주체의 행동인지 더 엄격히 봐야 합니다.
Manifold의 Claude for Chrome 보고는 이 지점을 보여줍니다. 보고에 따르면 다른 확장이 claude.ai에 content script를 실행할 수 있을 때 synthetic click으로 predefined prompt를 유도할 수 있었고, skipPermissions=true가 privileged mode 초기화 경로로 작동할 수 있었다고 합니다. 세부 취약점 평가는 벤더와 연구자 사이에 다를 수 있지만, 실무 교훈은 명확합니다. 브라우저 agent의 action은 “사용자가 브라우저에 있으니 안전하다"로 볼 수 없습니다.
브라우저 agent gate에는 최소 아래 필드가 필요합니다.
user_gesture_verified: 실제 사용자 gesture인지origin: action을 만든 페이지 또는 extension originconnected_accounts: Gmail, Docs, Calendar, Salesforce 등 영향 범위permission_mode: ask, auto-approve, read-only, write-enabledaction_risk: read, write, send, delete, adminprompt_source: user, page content, extension, tool resultapproval_id: 고위험 action 승인 근거
이 필드가 없으면 사고 후 “누가 클릭했는가"를 복원하기 어렵습니다. 브라우저 agent 시대에는 클릭도 audit event가 됩니다.
4) output path와 file hash는 보안 장치다
Chrome DevTools MCP changelog의 output path validation 같은 항목은 작아 보이지만 중요한 방향을 보여줍니다. agent tool이 스크린샷, trace, heap snapshot, report를 저장할 때 output path를 느슨하게 받으면 의도하지 않은 파일 덮어쓰기나 host 경로 영향으로 이어질 수 있습니다. allow/block list도 마찬가지입니다. agent가 읽을 URL과 저장할 경로를 제한하는 것은 편의 기능이 아니라 신뢰 경계입니다.
Agent artifact gate에서는 path를 다음 기준으로 봅니다.
- workspace 밖 절대 경로는 기본 거절
- symlink,
.., hidden directory, generated path expansion 검증 - executable bit가 생기는 파일은 high-risk
- 기존 config/script 파일 덮어쓰기는 approval 필요
- 저장 전후 hash와 task id 기록
- artifact를 실행한 tool과 실행 시각 기록
단순히 “파일 저장 성공"으로 끝내면 안 됩니다. 어디에 저장했고, 그 파일이 나중에 누가 실행할 수 있는지까지 봐야 합니다.
5) provenance 없이는 quarantine도 오래가지 못한다
격리 정책을 세워도 산출물의 출처를 모르면 운영이 안 됩니다. 어떤 파일이 사람이 직접 만든 것인지, agent가 만든 것인지, 기존 repo에 있던 것인지, 외부 tool result에서 온 것인지 구분해야 합니다. 이 정보가 없으면 모든 것을 high-risk로 보거나, 반대로 아무것도 구분하지 못합니다.
최소 provenance record는 아래처럼 둘 수 있습니다.
artifact_provenance:
artifact_id: "art_20260726_001"
path: ".github/workflows/deploy.yml"
hash_before: "sha256:..."
hash_after: "sha256:..."
produced_by:
actor_type: "ai_agent"
tool: "coding-agent"
session_id: "sess_..."
task_id: "issue-4312"
source_inputs:
- "issue"
- "repo_files"
- "tool_result"
risk_class: "R3"
quarantine_until: "2026-07-29T10:06:00+09:00"
required_approval: ["platform-owner", "security-review"]
이 정도만 있어도 reviewer는 판단할 수 있습니다. “왜 이 파일이 위험 표시됐지?“가 아니라 “agent가 CI deploy workflow를 바꿨고, R3라 platform/security approval이 필요하군"으로 보입니다.
실무 적용
1) PR과 local workspace에 agent artifact label을 붙인다
가장 현실적인 시작점은 PR입니다. agent가 수정한 파일을 사람이 직접 수정한 파일과 같은 diff로만 보지 말고, 위험 파일 변경을 자동 라벨링합니다.
agent_artifact_policy:
high_risk_paths:
- ".github/workflows/**"
- ".vscode/**"
- "package.json"
- "pnpm-lock.yaml"
- "Dockerfile"
- "docker-compose*.yml"
- "scripts/**"
- "**/*.sh"
- ".env*"
auto_labels:
- "agent-generated"
- "artifact-quarantine"
required_checks:
- "path-risk-classifier"
- "script-diff-review"
- "sandboxed-smoke"
local workspace에서는 더 단순하게 시작할 수 있습니다. agent 세션 이후 실행 파일, config, workflow, Docker 관련 파일이 바뀌면 shell이나 IDE task 실행 전 경고를 띄웁니다. 완벽한 제품이 없어도 pre-commit, wrapper script, IDE extension, CI check로 충분히 시작할 수 있습니다.
2) 실행 gate를 command 앞이 아니라 artifact 앞에 둔다
많은 팀은 npm test, git show, docker build 같은 command를 허용할지 말지 고민합니다. 하지만 agent 시대에는 command 앞뿐 아니라 artifact 앞에 gate가 필요합니다. 같은 npm test라도 package.json scripts가 agent에 의해 바뀌었다면 위험도가 달라집니다.
권장 판단 순서:
- 실행하려는 command가 무엇인가?
- command가 읽는 config/script/artifact가 무엇인가?
- 그 artifact가 최근 agent에 의해 생성·수정되었는가?
- risk class가 R2 이상인가?
- approval, smoke, hash 기록이 있는가?
이렇게 보면 command allowlist가 더 정확해집니다. “git은 안전” 또는 “npm은 위험"이 아니라, 이번 invocation이 어떤 agent-influenced artifact를 소비하는가를 판단합니다.
3) browser action은 connected account 기준으로 제한한다
브라우저 agent는 파일보다 더 직접적으로 계정 권한에 닿습니다. 그래서 action 정책은 URL이 아니라 계정과 동작 기준으로 나눕니다.
| Action | 예시 | 기본 정책 |
|---|---|---|
| read public page | 문서, 검색 결과 읽기 | 허용 |
| read connected account | Gmail, Calendar, Docs 읽기 | approval 또는 read-only scope |
| draft without send | 메일 초안 작성 | 중간 위험, preview 필요 |
| send/write/delete | 메일 발송, CRM 수정, 문서 공유 | 명시 승인과 receipt 필수 |
| admin/security change | 권한 변경, 토큰 발급 | 기본 금지 또는 별도 break-glass |
이 기준은 브라우저 확장에도 적용됩니다. “사용자가 확장을 설치했다"는 사실은 모든 action의 사전 승인이 아닙니다. 연결 계정별 permission lease, user gesture, action receipt가 필요합니다.
4) quarantine metric을 운영 지표로 본다
gate를 만들면 지표가 필요합니다. 너무 많은 산출물이 막히면 개발 흐름이 죽고, 너무 적게 막히면 gate가 의미 없습니다.
추천 지표:
agent_artifact_count{risk_class}quarantine_bypass_attempt_counthigh_risk_artifact_approval_wait_p95agent_influenced_execution_countartifact_revert_ratepost_execution_incident_countbrowser_agent_write_action_without_receipt
초기 기준은 보수적으로 둘 수 있습니다. R3 산출물 approval wait p95가 1영업일을 넘으면 owner를 늘리거나 policy를 조정합니다. 반대로 bypass attempt가 1건이라도 나오면 보안 결함으로 triage합니다. R2/R3 산출물 revert rate가 10%를 넘으면 agent prompt나 policy가 위험 파일을 너무 쉽게 건드리고 있는 신호입니다.
트레이드오프/주의점
첫째, 모든 agent output을 격리하면 생산성이 떨어집니다. 그래서 risk class가 필요합니다. 문서, 테스트, 단순 source 수정은 빠르게 흐르게 두고, 실행 표면에 닿는 산출물만 강하게 봅니다. 목표는 agent를 느리게 만드는 것이 아니라 위험한 handoff를 보이게 만드는 것입니다.
둘째, approval fatigue가 생길 수 있습니다. R2/R3 기준이 너무 넓으면 reviewer는 무의미하게 승인만 누르게 됩니다. 승인 요청에는 diff, risk reason, affected tool, suggested verification이 함께 있어야 합니다. “agent가 바꿨으니 승인하세요"는 좋은 gate가 아닙니다.
셋째, quarantine은 sandbox를 대체하지 않습니다. sandbox, network egress, permission prompt, origin check, file path validation, audit log가 함께 있어야 합니다. 격리는 sandbox 밖으로 산출물이 넘어갈 때 추가로 필요한 장치입니다.
넷째, 브라우저 agent는 privacy와 usability 균형이 어렵습니다. 모든 click과 화면 내용을 저장하면 민감정보 리스크가 커집니다. 대신 action type, origin, connected account, permission mode, receipt id, redacted target 정도를 남기는 방식이 현실적입니다.
의사결정 우선순위는 계정·권한 보호 > host 실행 차단 > 공급망 변경 검증 > 개발 속도 순서가 좋습니다. 빠른 자동화보다, 자동화가 만든 산출물을 어디까지 믿을지 설명할 수 있는 것이 먼저입니다.
체크리스트 또는 연습
운영 체크리스트
- agent가 만든 파일과 사람이 만든 파일을 PR 또는 local metadata에서 구분한다.
- executable/config/CI/browser-action 산출물에 risk class를 붙인다.
- R2 이상 산출물은 owner approval 또는 sandboxed smoke 없이 실행하지 않는다.
- agent-influenced artifact를 실행한 command, args, cwd, file hash를 기록한다.
- browser agent action은 origin, user gesture, connected account, permission mode를 남긴다.
- output path는 workspace boundary, symlink, hidden path, executable bit를 검증한다.
- quarantine bypass는 보안 결함으로 triage한다.
- R3/R4 action은 execution receipt와 rollback plan이 있다.
연습
- 최근 agent가 만든 PR 5개를 골라 R0~R4 risk class를 붙여 보세요. 어떤 파일이 생각보다 위험했는지 기록합니다.
npm test,docker build,git show, IDE task 실행 전에 어떤 agent-influenced artifact를 읽는지 표로 적어 보세요.- 브라우저 agent가 Gmail을 읽고 CRM 필드를 수정하는 상황을 가정하고, user gesture, permission prompt, receipt, rollback 항목을 설계해 보세요.
- R2/R3 산출물 approval wait p95가 1영업일을 넘는다고 가정하고, policy를 줄일지 reviewer를 늘릴지 의사결정 기준을 만들어 보세요.
오늘의 결론은 단순합니다. AI agent가 만든 산출물은 “검토할 텍스트"가 아니라 “다음 시스템이 실행할 수 있는 입력"입니다. 좋은 개발 조직은 agent를 무작정 막지 않습니다. 대신 산출물의 출처를 남기고, 실행 표면에 닿는 변경을 격리하고, host와 browser가 그 산출물을 신뢰하기 전에 작은 gate를 통과하게 만듭니다. 이 흐름이 자리 잡으면 agent 생산성은 유지하면서도, sandbox 밖으로 새는 위험을 훨씬 빨리 발견할 수 있습니다.
💬 댓글