程式碼裡的 API 金鑰外洩:被掃走只要幾分鐘

API 金鑰推上公開的 GitHub 後,可能幾分鐘內就被自動化程式找到並拿去用:Palo Alto Networks Unit 42 的實驗中,攻擊者在金鑰公開後 5 分鐘內就開始使用。發現外洩,第一步是撤銷並更換金鑰,只刪程式碼不夠。

「幾分鐘」是怎麼量出來的?

資安公司 Palo Alto Networks 旗下的 Unit 42 研究團隊在 2023 年 10 月發表研究:他們刻意把一組 AWS(亞馬遜雲端服務)的存取金鑰,放進一個公開的 GitHub 儲存庫(repo,也就是放程式碼的專案空間),觀察誰會來用。結果攻擊者在金鑰公開後 5 分鐘內就偵測到並開始使用;紀錄顯示,AWS 自動替這組金鑰套上隔離限制後僅 4 分鐘,對方就開始探查帳號。

研究團隊判斷,對方是用自動化工具持續複製公開 repo、找裡面的 AWS 金鑰。為了看清完整手法,研究團隊把隔離限制拿掉,接著看到對方在多個區域重複開雲端主機,超過 400 次 API 呼叫只花了 7 分鐘,目的是挖門羅幣(一種加密貨幣)。Unit 42 把這個行動命名為 EleKtra-Leak。

另一家雲端資安公司 Orca Security 在 2023 年 1 月到 5 月做的誘捕實驗(honeypot,故意放出誘餌觀察攻擊者)也看到類似結果:放在 GitHub 的 AWS 金鑰,2 分鐘內就被使用。GitHub 官方文件也直接寫:自動化掃描程式可以在幾分鐘內找到公開曝露的金鑰,幾小時內就可能被惡意利用。

要看清條件:這些數字來自「公開 repo 裡的 AWS 金鑰」。同一份 Orca 報告中,放在 S3 儲存空間的金鑰約 8 小時才被使用,位置不同差很多,但結論一樣:別指望沒人注意到。

平台也有自動防護,例如 GitHub 偵測到合作服務商的金鑰時會通知對方處理,但 Unit 42 也指出,攻擊者可能找得到平台沒偵測到的金鑰。平台的保護是補位,不是保險。

外洩到底有多普遍?

GitGuardian 是專門做金鑰外洩偵測的公司,每年發布《State of Secrets Sprawl》報告。2026 年 3 月發布的第 5 版統計:

  • 2025 年公開 GitHub 的 commit(每一次提交的程式變更)裡,新偵測到 28,649,024 筆密鑰,比前一年多 34%。
  • 與 AI 服務相關的密鑰外洩有 1,275,105 筆,年增 81%。
  • 2022 年偵測到的有效密鑰,四年後仍有 64% 可以使用。
  • 約 28% 的外洩事件來自協作與辦公類工具,而不只是程式碼庫。
  • 內部 repo 含有寫死密鑰的機率,約是公開 repo 的 6 倍。

最後一點值得企業特別注意:「我們的 repo 是私有的」不等於安全。權限給太寬、帳號被盜或整包交出去,裡面的金鑰就跟著出門。

金鑰通常是從哪裡漏出去的?

外洩途徑 常見情境 為什麼危險
推到公開 repo 測試專案、範例程式設成公開 自動化掃描幾分鐘內就可能找到
寫在前端程式或 App 為了方便,把金鑰直接放在網頁程式裡 使用者打開瀏覽器就看得到
留在 commit 歷史 發現後再提交一次把金鑰刪掉 舊版本仍在歷史紀錄,以及別人複製出去的副本(clone、fork)裡
設定檔與聊天工具 .env 設定檔被一起提交、在群組或工單貼金鑰給同事 看得到的人比你想的多
交給外包或 AI 工具 整包專案連同設定檔交出去 金鑰的去向不再由你掌控

把整個專案丟給 AI 程式助理時,.env 這類設定檔很可能一起被讀取、送出,資料邊界可以參考〈AI 說沒讀檔,整個 Repo 卻出門了〉。GitGuardian 也觀察到,AI 輔助產生的程式碼,金鑰外洩率全年平均約是 GitHub 整體基準的兩倍;報告同時提醒,這些外洩可能終究反映人的疏失,不只是 AI 的問題。用 AI 快速做出來的專案還有哪些常見漏洞,可以看〈AI 寫的程式安全嗎?Vibe Coding 常見的資安漏洞〉。

發現金鑰外洩,處理順序是什麼?

