跳至主要內容
科技 分析

密碼放在 1Password,最後被 AI 助手寫進了 GitHub:agent 時代的鑰匙,不能再掛在門上了

一名開發者讓 AI coding agent 從 1Password 讀出密碼並推上 GitHub,這起烏龍照出 agent 時代密鑰管理的新缺口,本文從運作機制與暴露面控制分析一般開發者該怎麼設防。

YIM NEWS 編輯台 閱讀約 5 分鐘

九月六日,開發者社羣 V2EX 上出現一則貼文,標題本身就足夠刺眼:朋友的密碼明明放在 1Password 裡,最後卻出現在開源的 GitHub 儲存庫上。事發經過不複雜,朋友把工作流從一個 coding agent 換到另一個,讓大型語言模型幫忙幹活,agent 在過程中從 1Password 讀出了密鑰,順手寫進了專案檔案。專案後來開源,沒人注意到檔案裡還埋著密碼,就這樣一起推了上去。結果是喫了供應商的工單,好幾個服務的 key 一個一個換。

這件事值得停下來看,倒不是因為它多罕見,而是因為它示範了一種新的洩漏路徑:鑰匙本身鎖得好好的,鎖在哪裡也沒問題,問題出在有一個很勤勞、很聽話、但完全不懂得「哪些東西不該寫下來」的中間人。

洩漏的路徑變了,防護的思路還停在原地

先用一個日常比喻。過去我們防密碼外洩,像防小偷:門鎖好一點、密碼不要重複、釣魚信不要點。這套防護的假設是,鑰匙只會經過你自己的手。

但 coding agent 出現後,等於你請了一位二十四小時待命的助理,它有權限讀你的檔案、跑你的指令、存你的密鑰庫。這位助理能力很強,但它沒有常識裡的「敏感度」。它讀到一個 API key,下一步很合理地判斷「寫進 .env 檔比較方便」,再下一步「這個專案要開源了,全部推上去」。每一步單獨看都說得通,連起來就是一場工單。

發文者自己也承認,罵完朋友之後回頭檢查,發現自己的隔離也沒做徹底:他習慣在 .env 裡放 key 給 agent 用,但 agent 拿到之後會不會寫進別的檔案、會不會打進日誌,他沒辦法每一步盯著看。這段自白比事故本身更有價值,因為它點出了問題的普遍性:多數開發者的安全習慣,是為「人類自己操作」設計的,還沒為「代理人代為操作」重新設計過。

傳統工具為什麼接不住

貼文底下的討論其實是一場小型工具博覽會,也正好呈現了現有解法的格局。

有人推薦 sops 和 Bitwarden Secrets Manager,這類工具的思路是把密鑰加密進版本庫,需要時才解密。有人提到 gitleaks,在 git push 之前掃描一次,看有沒有已知格式的密鑰被夾帶。也有人指出 1Password 本身就有針對 agent 的整合功能。

這些工具各自有效,但都對準的是舊問題的某一環。加密存放解決「存」的問題,掃描解決「出去之前攔一道」的問題。可是 agent 帶來的新問題是行為層面的:密鑰在「被讀取」和「被使用」之間,多了一大段由模型自主決定的操作,它可能把 key 寫進程式碼、寫進測試檔、放進發給外部服務的請求。這段中間地帶,掃描工具只能在最後一刻補救,加密工具則根本不管金鑰解開之後去了哪。

發文者提出的解法:給 agent 一個有守門員的鑰匙圈

發文者順著這個缺口,做了一個 MIT 授權的開源專案 Plankton,定位是專門給 coding agent 用的密鑰管理器。它的核心機制是:agent 透過 Plankton 讀密碼時,Plankton 會分析呼叫鏈的行為,只有當實際行為與使用者事先聲明的「暴露面」完全一致時才放行。換句話說,使用者可以先宣告「這把 key 只允許用在某個網域、不允許落進檔案」,agent 的操作一旦越界,鑰匙就拿不到。

這個設計對準的正是前面說的中間地帶:把「信任 agent」從全有或全無,改成可以逐條聲明的白名單。附帶的好處是完整的審計紀錄,事後可以回查每一次密碼被拿去做什麼,這在傳統流程裡往往是黑箱。

不過貼文底下的質疑也值得記錄。有網友直接懷疑整個故事是為了推廣專案而編的,理由包括帳號歷史和發文模式;原發文者則強調專案純開源、不涉收費。這場攻防本身暫無定論,但無論故事真假,技術缺口是真的:讓 LLM 全權代理操作而密鑰防護原地不動,出事只是時間問題。原發文者自己也給了最樸素也最實用的建議:給 LLM 單獨申請一把 key。人人都知道該這麼做,惰性讓多數人沒做。

一般開發者現在能做的幾件事

把這起事件收斂成可操作的判斷,其實不難。

第一,權限分離。給 agent 用的 key 和給人用的 key 分開申請,前者限縮 scope、設定額度、隨時可撤。這是成本最低、效果最直接的一道防線。

第二,預設 agent 會亂寫檔案。把 push 前的密鑰掃描(如 gitleaks 這類工具)當成必備流程,而不是可選配件。它攔不住所有狀況,但能擋下最常見的「順手推上去」。

第三,密鑰的暴露面要宣告,不能靠默會。無論是用量測工具、用代理層,還是用 Plankton 這類新嘗試,重點都是把「這把 key 可以去哪、不可以去哪」從開發者腦中的默契,變成系統裡可執行的規則。

這次事件沒有釀成大禍,工單、換 key、社羣上一陣調侃,也就過去了。但它留下的訊號很清楚:當寫程式這件事的主導權逐漸移交給 agent,安全模型也要跟著換位。過去鑰匙掛在自己身上,現在得替助理配一把只能開指定門的鑰匙,而且門後有日誌。工具還在演化,規則還在成形,這段空窗期裡,最危險的心態是「我的密碼放在 1Password 裡,所以很安全」。這起案例告訴你,鎖得再好,也擋不住一位太盡責的助理把鑰匙抄在信封上寄出去。

#aicodingagent與密鑰安全#開源供應鏈影響#數位文化與隱私