Claude Code Desktop 미리보기 창 데이터 유출 취약점
.jpg)
TL;DR
Noma Labs는 Claude Code Desktop의 미리보기 창에서 제한 없는 JavaScript 실행을 통해 임의 파일 읽기를 달성하는 익스플로잇 체인을 발견했습니다. 공격자는 공개 저장소에 손상된 HTML을 심어 커버리지 보고서로 위장하고, 이를 통해 preview sandbox를 우회해 Content Security Policy 없이 JavaScript를 실행합니다.
전달 방식 때문에 이 공격 경로는 특히 흥미롭습니다. 피해자가 공개 저장소를 클론한 뒤 Claude에게 파일 검토를 요청하면, Claude가 해당 파일을 읽고 미리보기 창이 이를 자동으로 렌더링하며, 내장된 악성 페이로드가 실행됩니다. Claude의 미리보기 창은 256KB를 넘는 파일을 file:// URL로 로드하므로, 페이로드는 피해자의 로컬 파일 시스템 전체에 대해 동일 출처 접근 권한을 얻게 됩니다.
API 키, SSH 개인 키, 클라우드 자격 증명, Claude 자체의 OAuth 토큰, 그리고 WebRTC를 통한 피해자의 실제 IP 주소 같은 민감한 자격 증명과 비밀 정보가 조용히 유출됩니다.

Anthropic은 Noma Labs의 발견을 CVSS 8.7(높음)으로 평가했으며, 그 영향을 호스트에서의 코드 실행과 동등하게 취급했습니다.

Claude Code Desktop의 미리보기 창이란?
Claude Code Desktop의 미리보기 창은 대부분의 사용자가 한 번쯤은 사용해 봤지만, 보안 관점에서 생각하는 경우는 거의 없는 기능입니다. Claude가 HTML 파일을 읽거나 편집할 때마다, 미리보기 창은 그 결과를 내장 패널에 자동으로 렌더링해 사용자가 즉시 결과를 볼 수 있게 합니다.
내부적으로 이 미리보기 창은 Claude가 수정한 HTML 콘텐츠를 가져와 Electron의 Chromium 기반 렌더링 엔진을 사용해 애플리케이션 안에서 표시하는 아티팩트 렌더러입니다. 피해자는 URL로 이동하거나 브라우저에서 파일을 여는 것이 아니라, 미리보기 창이 파일을 자동으로 렌더링합니다.
악성 콘텐츠로부터 보호하기 위해 미리보기 창은 샌드박스 안에서 실행되며, 이 샌드박스에서는 Content Security Policy(CSP)가 스크립트 실행을 차단하고, origin isolation이 렌더링된 콘텐츠가 접근할 수 있는 범위를 제한하며, 요청 필터가 렌더러가 가져올 수 있는 리소스를 제어합니다. 이 아키텍처는 HTML 파일과 피해자의 기기 사이에 세 겹의 방어선을 만듭니다. Noma Labs 연구원들은 이 세 겹을 모두 우회했습니다.
샌드박스 우회
Anthropic은 세 가지 방어로 미리보기 창을 샌드박스화합니다. JavaScript 실행을 차단하는 script-src 'none'이 있는 Content Security Policy(CSP), 페이지에 불투명한 출처를 부여해 로컬 파일을 가져올 수 없게 만드는 data: URL 로딩, 그리고 렌더러에서 나가는 요청을 가로채는 dev server proxy의 요청 필터입니다.
우리가 찾은 방법
우리는 Claude Code Desktop이 미리보기 창에서 HTML 파일을 어떻게 렌더링하는지부터 살펴봤습니다. Claude의 미리보기 창은 작은 파일과 큰 파일을 다르게 렌더링합니다.
- 256KB 미만의 파일은
data:URL로 로드되며, 이 경우 임베디드 스크립트가 접근할 수 있는 범위가 제한됩니다. - 256KB 초과의 파일은 임시 파일로 작성된 뒤
file://URL로 로드되며, Chromium에서는fetch()를 통해 다른 로컬 파일을 읽을 수 있습니다.
미리보기에서 렌더링되는 파일에는 CSP가 적용되어 모든 인라인 스크립트 실행이 차단됩니다. 하지만 이는 data: URL 경로에만 적용됩니다. file:// 경로에는 CSP가 전혀 적용되지 않으므로, 큰 파일 안의 JavaScript는 제한 없이 실행됩니다.
또한 미리보기에서 file:// 읽기를 차단하려는 요청 필터도 있습니다. 미리보기가 로컬 React나 Node 앱 같은 실행 중인 dev server를 프록시할 때는 이 필터가 활성화되어 그런 읽기를 차단합니다. 하지만 커버리지 보고서처럼 디스크에서 정적 HTML 파일을 직접 렌더링할 때는 필터가 작동하지 않으며, fetch() 호출은 실제 파일 시스템을 대상으로 해석됩니다.
이 세 가지 빈틈이 연결되면 공격자는 미리보기 창을 통해 임의 파일 읽기를 수행할 수 있습니다:
- 파일을 256KB 이상으로 늘려
file://출처를 얻습니다. - 누락된 CSP를 악용해 스크립트를 실행합니다.
- 비활성 요청 필터를 사용해 로컬 경로를 읽습니다.
취약점 개념 증명
▶ 영상: https://youtu.be/j9oMcRSEZik
하나의 질문, 전면 침해
취약점을 입증하기 위해 Noma Labs 연구원들은 소스 파일, 테스트, 커버리지 보고서를 포함해 정상 프로젝트와 정확히 똑같아 보이는 저장소를 구성했습니다. 테스트 도구는 코드베이스의 어느 부분이 커버되는지 보여주기 위해 이런 보고서를 생성합니다. 이런 유형의 저장소는 보통 소스 맵과 CSS를 함께 묶기 때문에 크기가 큰 편이며, 500KB짜리 보고서도 특별한 이상 징후를 보이지 않습니다. 우리는 이 보고서를 256KB보다 크게 만들고 그 안에 JavaScript 페이로드를 삽입했습니다.

