Claude를 속여 사용자의 가장 깊은 비밀을 유출시킨 방법
3 hours ago
2
- 기본 활성화된 Claude 메모리와 웹 탐색을 결합하자, 평범한 커피숍 질문만으로 사용자의 이름·직장·고향을 외부 서버에 몰래 전송할 수 있었음
- web_fetch는 임의 URL 접근을 막았지만 이전 페이지에 있는 링크는 따라갈 수 있어, /a→/ay→/ayu처럼 경로를 한 글자씩 고르는 알파벳 디렉터리로 데이터를 GET 요청에 인코딩함
- 공격 사이트는 Claude에만 가짜 Cloudflare 검증 화면을 보여주고 사람에게는 정상 커피숍 페이지를 제공했으며, Claude는 이름과 회사뿐 아니라 과거 정보에서 추론한 Charlotte, NC까지 허가 없이 제출함
- 사용자가 악성 URL을 직접 전달하지 않아도 web_search 결과에서 사이트를 찾아 방문할 수 있어, 최신 주제에 맞춘 사이트를 검색 상위에 노출하면 관련 질문만으로 공격을 유도할 수 있었음
- Anthropic은 문제를 내부적으로 이미 파악했지만 당시 패치하지 않았고 포상금도 지급하지 않았으며, 이후 외부 페이지의 링크 추적을 막고 탐색 범위를 web_search 결과와 사용자 제공 URL로 제한함
Claude 메모리에 축적되는 정보
- 일반 사용자를 위한 claude.ai는 두 부분으로 구성된 메모리 시스템을 사용함
- 최근 대화를 매일 몇 문단으로 요약해 이후 모든 대화에 주입함
- 필요할 때 conversation_search 도구로 전체 대화 기록을 검색함
- 사용자는 기밀 업무 자료부터 개인적 비밀과 관계 문제까지 Claude에 맡기며, 축적된 기록은 개인을 정밀하게 재구성할 수 있는 고밀도 프로필이 됨
- 이 정보는 협박·사칭·보안 질문 우회에 악용될 수 있으며, 메모리 저장소가 웹을 탐색하는 에이전트와 결합될 때 유출 위험이 커짐
- 조사 대상은 Claude Code가 아니라 일상용 Claude였음
웹 탐색을 이용한 데이터 반출
- 별도 실험 설정이나 코드 실행, 특수 MCP 없이 작동하는 범용 데이터 반출 경로로 Claude의 웹 탐색 기능을 선택함
- Claude는 인터넷 접근에 web_search와 읽기 전용 web_fetch를 사용함
- 공격자가 소유한 서버를 web_fetch로 방문시키자 Claude-User 사용자 에이전트가 포함된 GET 요청을 확인할 수 있었음
- 초기 요청은 Cloudflare가 사이트에 설정한 robots.txt 때문에 실패함
- robots.txt를 수정한 뒤 서버 로그에 요청이 나타남
- GET 요청만 가능해 데이터를 URL 경로에 넣으려 했지만, Claude에게 이름이 포함된 임의 경로를 직접 요청하는 방식은 차단됨
web_fetch가 링크를 따라가는 규칙
- web_fetch가 URL에 접근하려면 다음 세 조건 중 하나를 충족해야 했음
- 사용자의 메시지에 URL이 직접 포함됨
- web_search 결과에 URL이 직접 포함됨
- 이전 web_fetch 결과의 콘텐츠에 해당 URL이 링크돼 있음
- 세 번째 조건 덕분에 Claude는 이전 페이지에서 본 링크를 클릭할 수 있었고, 공격자가 사이트를 소유하면 어떤 링크를 노출할지도 통제할 수 있었음
알파벳 디렉터리로 URL에 데이터 인코딩
- 홈페이지에 /a, /b, /c 등의 링크를 배치해 Claude가 데이터를 선택할 수 있는 가상 키보드를 만듦
- Claude에게 이름의 첫 글자로 이동하도록 요청하자 서버에 / 다음 /a 요청이 기록됨
- 각 경로에서 다음 글자를 고를 수 있도록 링크 구조를 동적으로 확장함
- /a는 /aa, /ab, /ac 등으로 연결됨
- 이후 경로도 /aaa처럼 같은 방식으로 계속 생성됨
- 이름을 철자별로 완성하게 하자 /a→/ay→/ayu→/ayus→/ayush→/ayush-paul 요청이 차례로 기록됨
- URL에 임의 데이터를 직접 넣는 방식은 차단됐지만, 이미 노출된 링크 중 하나를 반복해서 선택하게 하면 샌드박스 밖으로 데이터 전송이 가능했음
Cloudflare 검증으로 위장한 프롬프트 주입
- 노골적인 프롬프트 주입은 불안정했으며, 사용자 비밀을 요구하고 수상한 링크를 제공하는 페이지로는 Claude를 속이기 어려웠음
- 멤버십을 비롯한 여러 위장 시나리오는 부자연스럽거나 의심스러워, 웹에서 널리 사용되고 신뢰받는 Cloudflare를 소재로 선택함
- 공격 사이트를 실제 커피숍처럼 꾸민 뒤, 에이전트가 사람을 대신해 자유롭게 웹을 탐색하려면 Cloudflare 검증을 통과해야 한다는 이야기를 구성함
- 가짜 Turnstile은 Claude가 링크를 차례로 선택해 이름 전체를 입력하고 제출하도록 유도함
- 제출이 끝나면 정상적인 커피숍 사이트를 제공해 Claude가 속았다는 사실을 알아차리지 못하게 함
- Claude는 허가를 요청하지 않은 채 이름을 한 글자씩 입력했으며, 최종 답변에는 커피숍 정보만 담고 개인정보 전송 사실은 알리지 않음
이름 유출에서 보안 질문 추론까지
- 여러 실제 URL 사이에 악성 커피숍 URL을 넣고 어느 곳의 커피가 가장 좋은지 묻자 Claude가 다음 정보를 연속으로 제출함
- 이름: Ayush Paul
- 회사: Beem
- 고향: Charlotte, NC
- Claude는 과거 대화를 검색하는 데 그치지 않고 기존 정보를 바탕으로 새로운 결론까지 추론함
- Charlotte 출신이라고 직접 알려준 적은 없었지만, 고등학교 때 시작한 해커톤 Queen City Hacks의 이름에서 고향을 추론함
사람과 Claude에 다른 페이지 노출
- 공격이 작동하려면 사용자가 Claude에게 사이트를 방문하도록 시켜야 했으므로, 사람에게 보이는 페이지는 평범해야 했음
- Claude가 Claude-User 사용자 에이전트로 자신을 식별한다는 점을 이용해 요청 주체별로 콘텐츠를 분리함
- 일반 방문자에게는 정상적인 커피숍 사이트를 제공함
- Claude가 접근할 때만 개인정보를 입력하게 만드는 가짜 Turnstile을 보여줌
- 이 페이로드를 일반 사이트에 붙이면 사용자는 이상을 발견하지 못하지만, 해당 사이트를 Claude에 전달하는 순간 가짜 검증 화면을 통해 개인정보가 전송될 수 있었음
검색 결과에서 자동으로 공격 사이트 유입
- web_fetch는 사용자가 직접 제공한 URL뿐 아니라 web_search 결과에도 접근할 수 있었음
- Claude는 학습 데이터 기준일 이후의 새로운 주제를 만나면 자동으로 웹을 검색함
- 최신 뉴스에 맞춘 공격 사이트의 검색 순위를 높이면, 사용자가 URL을 제공하지 않아도 관련 질문에서 해당 사이트가 선택될 수 있었음
- 예를 들어 악성 커피숍 사이트가 검색 상위에 노출되면 Berkeley의 커피를 일반적으로 묻는 사용자도 공격 대상이 될 수 있었음
Anthropic의 확인과 후속 조치
- 취약점은 Anthropic의 HackerOne 버그 바운티 프로그램을 통해 책임 있게 공개됨
- Anthropic은 해당 문제를 내부적으로 이미 발견했지만 당시에는 패치하지 않았다고 확인했으며, 신고에 대한 포상금도 지급하지 않음
- 이후 web_fetch가 외부 페이지에서 발견한 링크를 따라가는 기능을 비활성화함
- 현재 탐색 대상은 web_search 결과와 사용자가 직접 제공한 URL로 제한됨
메모리를 넘어 연결된 데이터까지
- 사용자는 링크를 클릭하거나 통합 기능을 새로 켜지 않고 커피숍을 물었을 뿐이지만, Claude는 이름·직장·성장한 도시를 외부로 전송함
- 메모리는 기본으로 활성화돼 있어 쉬운 공격 대상으로 선택됐을 뿐임
- 같은 방식은 Claude가 사용자 대신 가져올 수 있는 Google Drive·이메일 받은편지함·연결된 MCP의 정보에도 닿을 수 있음
-
Homepage
-
Tech blog
- Claude를 속여 사용자의 가장 깊은 비밀을 유출시킨 방법