Trawling

GitGuardian, 공개 GitHub서 Claude Code 설정 파일 비밀값 3만1088개 추적…5343개 당시 유효

GitGuardian 보안 연구원 Guillaume Valadon은 공개 GitHub의 Claude Code 로컬 설정 파일을 2025년 1월부터 2026년 11월 7일까지 추적해 서로 다른 비밀값 31,088개를 집계했고, 5,343개가 발견 당시 유효했다고 밝혔습니다. Docker Hub 조사에서도 두 설정 파일에서 서로 다른 값 613개를 찾아 99개가 당시 유효하다고 판정했습니다. Apiiro의 2,539개와는 조사 시점·대상 파일·집계 방식이 달라 직접적인 증감으로 볼 수 없습니다.

GitGuardian 보안 연구원 Guillaume Valadon은 2026년 11월 9일 공개한 조사에서 2025년 1월부터 2026년 11월 7일까지 공개 GitHub에 푸시된 Claude Code .claude/settings.local.json의 각 버전을 추적했습니다. 서로 다른 비밀값 31,088개가 23,276개 저장소에서 총 71,525회 출현했고, 그중 5,343개는 발견 당시 유효 판정을 받았습니다.

유출 경로의 시작은 Claude Code의 셸 명령 승인입니다. 사용자가 명령을 허용하면서 “Yes, and don't ask again”을 선택하면, Claude Code는 해당 명령을 이후에도 묻지 않을 허용 규칙으로 프로젝트의 .claude/settings.local.json에 기록합니다. 규칙에는 명령 문자열 전체가 들어가므로 curl 헤더나 데이터베이스 연결 문자열처럼 명령에 직접 입력한 비밀번호와 API 키도 파일에 남습니다.

Claude Code는 파일을 생성할 때 로컬 Git에서 무시하도록 처리합니다. 하지만 이 설정은 프로젝트 저장소에 공유되지 않아 다른 개발자의 복제본에는 전달되지 않습니다. 이미 Git이 추적하는 파일은 무시 규칙을 추가해도 추적 상태가 바뀌지 않습니다. Git의 제외 설정과 Docker 빌드에서 파일을 제외하는 설정도 별개입니다.

GitGuardian은 자동 읽기 전용 검사로 유효성을 확인했고, 자격 증명을 다시 사용하거나 명령을 재실행하지 않았다고 밝혔습니다. 유효성 판정기가 없는 유형은 유효한 값으로 세지 않았습니다. 5,343개는 검사에서 유효 판정을 받은 비밀값이며, 전체 31,088개의 약 17%입니다. 이 판정은 발견 당시의 상태를 나타냅니다.

Apiiro가 11월 5일 공개한 2,539개와는 조사 범위가 다릅니다. Apiiro는 11월 1일부터 3일까지 공개 저장소의 기본 브랜치와 커밋 이력을 조사했습니다. .claude/settings.local.json의 현재 사본에서 1,379개, 현재 사본에는 없고 과거 이력에만 남은 값에서 734개를 집계했고, 공유 .claude/settings.json과 에이전트 대화 기록 등의 값도 총계에 포함했습니다. Apiiro는 알려진 키 형식이나 공개 호스트와 함께 나타난 암호·토큰을 기준으로 분류했지만 실제 사용 가능 여부는 시험하지 않았습니다. GitGuardian은 특정 파일의 공개 버전을 장기간 추적해 누적값을 집계하고 발견 당시 유효성을 검사했습니다. 조사 시점과 대상 파일, 수집 방식이 달라 두 수치는 증감으로 연결할 수 없습니다.

Docker 빌드 컨텍스트도 설정 파일이 퍼질 수 있는 경로입니다. 로컬 디렉터리를 빌드 컨텍스트로 지정하면 빌더가 그 안의 파일을 사용할 수 있습니다. 따라서 .gitignore에만 .claude/를 넣어 둔 상태에서 COPY . .를 실행하면, .dockerignore에서 제외하지 않은 설정 파일도 이미지에 복사될 수 있습니다.

GitGuardian은 공개 Docker Hub의 이미지 저장소 543개와 태그 7,625개에서 .claude/settings.local.json과 .claude/settings.json에 든 서로 다른 비밀값 613개를 찾았고, 이 가운데 99개가 발견 당시 유효했다고 밝혔습니다. 유효한 Cloudflare API 토큰 하나는 한 이미지의 559개 태그에서 발견됐습니다. 같은 자격 증명이 여러 태그에 반복 포함되면서 출현 횟수와 서로 다른 비밀값의 수가 달라지는 사례입니다. 저장소에서 파일을 지워도 이미 푸시한 이미지에 담긴 내용은 남을 수 있습니다.

GitGuardian은 파일이 담았던 자격 증명을 먼저 교체하고 허용 규칙에서 비밀값을 삭제하라고 권했습니다. Git 이력과 포크, 이미 푸시된 이미지에 사본이 남을 수 있기 때문입니다. 파일 경로는 프로젝트 .gitignore와 Docker 빌드용 .dockerignore에서 각각 제외하도록 했습니다. 이후 명령에 비밀값 대신 $DB_URL 같은 변수 이름을 쓰면 허용 규칙에는 변수 이름이 기록됩니다. 다만 셸이 변수값을 출력하면 그 값은 대화 기록에도 남을 수 있습니다.

참고 자료

오류 제보