- 피해자가 저장소를 복제하고 Claude Code Desktop을 엽니다.
- 피해자는 Claude에게 커버리지 보고서를 보라고 요청합니다. 이는 테스트 결과를 검토하거나 어떤 모듈에 커버리지 공백이 있는지 확인하는 것과 같은 일상적인 요청입니다.
- Claude가 파일을 읽습니다. 미리보기 창이 자동으로 렌더링되고, 삽입된 페이로드가 실행됩니다.
- 스크립트는 임시 파일 경로에서 피해자의 홈 디렉터리를 알아낸 뒤
fetch()와XMLHttpRequest를 통해 파일을 가져오기 시작합니다:
- SSH 개인 키
- AWS 접근 키와 비밀 키
- npm 및 GitHub 인증 토큰
- Kubernetes 클러스터 자격 증명
- Docker 레지스트리 인증 정보
- Git ID와 토큰
Claude Code Desktop에는 외부 요청을 제한하는 CSP가 없기 때문에, 스크립트는 navigator.sendBeacon()을 사용해 모든 정보를 공격자의 서버로 되돌려 보냅니다. navigator.sendBeacon()은 백그라운드에서 조용히 일방향 HTTP POST를 전송하는 웹 API입니다. 이 유출 방식이 동작하는 이유는 앞서 언급했듯 Claude Code Desktop이 Electron 앱이기 때문입니다. Electron 앱의 전체 UI는 모든 표준 웹 API에 접근할 수 있는 완전한 Chromium 브라우저 엔진에서 실행됩니다.
실제로는 피해자가 Claude Desktop에 어떤 것에 대해서도 승인을 하거나 접근 권한을 부여할 필요가 없다는 뜻입니다. 커버리지 보고서나 그 내용을 검토하라는 요청을 피해자가 승인하라는 권한 요청은 생성되지 않습니다. Claude에게 커버리지 보고서를 보라고 한 원래의 요청만으로 미리보기가 트리거되고, 페이로드가 실행되며, 데이터와 비밀 정보가 유출됩니다. Claude가 신뢰할 수 없는 콘텐츠를 피해자를 대신해 렌더링하기 때문에, 악성 코드가 실행되는 지점은 바로 이 렌더링 단계입니다.
수정 우회
처음 보고한 뒤 Anthropic은 메인 페이지 컨텍스트에서 file:// 경로로 향하는 fetch() 및 XMLHttpRequest 호출을 차단하는 패치를 배포했습니다. 하지만 Noma Labs 연구원들은 그 패치를 우회하는 또 다른 방법을 찾아냈습니다.
blob: URL에서 생성한 Web Worker 안으로 fetch() 호출을 옮김으로써, CSP 필터가 적용되지 않는 컨텍스트에서 요청을 시작할 수 있었습니다.
const workerCode = `
self.onmessage = async function(e) {
for (const target of e.data) {
try {
// Worker's fetch() bypasses the renderer's request filter
const r = await fetch('file://' + target.path);
if (r.ok) {
const text = await r.text();
// Send stolen file contents back to the main thread for exfiltration
self.postMessage({tag: target.tag, data: text});
}
} catch(e) {}
}
};
`;
// Spawn the Worker via the blob: URL, creating a separate execution context not covered by the filter
const blob = new Blob([workerCode], {type: 'application/javascript'});
const worker = new Worker(URL.createObjectURL(blob));Worker는 동일한 민감 파일 집합을 읽어 메인 스레드로 보냈고, 메인 스레드는 이를 sendBeacon()을 통해 유출했습니다. 세 가지 원래 결함은 모두 이 경로를 통해 계속 악용 가능했습니다.
Anthropic의 대응
Anthropic은 처음부터 Noma의 공개를 진지하게 받아들였습니다.
그들은 초기 보고를 분류하고 CVSS v4.0을 사용해 CVSS 8.7(높음)으로 평가했으며, 렌더러에서 file:// 경로로 향하는 직접적인 fetch() 및 XMLHttpRequest 호출을 차단하는 패치를 배포했습니다.
URL Web Worker가 이 수정 사항을 우회할 수 있음을 보여주는 우회 방법을 제출한 뒤, 그들은 문제가 아직 해결되지 않았음을 확인하고 이를 해결하기 위한 추가 작업에 착수했습니다:

