무슨 결함인가
Anthropic의 Chrome Extension Claude for Chrome(v1.0.69 이하)에서 권한이 전혀 없는 다른 Extension 하나가, 사용자 동의 한 번 없이 Claude 에이전트를 통째로 빌려 Gmail, Google Drive, GitHub의 데이터를 조회하고 외부로 빼낼 수 있는, 발신자 신원 검증이 빠진 결함이 공개됐어요.
LayerX Security가 2026-05-07에 공개했고, 발견자가 붙인 이름은 ClaudeBleed입니다. 2014년 OpenSSL의 Heartbleed, 2017년 Cloudflare의 Cloudbleed 계보를 잇는 “데이터가 새어 나온다"는 작명을 오마주했습니다. Anthropic은 하루 앞선 5월 6일 v1.0.70으로 부분 패치를 배포했지만, 같은 연구자가 약 3시간 만에 우회 경로를 찾아 함께 공개했습니다. 5월 13일 현재까지 추가 패치는 발표되지 않았으며, CVE 번호도 아직 할당되지 않았습니다.
요약 표
| 항목 | 내용 |
|---|---|
| 취약점 이름 | ClaudeBleed |
| 영향 제품 | Claude for Chrome (Chrome 브라우저 Extension) |
| 영향 버전 | v1.0.69 이하 |
| 부분 패치 | v1.0.70 (2026-05-06, 우회 경로 확인됨) |
| 추가 패치 | 미발표 (2026-05-13 기준) |
| CVE | 미할당 |
| 발견자 / 공시 | LayerX Security, 2026-05-07 |
| 분류 | Trust Boundary Violation (CWE-501 계열) |
| 공격 전제 | 사용자가 다른 Chrome Extension 하나를 설치하고 있을 것 |
| 사용자 상호작용 | 불필요 |
| 권한 요구 | 공격용 Extension에 별도 권한 불필요 |
externally_connectable은 누구를 신뢰하는가
Chrome Extension 매니페스트의 externally_connectable 키는 “이 Extension의 메시지 채널을 누가 호출해도 되는가"를 선언합니다. 보통 두 가지 형태로 씁니다.
// 형태 A — 다른 Extension ID로 한정
{
"externally_connectable": {
"ids": ["<신뢰하는 Extension ID>"]
}
}
// 형태 B — 특정 웹 출처(origin)로 한정
{
"externally_connectable": {
"matches": ["*://*.claude.ai/*"]
}
}
Claude for Chrome은 두 번째 형태로, claude.ai 출처에서 실행되는 페이지 스크립트가 Extension에 메시지를 보낼 수 있도록 열어 뒀습니다. 사용자 입장에서 Claude 사이드 패널과 claude.ai가 한 몸처럼 동작해야 하니, 설계 의도는 자연스럽습니다.
문제는 origin이 답할 수 있는 질문의 범위입니다. origin은 “이 코드가 어느 페이지 컨텍스트에서 실행되는가"는 알지만, “그 컨텍스트 안에서 누가 그 코드를 실행시켰는가"는 모릅니다. Chrome의 Extension 모델은 임의의 Extension이 자기 content script를 다른 출처의 페이지에 주입할 수 있게 허용하며, 매니페스트의 "world": "MAIN" 옵션을 켜면 그 스크립트는 페이지 자체의 자바스크립트 컨텍스트에서 돕니다.
여기서 권한 0짜리 Extension이란, manifest.json에 permissions(tabs, storage, cookies 등)도 host_permissions(https://mail.google.com/* 같은 사이트 접근 권한)도 적지 않은 Extension을 말합니다. 사용자가 설치할 때 “이 Extension은 ~ 권한이 필요합니다” 같은 경고 화면이 거의 뜨지 않거나 가장 가벼운 형태로만 뜹니다. 그런데 content_scripts 항목은 권한 요청이 아니라 “어떤 페이지에서 이 자바스크립트를 실행해 달라"는 등록이라, 별도 권한 없이도 매니페스트에 적은 origin(여기서는 *://*.claude.ai/*)에 자기 스크립트를 끼워 넣을 수 있습니다.
즉 권한 0짜리 Extension 하나가:
- content script로
claude.ai에 스크립트를 한 장 주입하고, - 그 스크립트가 페이지 컨텍스트에서
chrome.runtime.sendMessage("<Claude Extension ID>", {...})한 줄을 실행하면, - Claude Extension 입장에서는 “claude.ai에서 들어온 정상 메시지"로 보입니다.
Claude Extension의 ID(fcoeoabgfenejglbffodgkkbkcdhcgfn)는 Chrome Web Store에 그대로 공개돼 있고, Extension ID는 비밀이 아닙니다. 결과적으로 origin 화이트리스트는 ACL이 아니라 누구나 통과시키는 표지판에 가깝습니다.
LayerX는 이 호출로 도달 가능한 핸들러 중 하나로 onboarding_task를 지목했는데, 이 핸들러는 외부에서 받은 텍스트를 그대로 Claude의 작업 프롬프트로 흘려보냅니다. 즉 메시지 한 통이면 임의 프롬프트 실행과 같습니다.
공격 사슬
전체 동작은 한 장으로 정리됩니다.
flowchart TD
EXT["악성 Extension
(권한 0)"]
CS["content script
MAIN world 주입"]
PAGE["claude.ai
페이지 컨텍스트"]
MSG["chrome.runtime
.sendMessage"]
CLAUDE["Claude Extension
외부 메시지 수신"]
PROMPT["onboarding_task
임의 프롬프트"]
DOM["DOM 라벨 위장"]
LOOP["승인 루핑
(Yes, proceed)"]
PRIV["Privileged 모드
우회"]
DATA["Gmail / Drive
GitHub 작업"]
EXT -- "1. 주입" --> CS
CS -- "MAIN world" --> PAGE
PAGE -- "2. 메시지" --> MSG
MSG -- "origin만 검증" --> CLAUDE
CLAUDE -- "3. 실행" --> PROMPT
DOM -. "라벨 변조" .-> PROMPT
LOOP -. "자동 동의" .-> PROMPT
PRIV -. "확인 생략" .-> PROMPT
PROMPT -- "4. 호출" --> DATA
여기까지가 진입입니다. Extension ID와 origin만 알면 누구든 Claude 에이전트의 작업 큐에 항목을 하나 밀어 넣을 수 있습니다. 그 다음 단계, 즉 “어떻게 사용자 몰래 그 작업을 끝까지 수행하게 만드는가"가 아래 4가지 공격 기법으로 나뉩니다.
4가지 공격 기법
1. Confused Deputy
Claude Extension은 “claude.ai에서 온 메시지면 정상"이라는 전제로 동작합니다. 그러나 실제 메시지를 만든 주체는 사용자가 띄운 claude.ai 페이지가 아니라, 사용자가 설치해 둔 다른 Extension이 페이지 위에 얹어 놓은 스크립트입니다. 정당한 권한을 가진 대리인(Claude Extension)이 자기 권한 밖의 호출자(악성 Extension)를 위해 일하게 되는, 교과서적인 confused deputy 구도입니다.
이 구도가 위험한 이유는 권한 상승의 비용이 0이라는 점입니다. 공격 Extension은 호스트 권한도, 탭 권한도, storage도 필요 없습니다. content script 하나만 선언하면 끝납니다.
2. 승인 루핑(Approval Looping)
Claude는 민감한 작업을 수행하기 전 사용자에게 확인을 받는 단계를 거칩니다. 그런데 그 확인이 “지금 이 특정 행동에 대한 동의"가 아니라 “지금 사용자가 활성화한 모드"로만 검사되기 때문에, 같은 채널로 “Yes, proceed"에 해당하는 메시지를 반복 전송하면 확인 흐름을 그대로 통과시킬 수 있습니다.
토큰이 특정 행동에 바인딩돼 있지 않은 탓입니다. 한 번 받은 동의가 다음 동의가 필요한 자리에서 다시 통하면, 동의 절차는 이름만 남고 실제 통제력을 잃습니다.
3. DOM 라벨 위장
Claude 에이전트는 페이지의 DOM을 읽어 어떤 버튼이 무슨 동작인지 판단합니다. 악성 Extension이 DOM을 살짝 바꿔 두면(예를 들어 “외부에 공유” 버튼의 라벨을 “피드백 요청"으로) 에이전트의 인식과 실제 동작이 어긋납니다. 에이전트는 무해한 작업으로 알고 누르지만, 실제 클릭은 원래 핸들러를 그대로 부릅니다.
이 기법은 ClaudeBleed에만 국한되지 않는, 브라우저 안에서 도는 모든 AI 에이전트의 일반 약점에 가깝습니다. 에이전트가 의미를 DOM에서 끌어내는 한, DOM을 만질 수 있는 쪽이 의미를 다시 정의할 수 있습니다.
4. Privileged Mode 우회
Claude for Chrome은 두 가지 모드를 둡니다. Ask before acting(매 행동마다 확인)과 Act without asking(자율 수행). v1.0.70 패치는 Ask 모드에서 외부 메시지가 임의 행동을 일으키지 못하도록 사이드 패널 안에 명시적 승인 흐름을 추가했습니다.
하지만 LayerX는 공격자가 사이드 패널의 초기화 흐름을 가로채 Act without asking 쪽으로 진입시키는 우회 경로를 약 3시간 만에 확인했습니다. 모드 전환이 사용자에게 통보되지 않기 때문에, 사용자는 자기 Extension이 자율 모드로 돌고 있는지 알 길이 없습니다.
요약하면 패치는 증상인 승인 UI 흐름만 가렸을 뿐, 원인인 메시지 발신자 신원 검증 부재는 손대지 못했습니다. 발신자가 누구인지 확인하지 못하는 한 어느 모드에서든 우회 경로는 다시 열립니다.
이 결함으로 가능한 위협 시나리오
이 결함이 가능하게 만드는 작업은 평범한 사용자 시나리오로 옮기면 그대로 사고로 이어집니다.
- Gmail의 받은편지함을 요약시켜 외부 주소로 메일 발송
- Google Drive 비공개 문서에 공유 링크를 발급해 외부 노출
- GitHub 비공개 리포지토리의 파일 내용을 챗 응답에 끼워 빼내기
- 사용자 대신 메일 발송, 문서 삭제로 흔적 정리
- 외부 캘린더 초대, Slack 메시지 발송 같은 OAuth 권한 위임 작업 일반
세 가지가 함께 성립한다는 점이 무겁습니다. 공격 Extension에 별도 권한이 필요 없고, 사용자 상호작용도 필요 없으며, EDR이나 안티바이러스 관점에서는 정상 Extension의 정상 호출처럼 보입니다.
특히 사내 표준 브라우저에 권장 Extension 목록만 통제하는 조직에서는, Claude for Chrome이 그 권장 목록에 있고 사용자가 자율적으로 다른 Extension 하나를 추가했다는 사실만으로 위협 모델이 무너집니다.
공개 타임라인
| 날짜 | 이벤트 |
|---|---|
| 2026-04-22 | 영향 받는 v1.0.69 배포 |
| 2026-04-27 | LayerX, Anthropic에 결함 보고 |
| 2026-04-28 | Anthropic “이전 보고와 중복, 곧 수정 예정” 응답 |
| 2026-05-06 | v1.0.70 부분 패치 배포 |
| 2026-05-07 | LayerX, 약 3시간 만에 우회 경로 확인 후 공시 |
| 2026-05-11 | 외신, 추가 패치 부재 후속 보도 |
| 2026-05-13 | 본 글 작성 시점 (추가 패치 미발표) |
보고에서 패치까지 9일, 패치에서 우회 공개까지 1일입니다. 빠르게 막은 흔적은 있지만, “누가 메시지를 보냈는지 다시 설계하는” 종류의 수정은 그 사이에 들어가지 못한 모양새입니다.
사용자가 오늘 할 일
근본 패치가 발표되기 전까지, 권장 조치는 단순합니다.
1) Claude for Chrome Extension 끄기 또는 제거하기
chrome://extensions 에서 Claude for Chrome 항목의 토글을 끄는 것만으로 공격 표면이 즉시 사라집니다. 자주 안 쓴다면 제거가 가장 깔끔합니다. 데스크톱 클라이언트나 웹 claude.ai 사용에는 영향이 없습니다.
2) 끌 수 없다면 민감 세션과 분리하기
Claude for Chrome을 켜 둔 프로파일에는 Gmail, Google Drive, GitHub 같은 민감 서비스에 로그인하지 않습니다. Chrome 프로파일 분리(다른 사용자) 또는 별도 브라우저(Chrome Canary, Firefox 등)로 일/개인 작업과 AI 에이전트 작업을 분리해 둡니다.
3) 다른 Extension도 함께 점검하기
ClaudeBleed의 트리거는 “다른 Extension 하나"입니다. 사용 중인 Extension의 수와 신뢰도를 같이 봅니다.
chrome://extensions → 세부 정보 → 사이트 액세스 / 권한
설치 출처가 불분명하거나, 더 이상 안 쓰는 Extension은 이 기회에 정리해 둡니다. content script 권한이 광범위한 Extension(예: <all_urls>)일수록 위험 가중치가 높습니다.
4) 조직 단위 통제가 가능한 경우
ChromeOS/Chrome Enterprise 환경에서는 ExtensionInstallBlocklist로 Claude for Chrome Extension ID(fcoeoabgfenejglbffodgkkbkcdhcgfn)를 막거나, ExtensionInstallAllowlist로 허용 Extension 목록을 좁힌 뒤 차차 풀어 가는 방식이 안전합니다. BYOD 환경이면 사용자 공지와 함께 자율 비활성화를 권고합니다.
정리
- ClaudeBleed의 본질은 코드 한 줄짜리 버그가 아니라 origin을 신원으로 착각한 설계에 있습니다. Chrome Extension 모델이 허용하는 content script + MAIN world 조합 앞에서 origin 화이트리스트는 ACL 노릇을 못 합니다.
- v1.0.70 패치는 승인 UI 흐름을 추가했지만, 메시지 발신자 신원 검증 부재라는 원인은 그대로 남았습니다. 그래서 Act without asking 모드를 강제 진입시키는 우회 경로가 같은 날 다시 열렸습니다.
- 에이전트가 강할수록 누가 부르는지를 더 정밀히 따져야 합니다. 발신자 인증(서명 토큰, Extension ID 화이트리스트), 행동-바인딩된 일회성 동의가 합쳐져야 비로소 동의가 동의로 기능합니다.
- 추가 패치 전까지는 Claude for Chrome 사용을 잠시 멈추는 게 가장 단순하고 확실한 완화입니다. 끌 수 없다면 민감 세션과 프로파일을 분리합니다.
이번 사건이 Anthropic만의 문제로 끝나지 않을 가능성도 함께 짚어 둬요. 브라우저 안에서 도는 AI 에이전트 Extension은 모두 같은 함정(외부 메시지 채널, DOM을 통한 의미 인식, 자율 모드의 UX/보안 트레이드오프) 위에 서 있어요. ClaudeBleed는 그 함정 중 첫 번째 사례로 기록될 공산이 커요.
참고
- A Flaw in Claude’s Browser Extension Allows Any Extension to Hijack It (LayerX Security, ClaudeBleed 원 공시)
- Vulnerability in Claude Extension for Chrome Exposes AI Agent to Takeover (SecurityWeek, 사건 요약과 Anthropic 대응)
- Researcher hacks Claude Code Chrome fix in 3 hours (Cybernews, 3시간 우회 보도)
- ClaudeBleed Vulnerability Lets Hackers Hijack Claude Chrome Extension to Steal Data (Hackread, 연구자 코멘트 포함)
- externally_connectable (Chrome Developers, 매니페스트 키 공식 문서)