資安公司Apiiro在11月5日發布研究報告指出,開發者在Claude Code按下「Yes, and don’t ask again」允許某個指令後,Claude Code會把整行指令連同裡面的密碼,寫進專案資料夾的.claude/settings.local.json。Apiiro在GitHub公開儲存庫找到1122個這種檔案藏有真實的密碼或金鑰。
Apiiro在11月1日到3日搜尋GitHub,找到104185份公開的settings.local.json,分布在103617個儲存庫,其中1.1%藏有真實機密,共1379組不同的密碼與金鑰。再加上git歷史紀錄、共用的settings.json與AI對話紀錄,總數是2539組機密、1994個儲存庫、63個組織。
報告寫道:「儲存庫裡沒有任何東西把這個檔案標成私人檔案,所以它會跟其他程式碼一起被提交。」
資料庫密碼最多,501組能直接連進資料庫
1122個檔案裡的1379組機密,有636組是雲端服務商格式的金鑰,743組是寫在公開主機旁邊的密碼或權杖。依類型分,資料庫密碼最多。
| 機密類型 | 組數 |
|---|---|
| 資料庫密碼 | 379 |
| Supabase service-role金鑰 | 122 |
| Supabase帳號權杖 | 103 |
| SSH伺服器登入 | 43 |
| GitHub、GitLab、npm權杖 | 42 |
| AWS金鑰 | 23 |
| 私鑰 | 6 |
Apiiro列出的受害案例包括一家資料庫廠商自己的雲端API金鑰、一套醫療紀錄App的雲端Postgres擁有者密碼,以及一家支付新創的Postgres密碼,另有43組公開伺服器的SSH登入資料,其中一組是sshpass指令裡的root密碼。Apiiro在11月2日與3日通知了這些單位,其中一家公司證實外洩的金鑰當時仍然有效。
常用的掃描工具也漏掉不少。gitleaks在1122個檔案中標出564個,TruffleHog標出643個,兩套都沒抓出的有215個,大約每5個就有1個。漏掉的多半是直接打在指令裡的密碼,例如PGPASSWORD=、sshpass -p、mysql -p後面接的字串。
全域排除規則擋不住,同類回報從2025年8月就有
Claude Code官方設定文件說明,settings.local.json是不提交的個人設定檔,Claude Code第一次在git儲存庫寫入這個檔案時,會把它加進使用者電腦的全域git排除清單。Apiiro指出,這條規則不會寫進專案自己的.gitignore,換一台電腦clone、之後才初始化的儲存庫,以及早就提交出去的檔案都擋不住。
Apiiro追得到來源的1105個儲存庫中,有539個出現由Claude共同署名的提交改過這個檔案。報告也比較了16款AI寫程式工具,Claude Code是唯一確認預設會把完整的已核准指令寫進專案檔的一款,用Opus 5.5和Fable 5.1模型都重現得出來。
Claude Code使用者從2025年8月起,陸續在GitHub開了#5544、#11982、#13106、#91270四則問題回報這個機制。Apiiro寫道,四則都沒有得到Anthropic回覆,其中3則被系統以閒置或重複為由自動關閉。
用過Claude Code的開發者該做的事
Apiiro建議,如果settings.local.json已經被git追蹤,先執行git rm –cached .claude/settings.local.json,再把它加進專案自己的.gitignore。檔案從沒提交過,也要打開檢查,把含有密碼的規則刪掉。
以後不要把密碼直接打在指令裡,改用$VAR從密碼管理工具讀取;核准指令時選Bash(npm run:*)這類模式,不核准整行寫死的指令。
檔案裡出現過的每一組憑證都要換掉。刪檔清不掉git歷史、分支複本與別人的clone,Apiiro統計有211個分支複本、來自74個儲存庫,帶著同樣的機密;只存在舊版本裡的機密另有734組,分布在509個儲存庫。















