데이터베이스 접속 명령은 한 번 실행되고 끝날 수 있습니다. 하지만 그 명령을 다음에도 허용하기 위해 저장한 문자열은 설정 파일과 Git 이력에 남을 수 있습니다. 실행 승인과 정보 보존은 서로 다른 결정입니다.
Apiiro의 11월 5일 조사, 11월 8일 업데이트는 Claude Code의 반복 승인 규칙에 비밀정보를 포함한 명령이 저장되는 경로를 보고합니다. 아래에서는 업체가 집계한 노출 규모와 우리가 로컬에서 검증한 Git 동작을 구분합니다.
숫자의 분모를 먼저 고정한다
| 조사 항목 | Apiiro 보고값 | 이 글의 확인 범위 |
|---|---|---|
| 공개 settings.local.json 파일 | 104,185개 | 업체 집계 확인, 재수집 안 함 |
| 그중 실제 비밀정보가 있다고 분류한 파일 | 1,122개 | 업체 분류, 독립 재판정 안 함 |
| 이력·다른 산출물까지 합친 범위 | 1,994개 저장소, 2,539개 비밀정보 | 위 파일 수와 분모가 다름 |
출처: 원문의 How many / Method and limits. 공개 파일 표본을 모든 사용자나 비공개 저장소의 노출 확률로 확대할 수 없습니다. 이 글에서는 공개된 자격증명을 다운로드하거나 유효성 검사를 하지 않았습니다.
중요한 메커니즘은 숫자와 별개로 살펴볼 수 있습니다. 민감한 값이 포함된 명령을 저장하고, 저장 파일이 추적 대상이 되어, 공유되는 경로입니다. 자동 실행 설정 전체가 같은 방식으로 동작한다고 일반화해서는 안 됩니다.
경계를 넘을 때마다 별도의 결정이 있다
비밀정보가 필요한 작업
│ 실행용 값 제공
▼
셸 명령 / 도구 입력
│ 재사용을 위해 기록
▼
승인 규칙 / 대화 기록 / 작업 메모
│ Git 추적 또는 패키징
▼
이력 / 복제본 / 배포 산출물
이 도식은 CodeBridge의 위협 모델입니다. 특정 버전의 모든 도구가 이 순서를 따른다는 구현 명세가 아닙니다. 첫 단계에서 필요한 비밀정보가 마지막 단계의 독자에게도 필요한 것은 아닙니다. 따라서 에이전트가 작업할 수 있는지와 그 작업 기록을 어디에 남길지를 따로 설계해야 합니다.
환경변수 참조가 명령문에 값을 직접 넣는 일을 줄일 수는 있습니다. 그러나 set -x, 디버그 로그, 명령 출력이나 도구의 입력 캡처가 실제 값을 남기면 노출은 다시 생깁니다. “환경변수를 썼다”만으로 모든 산출물이 안전해지는 것은 아닙니다.
gitignore는 이미 추적한 파일을 지우지 않는다
이 부분은 Claude Code를 실행하지 않고도 검증할 수 있습니다. 빈 JSON만 넣은 임시 저장소에서 파일을 먼저 stage한 뒤 ignore 규칙을 추가했습니다.
1. 빈 임시 Git 저장소 생성
2. .claude/settings.local.json에 {} 저장
3. 해당 파일을 git add
4. .gitignore에 같은 경로 추가
5. git ls-files와 git check-ignore --no-index로 각각 검사
Node.js 18 이상과 Git이 필요합니다. 이 프로젝트 루트에서 node docs/editorial/2026-11-08/evidence/tracked-ignore.mjs로 재현할 수 있습니다. 실제 실행 결과:
ignore rule matches: true; file remains tracked: true
Empty synthetic JSON only; no Claude Code or real credentials used.
ignore 규칙이 존재한다는 사실과 현재 파일이 추적되지 않는다는 사실은 다릅니다. 이 실험은 빈 파일로 Git의 경계만 확인했습니다. Apiiro가 보고한 에이전트 동작이나 노출 규모를 독립 재현한 것은 아닙니다.
검사 결과에는 비밀값을 남기지 않는다
팀 저장소에서 먼저 확인할 것은 파일 내용보다 추적 상태입니다. 아래는 읽기 전용 점검 명령입니다. 파일명과 해당 경로의 커밋 메타데이터만 출력하며, 본문은 출력하지 않습니다.
git ls-files -- .claude/settings.local.json .claude/settings.json
git log --format='%h %cs' -- .claude/settings.local.json
이 명령은 해당 제품을 설치하지 않아도 쓸 수 있지만, 출력이 없다고 노출이 없었다는 뜻은 아닙니다. 다른 브랜치·파일명·아카이브를 포함하지 않기 때문입니다. 실무 저장소를 대상으로 실행한 결과는 이 글에 없습니다.
내용 검사는 조직의 승인된 secret scanner에서 수행하고, 보고서에는 발견 위치와 유형을 남기되 원문 비밀값을 복사하지 않는 편이 좋습니다. GitHub의 secret scanning 설명은 이력 검사와 발견한 자격증명의 즉시 교체를 안내합니다. 도구의 탐지 범위와 조직 설정은 별도로 확인해야 합니다.
삭제보다 먼저 접근 권한을 끊는다
이미 공개된 값이라면 파일을 지우거나 추적에서 빼는 조치만으로 복제본의 값을 무효화할 수 없습니다. 발급 시스템에서 해당 자격증명을 폐기·교체하고, 의존 서비스의 전환과 사용 기록을 확인하는 작업이 필요합니다. 이후 추적 설정과 보존 정책을 수정해야 같은 경로가 반복되지 않습니다.
장기적으로는 실행 전 권한 검사, 기록 시 비밀값 최소화, stage/푸시 전 검사, 공개 후 대응을 서로 다른 통제로 관리하세요. 한 통제가 통과했다고 다른 통제를 생략할 근거는 없습니다. 승인 버튼을 줄이는 것과 정보의 수명을 통제하는 것은 독립적인 엔지니어링 과제입니다.
관련 배경: 에이전트 보안과 샌드박스.