Claude Code 비밀 정보 노출: .claude/settings.local.json 유출 분석

유출 메커니즘

Claude Code의 "다시 묻지 않기(Don't Ask Again)" 기능은 셸 명령에 대한 권한 규칙을 캐싱하여 개발자 워크플로우를 간소화하도록 설계되었습니다. 사용자가 데이터베이스 비밀번호, API 토큰, 클라우드 키와 같은 민감한 정보가 포함된 명령을 승인하면, 에이전트는 전체 명령 문자열을 프로젝트 디렉토리 내의 .claude/settings.local.json 파일에 저장합니다. 이 파일은 프로젝트 폴더 내에 위치하기 때문에 실수로 버전 관리에 포함되는 경우가 많으며, 저장소가 공개 GitHub 호스트에 푸시될 경우 이러한 비밀 정보가 공개적으로 노출될 수 있습니다.

Claude Code는 이 파일을 전역 gitignore 목록에 추가하려고 시도하지만, 파일이 생성된 후 폴더가 저장소로 변환되거나, 파일이 새 머신으로 복제되거나, 개발자가 수동으로 파일을 저장소에 추가하는 경우에는 이러한 보호 기능이 작동하지 않습니다. Apiiro의 연구에 따르면 실제 비밀 정보가 포함된 1,105개의 저장소 중 539개에서 에이전트가 직접 공동 작성한 커밋에 해당 파일이 포함되어 노출이 자동화된 것으로 나타났습니다.

범위 및 영향

Apiiro는 1,994개의 공개 GitHub 저장소에서 2,539개의 실제 비밀 정보를 식별했습니다. 여기에는 프로덕션 데이터베이스 비밀번호, 클라우드 API 키, SSH 루트 로그인과 같은 고가치 자격 증명이 포함되어 있습니다. 그 영향은 스타트업, 소프트웨어 에이전시, IT 서비스 기업을 포함한 63개 조직에 걸쳐 있습니다. 한 사례에서는 데이터베이스 공급업체의 관리자급 클라우드 키가 노출되기도 했습니다.

GitHub를 넘어 위험은 개발자 워크스테이션으로까지 확장됩니다. .claude/settings.local.json 파일은 일반 텍스트로 저장되기 때문에 악성 코드의 주요 표적이 됩니다. 보안 연구원들은 Shai-Hulud npm 웜과 같은 기존 자격 증명 수집 웜이 이미 이러한 유형의 구성 파일을 찾기 위해 로컬 환경을 스캔하기 시작했다고 지적했습니다.

현재 비밀 정보 스캐너의 한계

Gitleaks 및 TruffleHog와 같은 표준 비밀 정보 스캔 도구는 주로 특정 키 형식(예: 공급자 접두사가 붙은 문자열)을 식별하도록 조정되어 있어 이러한 유출을 감지하지 못하는 경우가 많습니다. Claude Code가 캡처한 비밀 정보 중 다수는 명령줄 인수에 직접 포함된 비밀번호(예: PGPASSWORD=... 또는 sshpass -p ...)입니다. 이는 기존 스캐너에게 일반 텍스트로 보이기 때문에 상당한 감지 공백이 발생합니다. Apiiro는 손상된 파일 5개 중 1개가 Gitleaks나 TruffleHog에 의해 전혀 플래그 지정되지 않았음을 발견했습니다.

완화 및 모범 사례

이러한 유출로부터 환경을 보호하기 위해 개발자와 보안 팀은 다음 관행을 채택해야 합니다:

  • 추적 해제 및 무시: git rm --cached .claude/settings.local.json을 사용하여 git 추적에서 .claude/settings.local.json을 즉시 제거하고 프로젝트의 .gitignore 파일에 추가되었는지 확인하십시오.
  • 자격 증명 교체: 비밀 정보가 포함된 파일이 커밋되었다면 해당 자격 증명이 손상된 것으로 간주하십시오. 파일 기록에서 발견된 모든 키, 토큰 및 비밀번호를 교체하십시오.
  • 환경 변수 사용: 명령에 비밀 정보를 직접 입력하지 마십시오. 환경 변수(예: $DB_URL)를 통해 참조하여 캐시된 명령 문자열에 원본 비밀 정보가 아닌 변수 이름만 포함되도록 하십시오.
  • 향상된 스캔: CI/CD 파이프라인 및 pre-commit 훅을 구성하여 표준 키 형식을 넘어선 패턴, 특히 명령 내 비밀번호 패턴을 찾도록 스캔하십시오.
  • 에이전트 샌드박싱: 에이전트를 격리된 환경에서 실행하거나, 에이전트가 승인되지 않은 쓰기 작업을 수행하거나 민감한 서비스에 액세스하는 것을 제한하는 API 프록시 사용을 고려하십시오.

커뮤니티 통찰

개발자들 사이의 토론에서는 도구의 동작이 기여 요인이기는 하지만 근본 원인은 엄격한 보안 위생의 부족인 경우가 많다는 점이 강조되었습니다. 댓글 작성자들은 다음과 같이 언급했습니다:

"근본적인 문제는 버튼이 아니라 허용 목록이 전체 명령 문자열을 저장한다는 점입니다... 비밀 정보는 환경 변수를 통해서만 명령에 들어가야 하며, .claude/는 저장소가 아닌 머신 전체의 전역 gitignore에 있어야 합니다."

다른 이들은 커밋되는 내용을 수동으로 확인하지 않고 자동화된 도구에 의존하는 것은 위험한 관행이라고 강조했습니다. 한 사용자는 "봇 자동화에만 의존하지 말고 스스로 책임을 져야 합니다... 모든 사람이 영원히 볼 수 있는 곳에 무언가를 넣기 전에 내용을 읽어보세요."라고 지적했습니다.

Sources

관련

  • Dispatch
  • 프로젝트
  • Dispatch
  • 프로젝트
  • 프로젝트