Claude Code ‘다시 묻지 않기’, 승인 명령의 비밀번호도 공개 저장소에 노출될 수 있어
Apiiro 연구원 Shmulik Cohen와 Matan Giladi는 공개 GitHub의 코딩 에이전트 관련 파일과 이력을 조사해 1,994개 저장소에서 비밀정보로 분류한 고유 값 2,539개를 집계했다고 밝혔습니다. Claude Code에서 `Yes, and don't ask again`을 선택하면 승인한 셸 명령 전체가 `.claude/settings.local.json`에 저장돼 명령에 직접 적은 비밀번호나 API 키도 남을 수 있고, 파일이 추적·커밋되면 공개될 수 있습니다. Apiiro는 자격 증명의 유효성을 직접 시험하지 않았으며, 한 회사만 보고서에 나온 키가 실제 활성 상태였다고 확인했습니다.

보안기업 Apiiro의 연구원 Shmulik Cohen와 Matan Giladi는 2026년 11월 5일 공개 GitHub의 코딩 에이전트 관련 파일과 Git 이력을 조사한 결과를 발표했습니다. 두 연구원은 여러 종류의 파일과 이력을 합쳐 1,994개 저장소에서 비밀정보로 분류한 고유 값 2,539개를 집계했습니다. Claude Code에서 확인한 대표 경로는 셸 명령의 영구 승인 기능입니다.
사용자가 Claude Code의 셸 명령 권한창에서 Yes, and don't ask again을 선택하면, 도구는 승인한 명령 문자열 전체를 프로젝트의 .claude/settings.local.json에 허용 규칙으로 저장합니다. 명령에 데이터베이스 비밀번호나 API 토큰을 직접 적었다면 그 값도 설정 파일에 평문으로 남습니다. 연구진은 PGPASSWORD=...가 포함된 데이터베이스 명령, sshpass -p를 쓰는 SSH 명령, 인증 토큰을 담은 요청 등을 사례로 들었습니다. 저장된 규칙은 명령 실행이 끝난 뒤에도 지울 때까지 파일에 남습니다.
Apiiro 연구진은 이 동작이 특정 모델의 응답에서 비롯되는 것이 아니라 Claude Code 자체의 허용 규칙 저장 방식에서 나온다고 설명했습니다. 연구진은 Opus 5.5와 Fable 5.1에서도 재현했다고 밝혔습니다. 16개 코딩 에이전트의 공개 문서를 비교한 결과, 기본 설정에서 승인한 명령 전체를 프로젝트 파일에 저장한다고 확인된 사례는 Claude Code뿐이었다고 Apiiro는 적었습니다. 이 비교는 공개 문서에 나타난 동작을 대상으로 했습니다.
Claude Code는 Git 저장소에서 이 파일을 처음 만들 때 사용자의 전역 Git 제외 목록에 경로를 추가해 커밋에서 제외되도록 합니다. 공식 문서는 이 파일을 한 프로젝트에만 적용되는 로컬 설정으로 설명하며, 사용자가 직접 만든 경우 프로젝트의 .gitignore에 넣도록 안내합니다. Apiiro는 파일이 이미 저장소에서 추적 중이면 추적을 해제하고 저장소 자체의 .gitignore에도 경로를 추가하라고 권고했습니다. 전역 제외 규칙은 해당 개발자의 컴퓨터에만 적용돼 다른 작업 환경의 복제본으로 전달되지 않으며, 저장소가 나중에 만들어지는 경우나 이미 커밋된 파일도 막지 못합니다. 파일이 추적되면 이후 커밋과 푸시를 거쳐 공개될 수 있습니다.
Apiiro는 공개 저장소에서 .claude/settings.local.json 파일 104,185개를 조사했습니다. 파일은 103,617개 저장소에 있었고, 그중 1,122개(약 1.1%)에서 비밀정보를 분류해 고유 값 1,379개를 집계했습니다. 분류 대상에는 공급자별 형식과 일치하는 키, 공개 호스트와 함께 기록된 비밀번호·토큰이 포함됐습니다. 이 수치가 모든 자격 증명의 현재 유효성을 뜻하지는 않습니다.
현재 파일에서 값을 지워도 Git 이력에는 남을 수 있습니다. Apiiro는 현재 파일에서 보이지 않는 비밀정보 734개를 509개 저장소의 과거 이력에서 찾았습니다. 공유 .claude/settings.json, 에이전트 대화 기록과 메모, 배포 기록 등도 조사 대상에 포함했습니다. 이 자료들을 합친 전체 집계가 1,994개 저장소의 고유 값 2,539개입니다. 파일을 현재 버전에서 삭제해도 과거 커밋이나 포크·복제본의 기록까지 사라지지는 않습니다.
Apiiro는 .claude/settings.local.json 파일 104,185개 전체에 Gitleaks와 TruffleHog를 실행했습니다. 비밀정보가 확인된 1,122개 파일 가운데 Gitleaks는 564개, TruffleHog는 643개를 표시했고, 두 도구 모두 표시하지 않은 파일은 215개였습니다. 연구진은 비밀번호가 sshpass -p나 데이터베이스 명령, 인증 헤더 안에 일반 문자열로 들어가면 키 형식을 찾는 규칙에 잘 잡히지 않을 수 있다고 설명했습니다. 이 결과는 해당 파일 표본에서 두 도구가 보인 탐지 결과입니다.
Apiiro는 2026년 11월 1일부터 3일까지 공개 GitHub 기본 브랜치의 코드와 커밋 기록을 읽기 전용으로 조사했습니다. 보고서에서 비밀정보는 공급자별 키 형식과 일치하거나 공개 호스트와 함께 기록된 비밀번호·토큰을 뜻합니다. Apiiro는 후보에서 오탐을 걸러낸 뒤, 대부분의 값은 마스킹된 문맥을 본 독립 LLM 검토와 규칙이 일치할 때 집계했다고 설명했습니다. 메모·인계 기록·Copilot 설정은 규칙 기반으로 분류했습니다. 연구진은 자격 증명을 실제로 사용하거나 호스트에 접속해 유효성을 시험하지 않았으며, 한 회사가 보고서에 나온 키가 실제 활성 상태였다고 확인했습니다.
Claude Code의 내장 privacy mod는 로그인한 계정의 이메일과 User-Agent를 함께 담은 셸 호출을 거부하도록 설계됐습니다. Apiiro 보고서는 사용자가 승인한 명령 문자열이 로컬 설정 파일에 저장되고, 그 파일이 공개 저장소에 올라간 사례를 다룹니다. Apiiro는 이 저장 방식이 2025년 8월 이후 공개 이슈에서 보고돼 왔다고 적었습니다. 또한 비밀값을 명령에 직접 입력하는 대신 변수 참조로 넘겨 허용 규칙에 $DB_URL처럼 변수명만 남기고, 이미 기록된 자격 증명은 교체하라고 권고했습니다. 파일을 삭제해도 Git 이력과 포크·복제본에는 값이 남을 수 있다고 덧붙였습니다.