Claude Code 데스크톱 미리보기 창에서 임의 파일 읽기 취약점 발견

Hacker News17일 전조회 1

Claude Code 데스크톱 앱의 미리보기(preview) 창에서 임의 파일 읽기로 이어지는 취약점이 발견됐다. 보안 업체 Noma Labs(Noma Security)가 공개한 이 취약점은 공격자가 심어둔 HTML 파일을 Claude가 읽는 순간, 사용자 승인 절차 없이 로컬 파일 시스템의 민감 정보가 외부로 빠져나가는 구조다. Anthropic은 이를 CVSS v4.0 기준 8.7(High)로 평가했고, 호스트에서의 코드 실행과 동등한 수준의 영향으로 취급했다.

문제의 핵심은 Claude Code 데스크톱이 HTML 파일을 자동으로 렌더링하는 미리보기 창이다. 이 창은 Electron의 Chromium 렌더링 엔진 위에서 동작하는데, 원래 세 겹의 방어가 걸려 있다. 스크립트 실행을 막는 CSP(script-src 'none'), 로컬 파일 접근을 차단하는 불투명(opaqu) 오리진, 그리고 렌더러의 외부 요청을 걸러내는 요청 필터다. Noma Labs는 이 세 겹을 모두 우회하는 경로를 찾아냈다.

첫 번째 틈은 파일 크기다. 미리보기 창은 256KB를 기준으로 동작이 갈린다. 그보다 작은 파일은 data: URL로 로드되지만, 256KB를 넘으면 임시 파일로 저장한 뒤 file:// URL로 불러온다. 문제는 CSP가 data: URL 경로에만 적용된다는 점이다. file:// 경로로 렌더링된 문서에는 CSP가 붙지 않아 자바스크립트가 제한 없이 실행된다.

두 번째 틈은 요청 필터의 조건부 동작이다. 이 필터는 미리보기가 로컬 개발 서버를 프록시할 때만 작동한다. 디스크에서 정적 HTML 파일을 직접 렌더링하는 경우에는 필터가 개입하지 않고, fetch() 호출이 실제 파일 시스템을 향해 그대로 해석된다. 여기에 파일을 256KB 이상으로 부풀려 file:// 오리진을 얻는 트릭을 결합하면, 미리보기 창 하나로 임의 파일 읽기가 성립한다.

공격 시나리오는 평범한 저장소를 위장한다. 소스 코드와 테스트, 커버리지 리포트를 갖춘 정상 프로젝트처럼 보이게 만든 뒤, 256KB를 넘기는 커버리지 리포트 안에 자바스크립트 페이로드를 숨긴다. 커버리지 리포트는 원래 소스맵과 CSS 때문에 용량이 큰 게 자연스러워 의심을 사지 않는다. 피해자가 저장소를 클론하고 Claude에게 리포트를 검토해 달라고 요청하면, Claude가 파일을 읽고 미리보기 창이 자동으로 렌더링하면서 페이로드가 실행된다. 사용자가 별도로 권한을 승인할 필요도 없다.

유출되는 정보의 범위는 넓다. API 키와 SSH 개인 키, 클라우드 자격 증명, Claude 자체의 OAuth 토큰까지 fetch()와 XMLHttpRequest로 긁어모은다. WebRTC를 통해 실제 IP 주소도 노출된다. 수집된 데이터는 navigator.sendBeacon()으로 공격자 서버에 조용히 전송된다. Electron 앱의 UI 전체가 완전한 Chromium 엔진 위에서 돌아가 표준 웹 API를 모두 쓸 수 있기 때문에 가능한 일이다.

Anthropic은 최초 신고를 접수한 뒤 렌더러에서 file:// 경로로 향하는 fetch()와 XMLHttpRequest를 차단하는 패치를 배포했다. 그러나 Noma Labs는 blob: URL로 생성한 Web Worker 안에서 fetch()를 호출하는 방식으로 우회에 성공했다. Worker는 렌더러의 요청 필터가 닿지 않는 별도 실행 컨텍스트를 만들어내고, 읽어들인 파일 내용을 메인 스레드로 넘겨 다시 sendBeacon()으로 유출하는 흐름이었다. 우회 제보 이후 Anthropic은 추가 작업을 거쳐 모든 문제를 수정하고 취약점을 종료 처리했다.

개발자 입장에서 이 사건이 남기는 교훈은 명확하다. 코드 편집 도구가 파일을 자동으로 렌더링하는 기능은 곧 신뢰할 수 없는 콘텐츠를 실행하는 표면이 된다는 뜻이다. 외부 저장소를 클론해 AI에게 파일 검토를 맡기는 일은 이제 흔한 워크플로지만, 그 과정에서 어떤 파일이 어떤 방식으로 렌더링되는지까지 인지해야 한다. 샌드박스가 여러 겹이라도 경로별로 조건이 다르면 방어선은 그만큼 쉽게 무너진다.

한 가지 짚어둘 점은 이 취약점이 이미 수정됐다는 사실이다. 원문이 공개한 내용은 특정 시점의 Claude Code 데스크톱 버전을 대상으로 한 것이며, 최종 재검증 단계에서 모든 문제가 해결된 것으로 확인됐다. 또한 공격이 성립하려면 피해자가 악성 저장소를 클론하고 해당 파일을 Claude에게 읽히는 과정이 필요하다는 전제가 따른다.