Apiiro, Claude Code 설정 파일서 비밀정보 발견
- •Apiiro 연구진, 공개 GitHub 저장소 1,994곳에서 비밀정보 2,539건 확인…조직 63곳 영향
- •공개된 Claude Code 설정 파일 104,185개 중 1,122개에 비밀정보 포함…탐지 도구가 215개 파일 놓쳐
- •사용자가 ‘예, 다시 묻지 않기’를 선택하면 Claude Code가 승인 명령을 프로젝트 권한 파일에 저장
Apiiro 연구진 슐물릭 코언(Shmulik Cohen)과 마탄 길라디(Matan Giladi)는 2026년 11월 5일, 개발자가 명령 실행을 승인할 때 코딩 에이전트가 프로젝트 파일에 비밀정보를 저장할 수 있다고 보고했습니다. 공개 GitHub 저장소 1,994곳에서 실제 비밀정보 2,539건을 찾아 조직 63곳이 영향을 받았습니다. 유출 정보에는 데이터베이스 비밀번호, 클라우드 키, API 토큰, SSH 로그인 정보가 포함됐으며, 한 회사는 자사 키가 실제로 활성 상태였다고 확인했습니다.
Claude Code는 셸 명령을 실행하기 전에 사용자에게 확인을 요청합니다. 사용자가 ‘예, 다시 묻지 않기’를 선택하면 승인된 명령을 프로젝트 권한 규칙으로 `.claude/settings.local.json`에 저장합니다. 설정 파일의 명령에 구성 파일에서 복사한 비밀정보가 들어 있으면 그 정보도 규칙에 저장됩니다. 이 파일은 개발자 컴퓨터에 남도록 설계됐으며, 저장소 안에서 생성될 경우 Claude Code는 이를 사용자의 전역 Git 제외 목록에 추가합니다. 그러나 폴더가 나중에 저장소가 되거나 파일이 이미 커밋된 경우에는 보호되지 않을 수 있고, 저장소 자체의 `.gitignore`에는 규칙이 추가되지 않습니다. Apiiro는 이 동작이 모델이 아니라 Claude Code에서 비롯됐다고 밝혔으며 Opus 5.5와 Fable 5.1로 재현했습니다.
GitHub에서 확인한 공개 `.claude/settings.local.json` 파일 104,185개 가운데 1,122개에 실제 비밀정보가 있었습니다. 이 파일들에는 서로 다른 비밀정보 1,379건이 있었으며, 제공업체 키 636건과 공개 호스트의 비밀번호 또는 토큰 743건으로 구성됐습니다. 연구진은 이전 파일 버전에서도 저장소 509곳의 비밀정보 734건을 찾았고, 저장소 74곳의 포크 211개에도 같은 정보가 있었다고 밝혔습니다. 비밀정보의 이력을 추적한 저장소 1,105곳 중 539곳에서는 Claude가 공동 작성자로 표시된 커밋이 해당 파일을 변경했습니다.
공개 허용 목록에 실제 비밀정보가 든 조직은 63곳이었습니다. 사례에는 데이터베이스 업체의 클라우드 API 키, 운영 환경의 Azure Postgres 비밀번호, Square 운영 토큰, 의료 기록 데이터베이스의 소유자 비밀번호가 포함됐습니다. 파일에서는 공개 서버용 SSH 인증 정보 43건도 발견됐습니다. 다른 에이전트 관련 파일에서는 공유 `.claude/settings.json` 76,011개 중 298개, 저장소 87곳의 대화 기록 파일 120개, 저장소 9곳의 메모리 파일, 인계 또는 배포 메모 33개에서 비밀정보가 나왔습니다. VS Code Copilot의 자동 승인 설정 173곳 중에서도 영향을 받은 저장소 9곳을 확인했습니다.
비밀정보 탐지 도구는 자격 증명 상당수를 놓쳤습니다. Gitleaks는 실제 비밀정보가 든 파일 1,122개 중 564개를, TruffleHog는 643개를 표시했고, 215개는 두 도구 모두 탐지하지 못했습니다. Apiiro는 일반적인 명령줄에 적힌 비밀번호가 익숙한 제공업체 키 형식과 일치하지 않는 점을 주된 원인으로 들었습니다. 예로 `PGPASSWORD=`, `sshpass -p`, 베어러 인증 헤더가 있으며, 연구진은 같은 유형의 정보가 에이전트 대화 기록과 메모리, 인계 메모에도 나타날 수 있다고 밝혔습니다.
Apiiro에 따르면 집계한 파일은 모두 2026년 11월 2일 당시 각 저장소의 기본 브랜치에 있었으며, 실제 비밀정보가 발견된 저장소에서 해당 파일의 최초 커밋 시점은 중앙값 기준 217일 전이었습니다. 연구진은 2026년 11월 2일과 3일에 해당 조직 사례를 소유자에게 알렸습니다. 자격 증명을 파일에서 삭제해도 Git 이력과 포크, 복제본에는 사본이 남을 수 있어 연구진은 발견된 자격 증명을 교체하고 로컬 파일에서 비밀정보가 든 규칙을 지우라고 권고했습니다. 명령어에 비밀정보를 직접 입력하는 대신 `$DB_URL` 같은 환경 변수를 사용하고, 실제 명령어 대신 명령 패턴을 승인하며, 에이전트 폴더와 저장소 이력에서 명령어에 삽입된 비밀번호를 검사하라는 권고도 내놨습니다.
연구는 2026년 11월 1일부터 3일까지 읽기 전용 GitHub 코드 및 커밋 검색으로 진행됐습니다. Apiiro는 로컬 설정 파일 104,185개와 공유 설정 파일 76,011개를 내려받았고, 파일 이력 확인은 저장소 43,120곳을 대상으로 했습니다. 연구진은 이력 조사 건수가 실제 규모의 하한선이라고 설명했습니다. 자격 증명을 사용하거나 시험하지 않았고 해당 호스트에 연락하지도 않았습니다. ‘실제 비밀정보’는 제공업체 형식과 일치하거나 공개 호스트 정보와 함께 나타난 자격 증명을 뜻하며, 작동 여부가 확인된 정보라는 뜻은 아닙니다. 독립적인 대규모 언어 모델 검토자가 마스킹된 맥락에서 남은 서로 다른 값 2,774개를 평가했고, 연구진은 검토 결과와 자체 기준이 일치한 2,539개를 실제 비밀정보로 집계했습니다.