一早滑 Threads、滑 V2EX、滑群組,時間軸幾乎被同一件事洗版:Zeabur 環境變數外洩。官方信寫「機密資訊外洩,Stripe 金鑰有風險,請立刻輪換」。聽起來像標準資安通報。真正讓人崩潰的是下一秒——金鑰還沒換完,OpenRouter 的餘額告警跟自動儲值信已經飛過來。
有人對過 log:有人拿 Zeabur 上存的 sk 在跑 Opus。一條條金鑰直接燒錢。平台幫你管 env,結果 env 自己先漏。
這不是「使用者自己把 key 寫進 Git」那種低級失誤。是託管層把大家的秘密一起交出去。一個洞,全站客戶一起陪葬。
時間線很短,錢燒得很快
開發者社群目前能對上的敘事大致是這樣:
| 時間 | 發生什麼 | 客戶實際感受 |
|---|---|---|
| 約 8 月 28 日起 | 官方信:機密資訊外洩,Stripe 金鑰有風險,請立刻輪換 |
還在拆專案清單、還在登後台 |
| 輪換還沒做完 | OpenRouter 餘額告警、自動儲值信進來 |
金鑰已被拿去打模型 API |
| 對 log 之後 | 被洩的 sk 在跑 Opus |
不是探測流量,是直接燒額度 |
重點不在「有沒有人中獎」,而在攻擊面已經從「可能被用」變成「正在被用」。支付金鑰跟模型金鑰同時出事,代表這批環境變數不是單一服務的設定檔,而是整包生產機密:Stripe、OpenRouter、OpenAI、資料庫密碼、webhook secret,能塞進 Zeabur Variables 的東西,理論上都能被同一條管道帶走。
平台賣的是「你不用自己管伺服器」。客戶付的代價,常常是把整包秘密交給同一扇門。門破了,沒有人可以假裝自己只是使用者設定錯誤。
這跟「自己把 .env 推上 GitHub」不是同一類事故
把 sk_live 寫進程式碼、把 .env commit 上去、CI log 沒遮罩——那些是開發者自己的作業失誤,影響範圍通常是那一個 repo、那一組人。
這次不一樣。客戶是照著 PaaS 的正確用法走:金鑰放在平台的環境變數、不進 Git、由平台注入 runtime。結果漏的是託管層自己。一個漏洞可以同時打到所有把秘密交給它的專案。這叫供應鏈事故,不是新手教學裡的「記得 gitignore」。
白話講:你把保險箱鑰匙寄存在銀行金庫。銀行金庫被撬了。你不能事後被說成「誰叫你把鑰匙給銀行」。給銀行保管,本來就是這門生意的核心。
台灣法規對這件事,牙齒長在別的地方
出事之後大家最常問:官方發一封信,然後呢?罰則呢?時限呢?要不要賠客戶被刷掉的 API 額度、被盜用的付款金鑰、停機的損失?
台灣這邊,牙齒比較利的是政府機關、關鍵基礎設施、特定受監管產業。
- 《個人資料保護法》管的是「個人資料」處理:蒐集、利用、外洩後的通知與損害賠償。金鑰、Stripe secret、OpenRouter sk 本身比較像商業機密與系統憑證,不一定每一筆都能直接套進個資事故的框架;若連帶流出顧客個資、訂單、支付識別資料,才比較容易走到個資法。
- 《資通安全管理法》主要綁公務機關與關鍵基礎設施提供者:資安責任、通報、演練、罰則相對具體。新創 PaaS、對民間開發者賣託管的雲端平台,實務上常常不在這套強制通報與時限的核心射程裡。
- 契約上多半是服務條款:盡力維護、通知、請你輪換金鑰。對客戶被刷的模型額度、停機、商譽,賠償條款通常寫得很薄,甚至接近免責。
結果就是大家這兩天看到的標準作業:先道歉、請你自己換 key。 法規真的不太把「民間開發者把生產機密交給新創 PaaS」這塊當一回事。出事才發現整條鏈沒人負責——平台說已通知,金流商說金鑰在你那邊,模型商說用量是你的帳號,客戶夾在中間自己止血。
這不是幫平台開脫,也不是說台灣完全沒有民法、消保、契約可以走。而是承認一件很難聽的事實:對這種規模的託管外洩,強制通報時限、對客戶的法定賠償、主管機關能不能進場,實務上常常空心。 你的護城河還是自己的輪換速度,不是一封官方信。
現在立刻做,不要等第二封信
順序比心情重要。先斷血,再追究。
- 全部輪換,不要挑著換。 凡是曾經存在 Zeabur 的 API key、資料庫密碼、
Stripe(含 webhook secret 與受限金鑰)、OpenRouter、OpenAI、其他 LLM 供應商、SMTP、OAuth client secret、JWT 簽名、雲端存取金鑰——舊的作廢,新的重生。舊鑰留著「觀察」等於繼續開著水龍頭。 - 查用量與異常呼叫。
Stripe看付款、退款、顧客匯出、金鑰權限;OpenRouter/OpenAI看 token、模型(這次社群已點名Opus)、來源 IP、突然出現的自動儲值。資料庫看連線來源與異常查詢。能關自動儲值就先關,能設硬上限就設硬上限。 - 檢查下游有沒有被拿去對顧客動手。 金鑰外洩不只燒自己的額度,也可能被拿去建假收款連結、讀交易紀錄、改 webhook。支付這條線要當生產事故,不是「AI 帳單變貴了」而已。
- 能搬就評估要不要搬。 至少不要把正式環境的秘密只放在單一平台。正式金鑰用獨立的密鑰管理(雲端 KMS、獨立 vault)、最小權限、依環境拆開;預覽環境不要共用 production secret。平台可以管部署,不該是你唯一的保險箱。
- 留證據。 官方信、時間戳、用量截圖、log、自動儲值信件。之後要談賠償、保險或對客戶交代,靠的是紀錄不是記憶。
| 你以為夠了 | 其實不夠 |
|---|---|
| 只換 Stripe live key | webhook、restricted key、測試金鑰、連動的發票與顧客匯出權限都要重看 |
| 只停 OpenRouter 自動儲值 | 舊 sk 還能打,直到你撤銷;帳號層還要看有沒有被加 webhook 或新鑰 |
| 只改 Zeabur 面板上的值 | 舊值已經在外面,改面板救不了已外洩的那一份 |
| 等官方事後報告 | 燒錢跟盜刷是現在進行式 |
資安沒做好,不是官方發一封信就結束
託管的承諾很誘人:push 就上線、env 幫你注入、不用自己顧機器。這次把那句話翻過來寫——你把秘密集中存放的地方,就是爆破半徑最大的地方。 一個洞打到全站客戶,客戶的錢、服務、信任一起燒掉。
平台該不該負更大的責任?該。台灣法規現在能不能逼它負到和傷害等比例的責任?常常不能。這兩句可以同時成立。所以對還把正式環境金鑰只放在單一 PaaS 的人來說,現在不是發文痛罵的時間,是輪換、查帳、拆單一依賴的時間。
滑脆可以繼續罵草台。金鑰先換完。燒過的額度再算。信任這件事,沒有一封「請立刻輪換」可以自動補回來。