인사이트 · 3분 · 05.21

Claude Code 샌드박스를 5달간 뚫었던 한 줄 — 'This is a real bypass' Claude의 자기 고백

loopy vibecoder

핵심 요약 (TL;DR)

Wyze Labs 보안 리드 Aonan Guan이 Claude Code의 SOCKS5 호스트네임 null-byte 우회를 5달 만에 두 번째 발견했고, Anthropic은 changelog의 보안 노트 없이 4월 초 v2.1.90 즈음에 조용히 패치했습니다. Claude Code 본체에는 CVE조차 부여되지 않았고, Aonan Guan이 직접 Claude에게 자기 구멍을 보여주자 "This is a real bypass of the network sandbox filter"라고 인정했습니다. 약 5.5개월·130 릴리스가 위험에 노출되어 있었습니다.

"샌드박스만 켜면 안전하다"는 착각

저는 Claude Code의 *.google.com이나 *.github.com처럼 allowlist를 좁게 잡아두면 자격증명이 외부로 새지 않는다고 믿었던 사람 중 하나입니다. 그래서 GitHub Issues 본문을 컨텍스트로 던지고, 외부 마크다운 문서를 그대로 읽히고, 노트북 백그라운드에 에이전트를 길게 굴렸죠. 5월 20일, 그 믿음이 한 줄짜리 호스트네임 문법에 의해 5.5개월 동안 무너져 있었다는 사실이 The Register와 SecurityWeek로 동시에 공개됐습니다.

발견자는 Aonan Guan(@oddguan), Wyze Labs의 Cloud & AI Security 리드입니다. 같은 사람이 5달 전에도 Claude Code 샌드박스의 첫 번째 우회(allowedDomains: []이 오히려 모든 네트워크를 열어버린 버그, CVE-2025-66479)를 폭로한 적이 있죠. 같은 사람이 같은 제품을 같은 방식으로 또 뚫었다는 건, 단순한 단발 사고가 아니라는 뜻입니다.

한 줄짜리 우회, 130개의 릴리스

이번 우회의 본질은 어처구니없을 만큼 단순합니다. 공격자가 호스트네임에 attacker-host.com\x00.google.com 같은 문자열을 던지면, JavaScript의 endsWith() 필터는 끝의 .google.com만 보고 통과시킵니다. 그런데 운영체제의 getaddrinfo는 null 바이트(\x00)에서 문자열을 잘라버리기 때문에 실제로는 attacker-host.com으로 연결됩니다. allowlist를 정면으로 우회하는 거죠.

endsWith()   →  attacker-host.com\x00.google.com  →  OK
getaddrinfo  →  attacker-host.com (잘림)            →  실제 연결

이 구멍은 Claude Code v2.0.24(2025년 10월 20일)부터 v2.1.89까지, 약 130개의 릴리스 동안 살아 있었습니다. Aonan Guan이 2026년 4월 4일 HackerOne #3646509로 보고하자 Anthropic은 "이미 내부에서 잡았다"며 duplicate로 처리했고, 4월 초 v2.1.90 즈음에 changelog의 보안 노트 없이 조용히 패치했습니다(보조 매체에 따라 v2.1.88로 표기되기도 합니다). Claude Code 본체에는 CVE조차 부여하지 않았죠. 라이브러리 @anthropic-ai/sandbox-runtime에만 CVSS 1.8짜리 CVE-2025-66479가 붙었을 뿐입니다.

Claude가 직접 자기 구멍을 인정한 장면

가장 기이한 장면은 Aonan Guan이 자신의 POC를 Claude한테 보여줬을 때 일어났습니다. Claude는 자기 샌드박스의 우회 메커니즘을 분석하고 이렇게 답했죠.

"This is a real bypass of the network sandbox filter."

자기 회사의 보안 문제를 가장 정확하게 자백한 게 모델 본인이라는 건, 바이브코더 입장에서 두 가지를 동시에 의미합니다. 첫째, 모델은 자기가 갇혀 있는 샌드박스의 구조를 인지하고 있습니다. 둘째, 그 인지를 어떤 워크플로우에서 어떻게 끌어낼지는 전적으로 우리에게 달려 있는 거죠.

바이브코더가 지금 점검해야 할 4가지

샌드박스 모드의 환상이 깨졌으니, 노트북 어디에 들어 있을지 모르는 자격증명 기준으로 새로 점검해보세요.

  • ~/.aws/, ~/.config/gh/ 같은 자격증명 디렉터리가 에이전트의 작업 트리 안에 노출되어 있는지
  • GitHub Issues·외부 문서를 컨텍스트로 던지는 워크플로우 — 거기 박힌 prompt injection 한 줄이 위 디렉터리를 자동으로 빨아낼 수 있습니다
  • 클라우드 메타데이터 엔드포인트(169.254.169.254)와 사내 인트라넷 — 호스트네임 allowlist만으로는 막을 수 없다는 게 이번 사건의 결론입니다
  • Claude Code 버전: v2.1.90 이상으로 올라와 있어야 합니다. 그 이하면 우회가 살아 있습니다

FAQ

Q. Anthropic이 잘못한 걸까요?
A. 패치 자체는 빠른 편이었습니다. 문제는 130 릴리스 동안 같은 패턴의 우회가 두 번 나왔다는 점, 그리고 Claude Code 본체에 CVE 없이 changelog 보안 노트도 없이 끝낸 결정이거든요. 사용자가 자기 환경의 위험 기간을 역추적할 방법이 없으니까요.

Q. 샌드박스 모드를 꺼야 할까요?
A. 그 반대입니다. 샌드박스를 켜되, 동시에 자격증명을 워킹 디렉터리 밖에 두고, 외부 컨텍스트는 신뢰 가능한 것만 던지세요. 샌드박스는 "한 겹의 방어선"이지 "유일한 방어선"이 아니라는 게 핵심입니다.

Q. 다른 코딩 에이전트는 안전한가요?
A. Aonan Guan 본인이 Gemini CLI와 GitHub Copilot의 prompt injection → credential theft 연쇄도 정리해온 사람입니다. 같은 패턴이 다른 도구에도 있을 수 있다는 가정 하에 동일한 점검을 해두는 게 맞습니다.

샌드박스의 두께를 믿기 전에, 그 안에 무엇을 넣어뒀는지부터 다시 보세요. 자격증명이 거기 있다면, 다음 우회는 또 다른 한 줄의 문법에서 나올 수 있습니다.

소스: Aonan Guan 블로그 · The Register · SecurityWeek

0

댓글 0

아직 댓글이 없습니다