GitHub 官方文件寫得很直接:只把金鑰從程式碼刪掉、推一個新 commit,甚至刪掉 repo 重建,都無法阻止金鑰被濫用。建議照這個順序:

  1. 先撤銷或更換金鑰:到服務商後台撤銷並產生新金鑰。公開、仍有效或正式環境用的金鑰,GitHub 建議立即撤銷;擔心服務中斷,可以先產生同權限的新金鑰、讓程式改用新的,再撤銷舊的。
  2. 找出所有用到這把金鑰的地方:程式、部署設定、自動化流程、第三方整合,一起換成新金鑰。
  3. 查使用紀錄與帳單:看服務商的稽核紀錄(例如 AWS 的 CloudTrail),找不明呼叫、新建立的金鑰或帳號,並對照費用與用量。AWS 官方建議檢查所有區域的資源,EleKtra-Leak 正是在多個區域開主機。
  4. 評估影響範圍:這把金鑰能讀寫哪些資料、外洩了多久、有沒有牽涉客戶個資;若涉及個資,後續通報可參考〈個資外洩後企業要做什麼?通報與責任一次看懂〉。
  5. 最後才清理程式與歷史:改寫 Git 歷史有副作用,而且金鑰仍可能留在別人的複本、fork 和引用它的 pull request 裡。GitHub 文件也提到,金鑰撤銷或更換後就無法再使用,有時不必再改寫歷史。

怎麼避免下一次?

  • 金鑰不寫進程式碼:改用環境變數或雲端的密鑰管理服務,.env 加進 .gitignore(告訴 Git 不要追蹤的檔案清單)。Google Cloud 官方文件把「不要把 API 金鑰放在用戶端程式碼或提交到程式碼庫」列為最佳做法之一。
  • 上傳前就擋下來:GitHub 的 push protection 會在含金鑰的推送進到 repo 前攔下。個人帳號版本預設開啟,但只擋推到公開 repo;repo 層級的 push protection 需要 GitHub Secret Protection,預設關閉,要由管理員啟用。預設情況下,有寫入權限的人可以填理由略過,所以仍要搭配審查。
  • 持續掃描:公開 repo 的 secret scanning 免費自動執行,會掃所有分支的完整 Git 歷史;組織的私有 repo 要啟用 GitHub Secret Protection 才有。
  • 最小權限、設上限:每把金鑰只給需要的權限並加上使用限制,每個人、每個應用程式用各自的金鑰;在服務商後台設定用量或費用警示。
  • 定期輪替、刪掉不用的:Google Cloud 建議定期建立新金鑰、更新程式後刪除舊金鑰,也建議刪掉不再使用的金鑰,縮小被攻擊的範圍。

我怎麼知道自己的程式有沒有這個問題?

先用這張清單自問:

  • 程式碼或設定檔裡,有沒有直接寫死的金鑰、密碼或 token?
  • 網頁前端或 App 裡,有沒有能呼叫付費服務的金鑰?
  • Git 歷史裡是否曾提交過 .env,就算現在已經刪掉?
  • 有沒有在聊天群組、工單或文件裡貼過金鑰?
  • 外包交接或人員離職後,金鑰有沒有全部換新?
  • 專案用到的相依套件(別人寫好的程式庫),有沒有已知漏洞?

任何一題答不出來,就值得找人系統性檢查。智盾資安服務的檢測面向之一就是程式源碼與金鑰外洩,涵蓋硬編碼金鑰(直接寫死在程式裡的金鑰)、外洩憑證與有已知漏洞的相依套件,並交付風險分級報告與優先修補建議;奧微本身是軟體開發團隊,檢測後也可協助修補(依需求另議)。程式會一直改,檢測只反映當時的狀態,建議定期複測。

資料來源與核對日期

作者與關係揭露

本文由奧微軟體開發企業社發布。內容為一般資安知識整理,不構成個別系統的檢測結論;奧微軟體提供與本文主題相關的智盾資安服務。

常見問題

API 金鑰外洩了怎麼辦?

先到服務商後台撤銷並更換金鑰,找出所有用到它的服務一起更新,接著查稽核紀錄與帳單、評估影響範圍,最後才清理程式與 Git 歷史。

把金鑰從 GitHub 的 commit 刪掉就安全了嗎?

不夠。GitHub 官方文件指出,只刪程式碼、推新 commit 甚至重建 repo,都無法阻止金鑰被濫用;舊版本還可能留在歷史、複本與 fork 裡,一定要撤銷金鑰。

外洩的 API 金鑰多快會被盜用?

Unit 42 的實驗中,放進公開 GitHub repo 的 AWS 金鑰 5 分鐘內就被使用;Orca Security 的誘捕實驗觀察到 2 分鐘內。不同位置與服務差異很大。

回文章列表