최종 재검토 후 Anthropic은 모든 문제를 수정했고, 취약점을 종료 처리하며 해결됨으로 표시했습니다.
공개 일정
이 공개 과정 전반에 걸쳐 투명하고 신속하게 협력해 준 Anthropic 팀에 진심으로 감사드립니다. 프런티어 AI를 안전하게 발전시키려면 보안 연구자와 플랫폼 공급업체가 지속적인 피드백 루프를 통해 투명하게 협력하는 상호 책임의 모델이 필요합니다. 모든 우회 기법에 대해 완전하고 계층적인 수정이 이루어질 때까지 반복을 멈추지 않은 Anthropic의 헌신은, 더 넓은 커뮤니티를 보호하는 데 필요한 협력의 기준을 잘 보여 줍니다.
- 2026년 7월 4일 초기 보고: 파일 미리보기 창에서 임의의 JavaScript 실행을 통해 민감한 자격 증명을 유출하는 것을 보여주는 완전한 PoC와 함께 취약점이 Anthropic에 보고됨.
- 2026년 7월 9일 분류: Anthropic이 이 취약점의 CVSS를 8.7(높음)로 평가함.
- 2026년 7월 24일 패치 및 재테스트: Anthropic이 취약점을 수정하고 재테스트를 요청함.
- 2026년 7월 24일 우회 보고: Noma Labs가 blob: URL 스킴 Web Workers가 요청 필터를 우회한다는 것을 입증함. 비디오 안내가 포함된 완전한 우회 PoC를 제출함.
- 2026년 8월 3일 우회 확인: Anthropic이 수정이 불완전함을 확인하고 보고서를 다시 Triaged로 되돌림. CSP, file:// 로딩, Worker 우회를 모두 포함하는 완전한 수정 작업이 진행 중임.
- 2026년 8월 17일 Anthropic이 Claude Desktop 1.30096.1 이상에 대한 수정 사항을 배포했으며, 자동 업데이트를 통해 제공됨.
- 2026년 10월 GitHub Advisory 및 CVE는 게시 대기 중
자세히 알아보기
SneakPeek 발견은 Noma Labs의 더 큰 사명의 한 부분일 뿐입니다. 선제적이고 최전선적인 취약점 연구는 현대 AI 기술 스택에 대한 보호와 방어를 실현하는 방식의 핵심입니다. Noma Labs 연구 인덱스의 나머지 부분에서 최근 발견 사항과 진행 중인 보안 분석에 대해 여기에서 읽어볼 수 있고, Noma의 YouTube 채널에서도 여기에서 확인할 수 있습니다. 무엇이 가장 취약하고 위험한지 계속 추적하면서 우리의 발견을 계속 공유하겠습니다.
읽는 데 걸린 시간
9분
출처
- 원문: https://noma.security/noma-labs/sneakpeek-how-the-preview-pane-in-claude-code-desktop-can-exfiltrate-your-data (2026-10-15 · wondersky)