用 Claude Code 寫程式時,按下「Yes, and don’t ask again」可能把你剛輸入的密碼一起存下來。資安公司 Apiiro 在 11 月 5 日發表研究,在公開 GitHub 上找到 1,122 份含有疑似機密資訊的 .claude/settings.local.json,包含資料庫密碼、SSH 登入資訊、GitHub/npm 權杖與 AWS 金鑰。
事件經過
- Claude Code 預設在執行多數 shell 指令前會詢問使用者;選擇「Yes, and don’t ask again」後,會在專案的 .claude/settings.local.json 寫入允許規則,之後相同指令不再詢問。
- 若規則是「完整的單一指令」,指令裡直接輸入的密碼或權杖也會以明文存進檔案。
- Claude Code 第一次在 git 專案寫入這個檔案時,會把它加到使用者電腦的全域 git excludes;但這項保護不會跟著專案走,專案本身的 .gitignore 沒有排除它,已經被追蹤的檔案也不受影響。
- Apiiro 研究員在 11 月 1 日至 3 日蒐集公開資料,11 月 2、3 日通知受影響組織,其中一家確認外洩的金鑰當時仍有效。
重點
| 項目 | Apiiro 統計 |
|---|---|
| 公開的 settings.local.json 副本 | 104,185 份 |
| 含疑似機密的副本 | 1,122 份(約 1.1%) |
| 不重複機密值 | 1,379 個 |
| 其中資料庫密碼 | 379 個 |
| 公開伺服器 SSH 登入 | 43 組 |
| GitHub、GitLab、npm 權杖 | 42 個 |
| AWS 金鑰 | 23 組 |
| 含歷史版本、共用設定與對話紀錄的總計 | 2,539 個機密、1,994 個儲存庫 |
- 這些是依格式與上下文判斷的「疑似機密」,Apiiro 沒有實際測試是否仍可用,也沒有證據顯示已遭他人濫用。
- 刪除檔案不等於解決:舊版本仍留在 git 歷史與 fork 中。
- 常見掃描工具會漏抓:在 1,122 份檔案中,gitleaks 標出 564 份、TruffleHog 標出 643 份,兩者都沒抓到的有 215 份,多半是夾在指令裡的密碼(例如 PGPASSWORD=、mysql -p)。
- 早在 2025 年 8 月就有使用者回報同樣行為,相關 issue 後來因長期無活動被機器人自動關閉,並不代表已修正。
- 數字均為 Apiiro 自身研究結果,尚無第三方獨立重現;Apiiro 本身也銷售應用程式與 AI 代理安全產品。
對你的實務建議
企業 / IT 管理者
- 在 GitHub 組織內搜尋 .claude/settings.local.json 與 .claude/settings.json,連同 git 歷史一起檢查,即使目前檔案已刪除。
- 先輪替、再清理:這些檔案曾出現過的密碼、權杖、金鑰全部更換,再處理歷史紀錄。
- 把 .claude/settings.local.json 加入組織的 .gitignore 範本;已追蹤的用 git rm –cached 移除追蹤。
- 將 .claude/、.cursor/、.gemini/ 等 AI 代理設定與記憶檔,視同 .env 納入 pre-commit 與 CI 的機密掃描,並確認掃描規則能抓到指令中的密碼。
- 教育開發者用環境變數或機密管理工具引用憑證,並核准指令「樣式」而不是單一完整指令。
一般用戶
- 自己的專案若用過 Claude Code,打開 .claude/settings.local.json 檢查,刪掉含密碼或金鑰的規則。
- 曾把該檔案推上公開 GitHub 的,相關帳密一律更換。
- 指令中不要直接打密碼,改用環境變數或密碼管理器。
發表留言