密碼換過了,只是換成猜得到的那一組
一台自架的自動化工作流程平台,資料庫對外開著、密碼是「舊密碼加日期」。10 月 15 日凌晨,兩把只存在那裡的 Google 憑證開始被盜打 Gemini;同一段時間,資料庫 log 留下一筆有人翻憑證表的查詢。
- 10 月 15 日凌晨 00:16,資料庫 log 留下一筆有人直接連進來翻憑證表的查詢;27 分鐘後,兩把只存放在自架工作流程平台憑證庫裡的 Google 憑證開始大量盜打 Gemini,合計約六萬次呼叫。
- 資料庫對外開著,root 密碼是 8 月外洩事件後「舊密碼+0829」的輪替結果;平台用來加密憑證的金鑰,則引用了同一次外洩中流出、之後一直沒換的環境變數。
- 上午 10:14 作廢金鑰、10:36 停用服務帳戶後盜打停止;下午改成 32 字隨機密碼、關閉對外 port,傍晚換掉加密金鑰。帳單確認為 US$1,976.01(含同期另一把被盜打的金鑰),Google 最終認定 US$1,978.26,核准 US$1,497.77 的一次性調整,以抵免額入帳,約七成六;攻擊者來源 IP 仍是空格。
換了鎖,鑰匙還是同一把的形狀
想像你家遭小偷,鑰匙被複製走了。你請鎖匠換鎖,新鑰匙卻只是在舊鑰匙尾端多磨了一個齒。手上有舊鑰匙的人,試幾次就打得開。
這次的「鎖」是一台自架的 n8n——我們拿來串排程、同步資料、呼叫 AI 的工作流程平台——背後的 PostgreSQL 資料庫。8 月 27 日那次環境變數外洩之後,我們在 8 月 30 日輪替了這個資料庫的 root 密碼,新值是「舊密碼後面加上 0829」。資料庫的 TCP port 一直對外轉發,網路上的掃描器每天都在敲它。10 月 15 日凌晨,有人不再只是敲門。
這是自家事件,第一手資料是我們自己的資料庫 log、Google Cloud 的 Monitoring 與 Audit Log。下面的時間全部是台北時間,證據照三級擺。
- 2026-08-27部署平台環境變數外洩,其中包含這台資料庫的舊密碼,以及平台本身的 PASSWORD 變數(之後被用作憑證加密金鑰)INC-2026-0827 調查紀錄
- 2026-08-30資料庫 root 密碼輪替,新值為「舊密碼+0829」;平台的 PASSWORD 變數沒有換。同日把一把新的 Gemini API key 放進平台憑證庫(只限 Gemini API,未綁來源 IP)輪替腳本紀錄、部署平台變數現況
- 10-15 00:16資料庫 log 出現一筆不是平台本身發出的查詢:用字串串接的方式撈「credentials_shared」表,表名猜錯而報錯PostgreSQL runtime log(ERROR 與 STATEMENT 各一行)
- 10-15 00:43兩把憑證開始大量呼叫:具 Owner 權限的 GCP:Service Account 金鑰打 Vertex AI Gemini(europe-west1),Gemini API key 第一批呼叫出現,01:13 起每小時數千次,尖峰 8,039 次/小時Monitoring 依憑證分組的分鐘級請求數
- 10-15 01:14Audit Log 記下 Google 為該專案初次建立 Vertex 服務代理Cloud Audit Logs(服務代理 SetIamPolicy)
- 10-15 10:14–10:36看到帳單異常後作廢服務帳戶金鑰、刪除 API key、停用服務帳戶;兩條曲線隨即歸零IAM Audit Log、Monitoring
- 10-15 16:02–16:04資料庫 root 改為 32 字隨機密碼並回填平台、重啟驗證;關閉資料庫對外轉發,只留內網本站處置紀錄、部署平台 API 回應
時間線裡最值得盯的是第三、四格之間的 27 分鐘:00:16 有人在資料庫裡找憑證,00:43 兩把憑證開始計費。先翻抽屜、再拿鑰匙出去用,順序對得上。
這裡要更正一件事。初版我們寫「服務帳戶金鑰在 00:01、00:02 各被呼叫 1 次,像是在驗證金鑰」,並據此推論攻擊者早在資料庫查詢之前就拿到鑰匙。之後把 Monitoring 拉到全 API、拉長到 30 天才發現,那兩筆是試算表 API 的讀取,平台每小時 :01、:02 都會跑一次,是自己的正常排程。這把金鑰第一次呼叫 Vertex AI,是在 00:43。看請求曲線時只看出事的那個 API、只看出事那一天,很容易把自己的排程誤認成攻擊者。
發現它的,又是帳單頁
這起事件不是被資料庫告警抓到的,因為資料庫沒有任何告警;是隔天上午看到 Google Cloud 帳單出現兩個異常項目,才往回追。兩個異常分屬兩個不同的 GCP 專案、兩種不同的憑證,看起來毫無關係。
把它們接起來的是時間:兩條請求曲線在同一個小時內從零起飛。再往下查,兩把憑證唯一的共同點,是它們都只存在同一個地方——那台工作流程平台的憑證庫。本機、repo、其他服務都沒有這兩把;只有平台裡有。
攻擊者怎麼做到
到這裡,其實已經足夠理解整起事件。如果你關心的是該怎麼避免,可以直接往「如何避免」繼續閱讀。如果你想知道我們怎麼把兩張帳單接回同一個資料庫,下面開始進入技術拆解。
白話結論:攻擊者沒有用任何漏洞。他需要的三樣東西,有兩樣早在八月就流出去了,第三樣只要用猜的。
接下來這一段會稍微技術一些。你只需要先記住一件事:這個平台把所有憑證加密存在資料庫裡,而加密用的金鑰,就是八月那包外洩的環境變數裡的其中一個值。
深入閱讀對照 MITRE ATT&CK:從資料庫到帳單的四格第一格的來源 IP 是空格,其餘三格證據完整
這次外洩了什麼
這張表很長,是因為一個憑證庫被打開,裡面的每一把都要算進去。
| 服務 | 憑證類型 | 用途 | 存在形式 | 放在哪 | 權限範圍 | 狀態 |
|---|---|---|---|---|---|---|
| PostgreSQL(工作流程平台的資料庫) | root 密碼 | 平台連線自己的資料庫 | 明文環境變數 | 部署平台環境變數;資料庫 TCP port 對外轉發 | 整個資料庫的超級使用者,可讀寫所有表 | 10-15 改為 32 字隨機值並關閉對外 port |
| n8n 憑證加密金鑰 | 對稱加密金鑰(引用平台的 PASSWORD 變數) | 加密存在資料庫裡的所有憑證 | 明文環境變數 | 部署平台環境變數;8 月 27 日已隨環境變數外洩 | 可解開憑證庫裡的每一筆憑證 | 10-15 17:28 換成隨機值,憑證庫 42 筆憑證全部重新加密 |
| GCP IAM(Vertex AI) | Google Service KEY JSON(GCP:Service Account 使用者管理金鑰) | 工作流程呼叫 Google 服務 | JSON,加密後存在平台憑證庫 | 工作流程平台憑證庫(本機另有一份原始下載檔) | 專案 Owner | 10-15 10:14 金鑰停用、10:36 服務帳戶停用 |
| Google Gemini API(Generative Language API) | API key(AIza 開頭格式,已遮蔽) | 工作流程呼叫 Gemini | 字串,加密後存在平台憑證庫 | 工作流程平台憑證庫 | 只限 Gemini API;未綁來源 IP、無用量上限 | 10-15 10:14 已刪除 |
| 憑證庫內其他憑證(多組 MySQL、SSH 私鑰、Google 相關) | 密碼/私鑰/token | 工作流程連線各資料庫與主機 | 加密後存在平台憑證庫 | 工作流程平台憑證庫 | 各自不同 | 沒有被使用的直接證據,但視為已外洩,輪替中 |
最上面兩列是根因,第三、四列是帳單,最後一列是接下來兩週的工作量。
我們怎麼處理
上午看到帳單的當下,先做的是止血,不是追查:作廢服務帳戶金鑰、刪除 Gemini key、停用服務帳戶。這三步在二十分鐘內完成,兩條曲線在下一個小時區間歸零。
下午把兩張帳單接回同一個資料庫之後,處理的是根因。資料庫 root 改成 32 字的隨機密碼,先在資料庫端改、用新密碼驗證登入,再把平台的連線設定回填,重啟平台確認它能用新密碼連回去。接著把資料庫的對外轉發整個關掉,只留下平台在內網使用的 port,從外面再也敲不到。
傍晚換掉了那把主鑰:產生新的隨機加密金鑰,把憑證庫 42 筆憑證全部用新金鑰重新加密,重啟後確認 46 個工作流程正常、log 沒有解密錯誤。第一次嘗試只改了環境變數,沒改平台存在磁碟上的設定檔,平台因為「加密金鑰不一致」反覆重啟了六分鐘,先用備份回滾,再連設定檔一起改才成功。換主鑰之前先做備份、確認它存在哪幾個地方,這一步省不得。
還沒做完的有兩件:憑證庫裡其他每一組資料庫密碼、SSH 私鑰都要當成已外洩輪替;平台本身要升版。
申請減免:一張 US$1,976 帳單的申訴實錄
止血和修根因都是技術問題,申請費用減免則是流程問題。我們以為開個工單、貼上報告就結束了;實際走一遍,中間卡了七次,最後拿到的答覆也跟想像的不一樣。這一節把整個過程照時間順序記下來,下一個收到盜刷帳單的人,可以少走幾步冤枉路。
先把申訴的材料準備好
開口之前,先準備了四樣東西:明確的時段與金額、事發前後的用量對照、處置時間戳,以及一份書面報告。
金額不是自己從帳單頁加總,而是請 Console 的帳單助理依專案與 SKU 算出 10-14 到 10-15 這段期間的費用:US$1,976.01,涵蓋三個專案。除了前面那兩把,還有一把同期被盜打的服務帳戶金鑰,它在八月就外洩了。證據檔共 14 個:依 SKU 與服務分列的帳單報表、三把憑證各自的 30 天用量圖與放大圖、每小時請求數 CSV、IAM 稽核記錄,以及資料庫那一筆異常 SQL 的 log 節錄。
書面報告參考了網路上爭取成功的案例,共同點只有幾個:事前的基準線加上暴增曲線、SKU 明細、每一步處置的時間戳、已經補上的防線、明確的金額與時段,最後主動要求案件編號與審核時程。報告也老實寫了我們自己犯的錯,包括可預測的密碼和沒換的加密金鑰。
卡關一:找不到開申訴的入口
第一個直覺是 Console 左側選單的「支援 → 客服案件」。點進去,中間一條灰色提示寫著目前的支援方案不提供這項服務,要先選購付費方案才能建立案件。我們用的是免費的 Basic 方案,技術客服案件開不了。
第二個直覺是網路文章常引用的公開帳單表單。打開才發現它已經停用,網址會直接轉到官方說明頁「取得 Cloud Billing 支援」。說明頁的意思很清楚:帳單問題現在只剩一個入口,而且是免費的。
正確的路徑是這樣:
Google Cloud Console
→ 左側選單「支援」
→ 「帳單問題支援」(頁面寫著:取得免付費的帳單助理支援服務)
→ 兩個按鈕:
「取得帳單支援」 ← 第一次申訴從這裡進
「管理現有的帳單客服案件」 ← 之後上傳附件、留言、追蹤進度用
只有帳單帳戶管理員能查看和更新帳單案件。如果點得進入口、卻看不到案件,先檢查自己在帳單帳戶上的角色。
同一頁的上方還有一條紅色橫幅:「系統偵測到您的一項專案可能違反《使用限制政策》」。它跟帳單申訴無關,是被停權專案的申訴入口,後面會再講。
卡關二:先跟機器人講,再轉真人
按下「取得帳單支援」,接手的是 AI 帳單助理。它的開場白要你用幾句話說明問題,並說隨時可以要求轉接真人,它會把對話紀錄一起轉過去。聊天視窗不能上傳附件。
這時不要貼整封長信。我們送出的是一段五、六行的摘要:帳單帳戶、三把憑證外洩、呼叫次數與金額、上一個帳單週期幾乎是零、其中一個專案已被 Google 以盜用為由停權、我們已撤銷金鑰並修好根因、手上有完整報告。最後一句直接寫明要轉真人:AI 助理不能核准退費,這類案件一定要真人處理。
助理的回覆比預期有用。它依帳單帳戶查了 10-14 到 10-15(太平洋時間)的費用,列出 Gemini API US$1,623.04、Vertex AI US$352.97(已扣抵免),合計 US$1,976.01,並說系統已經把這幾筆暴增標記為成本異常。最後它問:要不要現在幫你轉接真人客服?
這組數字成了後面的申請金額。原本我們從帳單報表算的是整個 10 月,多了約 US$18;助理算的是盜打那兩天,而且是 Google 自己的數字,拿來申請更站得住。我們回覆確認轉接,並在同一句寫上「申請金額就是你算的 US$1,976.01」。
不到兩分鐘,真人客服就接手了。他的第一句話是問還有什麼要補充。我們先送一段重點,請他建立帳單案件讓我們上傳附件;再把約 8,000 字元的完整報告整份貼上。聊天框收下了,不用拆段。
卡關三:案件是聊天自動建的,主旨就是你的第一句話
真人客服接手後,給的案件編號是聊天開始時就自動建立的。案件主旨直接用了我們在聊天裡的第一句話,看起來不像一份正式申訴。這不影響審核,但第一句話最好一次寫清楚帳戶、時段、金額和訴求,因為它會一直掛在案件標題上。
卡關四:客服報的金額跟我們的不一樣
真人客服花七分鐘查完帳戶,報出的卻不是帳單助理算的那組,而是整個 10 月到目前為止的數字:Gemini API US$1,641.81,比助理算的多了約 US$18。差額是盜打那兩天以外的正常用量。機器人和真人各查各的,數字不一定對得上。
我們主動說明只申請盜打時段的 US$1,976.01,其他日期是正常用量、不在申請範圍內。理由很簡單:數字精確,比數字大更容易被核准,也不會讓人覺得我們在順便多要。
卡關五:聊天在最後一個問題斷線
客服問完「您認得這三個專案嗎」之後,聊天就斷了,問題沒來得及回答。斷線後才發現兩件事:聊天紀錄不會出現在案件頁上,是事後另外用 email 寄來;而客服口頭說「附件用 email 寄」,但案件頁本身就有附件欄。
最後的處理方式是改從案件頁接續:直接打開案件,在附件欄上傳 14 個檔,再在案件歷史記錄留言,補答「三個專案都是我們的,但那段用量不是我們用的」,並說明附件已上傳、會等 32 小時後的通知。當天晚上客服來信道歉,說稍晚會主動聯絡,從斷線的地方接著處理。
卡關六:被停權的專案要另外申訴
三個專案裡,有一個在盜打期間就被 Google 的濫用偵測自動停權了。費用減免走帳單案件,停權要走另一條管道:專案頁上方的紅色橫幅會連到申訴表單,送出後由另一個團隊處理,會另外寄一封確認信、給另一組單號,通常兩個工作天內回覆。這個專案的服務帳戶擁有上萬個雲端硬碟檔案,停權期間讀不到也搬不走,所以我們申請的是復權,並寫明「不要求恢復任何 AI 用量」。
Google 的正式答覆:「費用有效」,但給一次性調整
斷線後我們改從案件頁接續:先上傳 14 個證據檔,再留了兩則訊息:一則重申申請內容和兩個待確認的問題,一則補答「三個專案都認得,但用量不是我們的」。當天晚上客服在案件裡正式回信。前半段很直接:Google Cloud 是共同責任模式,執行個體與憑證的安全是客戶自己的責任,這類情況產生的費用屬於有效費用,照規定原本不能爭議。後半段才是重點:作為客戶的通融,他會替我們申請一次性調整(one-time adjustment)。
第一次讀到「charges are considered valid」很容易以為被拒絕了。其實這正是成功案例的典型說法:Google 不會承認費用無效,減免一律以「一次性通融」的名義給。所以申訴信不必爭「這不該算我的」,要證明的是三件事:用量確實不是我們產生的、我們已經止血並修好根因、以後不會再發生。
- 19:24 上傳 14 個證據檔到案件14 evidence files uploaded to the case
- 我們19:25
Hi, our chat got disconnected, so I'm continuing on case #[case number]. As discussed, I'm requesting a one-time billing adjustment of US$1,976.01 for unauthorized Vertex AI / Gemini API usage caused by leaked credentials (2026-10-14 14:00 – 2026-10-15 03:00 UTC, three projects). The evidence files (SKU billing breakdown, usage graphs, audit log, database log excerpt) are attached to this case. Could you please confirm: (1) the expected timeline for the internal team's decision, and (2) whether I should pay the October invoice as usual, or whether the disputed amount will be held during the review? Thank you.
您好,剛才聊天斷線了,所以改在這個案件接續。如先前所談,我們就外洩憑證造成的未授權 Vertex AI/Gemini API 用量(2026-10-14 14:00 至 10-15 03:00 UTC,三個專案),申請 US$1,976.01 的一次性帳單調整。證據檔(SKU 帳單明細、用量圖、稽核記錄、資料庫 log 節錄)已附在案件中。想請您確認:一、內部團隊大約多久會有決定;二、10 月的帳單要照常付款,還是審核期間爭議金額會先暫緩?謝謝。
- 我們19:27
Thank you for your help in the chat. To answer your last question: yes, I recognize all three projects. They all belong to our company and are on our billing account. The Vertex AI / Gemini API usage on 2026-10-14 to 2026-10-15 was NOT made by us; it came from leaked credentials. I have uploaded all evidence files to this case (SKU billing breakdown, 30-day usage graphs and hourly data for each credential, IAM audit log, and the database log excerpt showing the intrusion). I understand we need to wait about 32 hours for the final amount to sync, and I will wait for your update by email. Thank you for advocating for the adjustment.
謝謝您在聊天中的協助。回答您最後的問題:是的,三個專案我們都認得,都屬於本公司、掛在我們的帳單帳戶下。但 2026-10-14 到 10-15 的 Vertex AI/Gemini API 用量不是我們產生的,來自外洩的憑證。所有證據檔都已上傳到案件(SKU 帳單明細、每把憑證的 30 天用量圖與每小時數據、IAM 稽核記錄,以及顯示入侵的資料庫 log 節錄)。了解需要等約 32 小時同步最終金額,我們會等您的 email 通知。謝謝您為我們爭取調整。
- 客服
Google Cloud Platform is a shared responsibility; however, the security and access of instances is a sole responsibility of our customers, and as such our customers should be securing their machines and credentials. With this kind of situation, the charges are considered valid. Since the charge is valid, we normally would not be able to dispute the charge. However, as our valued customer, I will be requesting a one-time adjustment for the charges.
Google Cloud Platform 採共同責任模式,但執行個體的安全與存取完全是客戶的責任,客戶應自行保護機器與憑證。這類情況產生的費用會被視為有效費用。既然費用有效,我們通常無法受理爭議。不過,作為我們重視的客戶,我會為這筆費用申請一次性調整。
- 客服
Because your billing account is currently in a good standing state, I suggest holding off on making a payment just yet. As the balance ages, the account may eventually transition to a "not in good state" where services are temporarily paused. If and when that happens, please let me know right away: while I cannot apply a payment extension while the account is still healthy, I can immediately submit a payment extension on your behalf as soon as that status changes to protect your account.
由於您的帳單帳戶目前狀態良好,建議先不要付款。帳款逾期一段時間後,帳戶可能會轉為「狀態不佳」,服務會暫時停止。如果發生這種情況,請立刻告訴我:帳戶還正常時我無法申請付款延期,但狀態一改變,我可以馬上替您提出延期申請,保護您的帳戶。
信裡還附了一份安全建議清單:API key 加上限制並定期輪替、設定專案層級的用量上限、設預算與警報、定期看用量。這些在我們的申訴報告裡大多已經做了,回覆時逐項說明,比單純道謝更有說服力。
還有一個小地方要更正:信裡寫的金額是 US$1,994.78,也就是客服在聊天裡報的整月數字。我們回覆時再說明一次,申請的是盜打時段的 US$1,976.01,差額是正常用量。
卡關七:客服說「先不要付」,但帳單是自動扣款
客服建議審核期間先不要付款,這句話預設的是「自己手動付款」的帳戶。我們打開帳單帳戶的付款頁才發現,付款方式是每月結帳日自動扣款:上一次在 10 月 1 日自動刷了 9 月的費用,10 月 1 日到 15 日的餘額已經累積到 US$1,997.46,盜打的費用就在裡面。照這個節奏,11 月初會自動整筆扣款;自動扣款的帳戶如果餘額先達到付款門檻,也可能在月中提前扣。我們根本沒有「先不付」這個選項。
這時最直覺、也最危險的做法,是把信用卡移除,讓它扣不到錢。扣款失敗會讓帳單帳戶轉成「狀態不佳」,同一個帳戶下所有正常運作的專案都可能被暫停,損失遠比這筆帳單大。所以我們定了一個原則:不移除信用卡、不讓扣款失敗;真的被扣了也沒關係,減免核准後一樣拿得回來。
剩下的是把狀況講清楚,讓客服決定怎麼處理。我們先回信致謝、更正申請金額,再補一則留言,說明帳戶是自動扣款,請他確認兩件事:審核期間能不能暫緩這筆扣款;如果審核完成前就扣了,核准的調整是退回信用卡,還是轉成抵免額抵之後的帳單。
- 我們20:00
Thank you very much for requesting the one-time adjustment for us, and for the clear guidance on payment. We will hold off on payment and will let you know right away if the account status changes. One small clarification: the amount we are requesting is US$1,976.01, which covers only the unauthorized usage window (2026-10-14 14:00 to 2026-10-15 03:00 UTC). The remaining ~US$18.77 in October Gemini API usage was our normal usage. We have also reviewed the security recommendations; API key restrictions, budgets and alerts are now in place on the affected projects. We look forward to your update. Thank you!
非常感謝您替我們申請一次性調整,也謝謝您清楚說明付款的處理方式。我們會先暫緩付款,帳戶狀態一有變化就立刻通知您。補充一點:我們申請的金額是 US$1,976.01,只涵蓋未授權使用的時段(2026-10-14 14:00 至 10-15 03:00 UTC);10 月其餘約 US$18.77 的 Gemini API 用量是我們的正常用量。安全建議我們也看過了,受影響的專案都已加上 API key 限制、預算與警報。期待您的消息,謝謝!
- 我們20:17
Thank you for the guidance. One thing to clarify: our billing account is on automatic monthly payments (card on file), so the October balance (currently about US$1,997) will be charged automatically around November 1, and possibly earlier if a payment threshold is reached. We do not want to remove the card or cause a failed payment, since other production projects depend on this billing account. Could you please advise: (1) can the automatic charge for the disputed amount be held during the review, and (2) if it is charged before the review is completed, will the approved adjustment be refunded to the card or applied as a credit to future invoices? Thank you.
謝謝您的說明。有一點想釐清:我們的帳單帳戶是每月自動扣款(綁定信用卡),所以 10 月的餘額(目前約 US$1,997)會在 11 月 1 日前後自動扣款;如果先達到付款門檻,也可能更早扣。我們不想移除信用卡或造成扣款失敗,因為還有其他正式運作的專案依賴這個帳單帳戶。想請您確認:一、審核期間,這筆爭議金額的自動扣款能否暫緩?二、如果審核完成前就已經扣款,核准的調整會退回信用卡,還是轉成抵免額抵之後的帳單?謝謝。
這一卡給下一個人的提醒很簡單:申訴之前,先去付款頁確認自己是手動付款還是自動扣款。客服的付款建議要對照自己的付款方式來讀,不要為了「先不付」去動信用卡。
結果:核准 US$1,497.77,以抵免入帳
32 小時的同步過了好幾天,案件一直沒有新消息。10 月 19 日上午我們在案件裡主動追蹤,順便把還沒得到答覆的自動扣款問題再問一次。當天下午客服回信:系統同步後的最終金額是 US$1,978.26,調整申請已經送出,1 到 3 個工作天內會有結果。
10 月 20 日深夜,結果來了:調整核准,金額 US$1,497.77。4 分鐘後客服補了第二封信,回答我們問了兩次的問題:調整是以抵免額(credit)的形式套用到帳單帳戶,不是退回信用卡。
- 我們10-19 11:15
Hi [agent], following up on case #[case number]. It has been a few days since the 32-hour wait for the final amount, so I wanted to check whether the one-time adjustment request for US$1,976.01 (unauthorized usage 2026-10-14 14:00 to 2026-10-15 03:00 UTC, three projects) has been submitted, and whether there is any update from the review team. I would also appreciate guidance on my earlier question: our billing account is charged automatically by card around November 1. Can the disputed amount be held during the review, and if it is charged first, will an approved adjustment be refunded to the card or applied as a credit to future invoices?
您好,追蹤一下這個案件。等最終金額的 32 小時已經過了好幾天,想確認 US$1,976.01 的一次性調整申請(未授權用量 2026-10-14 14:00 至 10-15 03:00 UTC,三個專案)是否已經送出、審核團隊有沒有新消息。另外也想請您回覆先前的問題:我們的帳單帳戶會在 11 月 1 日前後自動刷卡扣款,審核期間爭議金額能否暫緩?如果先扣了,核准的調整是退回信用卡,還是轉成抵免額抵之後的帳單?
- 客服10-19 17:07
Please accept my sincere apologies for the delayed response. Following our investigation into the unusual high usage spike for the Gemini and Vertex API starting on October 14, 2026, across your projects, I have already proceeded with submitting an adjustment request for the total determined amount of $1,978.26. Since your billing account currently remains in a healthy, good standing state, no action is required on your end at this moment. If your account happens to transition to a "not in good state" due to the outstanding balance while the adjustment is being reviewed, I will gladly submit a payment extension on your behalf. Expect an update in 1-3 business days or earlier.
很抱歉這麼晚回覆。針對 2026 年 10 月 14 日起,您幾個專案的 Gemini 與 Vertex API 異常用量,調查完成後,我已經以最終認定的總金額 US$1,978.26 送出調整申請。您的帳單帳戶目前狀態良好,現在不需要做任何事。如果審核期間帳戶因未付款項轉為「狀態不佳」,我會替您申請付款延期。預計 1 到 3 個工作天內、或更早會有消息。
- 我們10-19 17:11
Thank you for the update and for submitting the adjustment of $1,978.26. One follow-up on my earlier question: since our billing account is on automatic payment, if the October charge is debited before the review completes, will the approved adjustment be issued as a credit or a refund? Thanks again for your help.
謝謝您的更新,也謝謝您送出 US$1,978.26 的調整申請。再追問一次先前的問題:我們的帳單帳戶是自動扣款,如果審核完成前 10 月的費用就被扣了,核准的調整會是抵免還是退款?再次感謝。
- 客服10-20 23:48
I hope this email brightens your day. I am pleased to inform you that our adjustment request has been approved. You should be able to find the service adjustment of $1,497.77 which you can also view on your end! To view your transaction history: Billing → Payment overview → View Transactions and Documents. Please let me know if the information provided helped you resolve the issue and if so, if this case can be closed.
希望這封信讓您有個好心情。很高興通知您,調整申請已經核准。您應該可以看到 US$1,497.77 的服務調整。查看方式:帳單 → 付款總覽 → 查看交易和文件。如果這些資訊解決了您的問題,請告訴我這個案件是否可以結案。
- 客服10-20 23:52
The service adjustment has been applied to your account in the form of a credit, and you should be able to see it reflected directly in your account's transaction history!
這筆服務調整已經以抵免額的形式套用到您的帳戶,您可以直接在帳戶的交易記錄裡看到。
- 交易記錄出現一筆「Service Adjustment - Goodwill Credit/Refund」,−US$1,497.77,日期 10-20,說明欄直接帶著案件編號Transaction history: "Service Adjustment - Goodwill Credit/Refund in reference to [case number]", −US$1,497.77, dated 2026-10-20
- 我們10-21 00:22
Thank you. I can see the credit in our transaction history. Thanks again for your help with this case. Please go ahead and close it.
謝謝,交易記錄裡已經看到這筆抵免。再次感謝您協助處理這個案件,可以結案了。
打開帳單帳戶的交易頁對帳,10 月這一段只有三行:
10-01 自動付款(9 月帳單) −US$ 148.42
10-01~31 Google Cloud(10 月至今的費用,盜打就在裡面) US$1,997.63
10-20 Service Adjustment - Goodwill Credit/Refund(本案) −US$1,497.77
───────────────────────────────────────────
期末餘額 US$ 499.86
這張表回答了兩個我們問了兩次的問題。第一,抵免是直接扣在 10 月的費用上,不是等扣款之後再退回信用卡;11 月初自動扣款時,扣的是抵免後的餘額。第二,10 月 1 日那筆扣款是 9 月的正常帳單,跟這次盜打無關,不會被退。
整個申訴從 10 月 15 日開口到 10 月 20 日核准,剛好 5 天、3 個工作天。
拿回七成六,剩下的我們沒有再追
核准的 US$1,497.77 是最終認定金額 US$1,978.26 的 75.7%,差額 US$480.49。兩封信都沒有說明差額怎麼算,交易記錄也只有一行總數。
我們討論過要不要再追,最後決定不追。理由有三個:信裡第一句就說了這是「有效費用」下的一次性通融,Google 沒有義務全額減免;申訴報告裡老實寫了可預測的密碼和沒換的加密金鑰,責任有一部分確實在我們;再追一輪的時間成本,不一定比四百多美元低。所以最後一封回信只確認看到抵免、請客服結案。
這筆差額,就是這次事件真正從口袋裡掏出去的錢,下面的成本表也照實列出來。
給下一個收到盜刷帳單的人
1. 入口:Console → 支援 → 帳單問題支援 → 取得帳單支援。技術客服案件要付費方案,帳單案件免費。
2. 先讓 AI 帳單助理算出盜打時段的金額,用 Google 自己的數字當申請金額,再要求轉真人。
3. 第一句話會變成案件主旨,一次寫清楚帳戶、時段、金額、訴求。
4. 聊天會斷,附件一律從案件頁上傳,留言補完聊天沒講完的話。
5. 「charges are considered valid」不是拒絕,是一次性通融的標準開場白。
6. 自動扣款的帳戶不要動信用卡;核准的調整會以抵免額扣在帳單上。
7. 32 小時後沒消息就主動追。我們追了一次,當天就拿到最終金額,隔天核准。
8. 不保證全額。這次拿回約七成六,差額沒有說明。
接下來是聊天全文,英文原文與中文翻譯並列,專案、帳戶、案件編號與人名都已去識別化。
深入閱讀帳單支援聊天全文(英文原文+中文對照)2026-10-15 18:5x 起(台北時間);先是 AI 帳單助理,轉接後是真人客服,括號內是開聊後經過的時間
第一段是跟 AI 帳單助理的對話,重點在最後一句要求轉真人,以及助理主動算出的盜打時段金額。
- 從 Console → 支援 → 帳單問題支援 → 取得帳單支援,開啟帳單助理聊天Billing Assistant chat opened from Console → Support → Billing support → Get billing support
- Google Cloud Billing Support現在
Hi, I'm your AI agent for Google Cloud. Let's solve your issue. · For Maps billing, please contact Maps Support. · For non-billing issues, please refer to the other contact options. · For Workspace issues, please contact Workspace Support. Select one of the billing accounts for which you are a billing admin
嗨,我是 Google Cloud 的 AI 客服,一起來解決您的問題。 · 地圖平台的帳單問題,請聯絡地圖支援。 · 非帳單問題,請改用其他聯絡管道。 · Workspace 的問題,請聯絡 Workspace 支援。 請從您擔任帳單管理員的帳單帳戶中選擇一個。
- 選擇帳單帳戶後按「提交」Billing account selected and submitted
- Google Cloud Billing Support
Explain your problem clearly in a few sentences, with as much detail as possible, and I'll try to help. If at any point I am not helpful and you'd like to chat with a human agent, let me know. I'll connect you to a human agent and share a copy of our conversation so they can better assist you.
請用幾句話清楚說明您的問題,細節越多越好,我會盡力協助。如果過程中我幫不上忙、您想跟真人客服對話,隨時告訴我。我會幫您轉接,並把這段對話的副本交給對方,讓他們更快進入狀況。
- 我們
I need a billing adjustment for unauthorized charges caused by compromised credentials. Billing account [redacted]. Between 2026-10-14 14:00 and 2026-10-15 03:00 UTC, a third party used three leaked credentials (service account keys on [business project] and [automation project], and an API key on [Default Gemini project]) to run about 66,000 Vertex AI / Gemini API requests. That produced US$1,994.78 in charges (Gemini API US$1,641.81 + Vertex AI US$352.97); these services cost about US$0.13 in the previous billing period. Google already suspended [automation project] for “abusive activity consistent with credential compromise”. We have deleted or disabled all affected keys and fixed the root cause. I have a full written report with monitoring graphs, audit logs and a SKU breakdown. Please connect me to a human agent so I can submit this as a billing dispute and request a one-time adjustment.
我們需要針對憑證遭盜用產生的未授權費用申請帳單調整。帳單帳戶(略)。2026-10-14 14:00 到 10-15 03:00(UTC)之間,第三方用三組外洩的憑證(業務專案與自動化排程專案的服務帳戶金鑰,以及預設 Gemini 專案的 API key),發出約 66,000 次 Vertex AI/Gemini API 請求,產生 US$1,994.78 的費用(Gemini API US$1,641.81+Vertex AI US$352.97);這些服務在上一個帳單週期只花了約 US$0.13。Google 已經以「與符合盜用特徵的濫用活動有關聯」為由停權自動化排程專案。我們已刪除或停用所有受影響的金鑰,並修好根因。手上有完整的書面報告,含監控圖、稽核記錄與 SKU 明細。請幫我轉接真人客服,讓我們以帳單爭議提出、申請一次性調整。
- Google Cloud Billing Support
Usage & Cost Findings (2026-10-14 to 2026-10-15) I have reviewed your billing account for the requested period between 2026-10-14 and 2026-10-15 (PST) regarding your dispute request: · Gemini API: Net cost of $1,623.04 USD (primarily generated content output tokens on project [Default Gemini project]). · Vertex AI: Net cost of $352.97 USD with $144.90 USD in applied credits/discounts (across projects [automation project] and [business project]). · Total Net Cost: $1,976.01 USD. Cost anomalies were flagged for these sudden spikes across the affected projects. You can review the itemized breakdown directly in the Billing Report and Anomalies Report. Deleting and rotating compromised credentials ensures no further usage occurs. I acknowledge your request to connect with a human representative to submit a billing dispute and review your audit documentation. If you would like me to transfer you to a live support agent now, please confirm and I will proceed immediately.
用量與費用查核結果(2026-10-14 至 10-15) 我已依您的爭議申請,查看您的帳單帳戶在 2026-10-14 至 10-15(太平洋時間)的費用: · Gemini API:淨費用 US$1,623.04(主要是預設 Gemini 專案的生成內容輸出 token)。 · Vertex AI:淨費用 US$352.97,已套用 US$144.90 的抵免/折扣(分布在自動化排程專案與業務專案)。 · 淨費用合計:US$1,976.01。 系統已將這幾個專案的突然暴增標記為成本異常,您可以在帳單報表與異常報表中查看逐項明細。刪除並輪替遭盜用的憑證,可確保不再產生用量。 我了解您希望轉接真人客服,以提出帳單爭議並審閱您的稽核文件。如果您希望我現在轉接,請確認,我會立即處理。
- 我們
Yes, please transfer me to a live support agent now. The disputed amount is US$1,976.01 as you calculated (Gemini API US$1,623.04 + Vertex AI US$352.97).
好,請現在幫我轉接真人客服。爭議金額就是您算出的 US$1,976.01(Gemini API US$1,623.04+Vertex AI US$352.97)。
- 已轉接真人客服Transferred to a live support agent
第二段是轉接後跟真人客服的 25 分鐘,從建立案件、查帳戶,到說明後續流程。
- 客服9s
Thank you for contacting Google Cloud Support. My name is [agent] and I'll be working with you today. While I read over your message, is there anything else you'd like to add?
感謝您聯絡 Google Cloud 支援,我是今天為您服務的客服。我先讀一下您的訊息,還有什麼想補充的嗎?
- 我們44s
Hi, thank you. In short: a third party used three leaked credentials on billing account [redacted] between 2026-10-14 14:00 and 2026-10-15 03:00 UTC. That produced US$1,976.01 in Vertex AI / Gemini API charges (confirmed by the Billing Assistant). We have contained it, rotated the credentials and fixed the root cause. I would like to request a one-time billing adjustment. I have a detailed written report (below) plus evidence files: monitoring graphs showing zero usage for 30 days before the spike, audit logs, and a SKU breakdown. Could you please create a billing case so I can upload the attachments? Full report follows in my next message.
謝謝。簡單說:2026-10-14 14:00 到 10-15 03:00(UTC)之間,第三方用三組外洩的憑證,在我們的帳單帳戶上產生了 US$1,976.01 的 Vertex AI/Gemini API 費用(帳單助理已確認)。我們已經止血、輪替憑證、修好根因,想申請一次性的帳單調整。我們有完整的書面報告,以及證據檔:顯示暴增前 30 天用量為零的監控圖、稽核記錄、SKU 明細。可以幫我們建一個帳單案件讓我們上傳附件嗎?完整報告接著貼在下一則。
- (此處貼上約 8,000 字元的完整書面報告)(Full written report, about 8,000 characters, pasted here)
- 客服2m 14s
Hi! Thanks for reaching Google Cloud Billing. I understand that you experienced a leakage of your credentials that accumulated $1,976.01 in Vertex AI / Gemini API charges USD and you reached out regarding wanting assistance with the charges, right?
您好!感謝您聯絡 Google Cloud 帳單支援。我理解您的憑證外洩,累積了 US$1,976.01 的 Vertex AI/Gemini API 費用,您想請我們協助處理這筆費用,對嗎?
- 客服2m 21s
I assure you that I will help you on this.
我向您保證,我會協助您處理這件事。
- 我們2m 53s
Yes, that's correct. A third party used our leaked credentials and generated US$1,976.01 in Vertex AI / Gemini API charges on 2026-10-14 to 2026-10-15. We did not authorize or use any of it. I would like to request a one-time billing adjustment (credit) for this amount. I've pasted the full incident report above, and I have evidence files ready (monitoring graphs, audit logs, SKU breakdown). Could you please open a billing case for this and tell me the case number and how I can upload the attachments?
是的。第三方用我們外洩的憑證,在 10-14 到 10-15 產生了 US$1,976.01 的費用,這些用量我們沒有授權、也沒有使用。我們想就這筆金額申請一次性的帳單調整(抵免)。完整事件報告已貼在上面,證據檔(監控圖、稽核記錄、SKU 明細)也準備好了。可以幫我們開帳單案件,並告訴我們案件編號和上傳附件的方式嗎?
- 客服3m 14s
You may use this ticket billing case as reference (#[case number]); this was created automatically since you have reached out.
您可以用這個帳單案件編號作為參考,它在您聯絡我們時就自動建立了。
- 我們3m 56s
Thank you. I've noted the case number. I will upload the evidence files to this case now. Could you please confirm: (1) that this case is being submitted for a billing adjustment review for US$1,976.01, and (2) the expected timeline for a decision? Is there anything else you need from me?
謝謝,案件編號記下了,我們現在就上傳證據檔。想請您確認兩件事:一、這個案件會送去做 US$1,976.01 的帳單調整審核;二、大約多久會有結果?還需要我們提供什麼嗎?
- 客服3m 58s
First, kindly lend me 5–9 minutes to quickly authenticate and check on your account. Would that be okay with you?
首先,請給我 5 到 9 分鐘,我需要驗證並查看您的帳戶,可以嗎?
- 我們4m 23s
Sure, take your time. Thank you!
當然,您慢慢來,謝謝!
- 客服11m 46s
Thank you for patiently waiting. Upon checking on your account, I can see that there's a high usage on Oct 14, 2026 for Gemini API with the amount of ($1,641.81) and Vertex AI ($352.97) from the projects: · [Default Gemini project] · [business project] · [automation project] [link to the billing report grouped by project]
感謝您耐心等候。查看您的帳戶後,我看到 2026-10-14 有很高的用量:Gemini API US$1,641.81、Vertex AI US$352.97,來自以下三個專案: · 預設的 Gemini 專案 · 業務專案 · 自動化排程專案 (附上依專案分組的帳單報表連結)
- 客服11m 55s
I also see that you have already unlinked the project [Default Gemini project], and the rest are currently linked to your account.
我也看到您已經把預設的 Gemini 專案從帳單帳戶解除連結,其他兩個目前仍連結在您的帳戶上。
- 客服12m 35s
Regarding the adjustment request, do not worry, since I will be coordinating with our internal team for assistance with the whole charges.
關於調整申請請不用擔心,我會跟內部團隊協調,爭取整筆費用的協助。
- 我們13m 28s
Thank you very much, I really appreciate it. A few quick questions so I can follow up properly: 1. Should I upload the evidence files (graphs, audit logs, SKU breakdown) to the case, or send them by email? 2. Roughly how long does the internal team usually take, and will updates come by email? 3. The October invoice will be issued in early November. While the review is in progress, should I pay it as usual, or will the disputed amount be held? I want to avoid any payment issue affecting our other projects.
非常感謝。為了後續追蹤,想再請教幾個問題: 1. 證據檔(圖表、稽核記錄、SKU 明細)要上傳到案件,還是用 email 寄? 2. 內部團隊大約需要多久?進度會用 email 通知嗎? 3. 10 月的帳單 11 月初會出帳。審核期間我們要照常付款,還是爭議金額會先暫緩?我們不希望付款問題影響到其他正常運作的專案。
- 客服15m 48s
Since the usage was recent, we will need to wait for 32 hours to let the system synchronize and reflect the total charges back to your account. Once I have determined the final amount, I will be coordinating with our internal team regarding the adjustment request, which is subject to their approval, so I cannot guarantee a 100% waive-off, but I can for sure guarantee you that I will strongly advocate for it. Since we will need time to determine the final amount and our internal team will also review and check your account, the total time for this kind of concern may take 3–5 business days or longer. But do not worry, since I will be on your side guiding and updating you via email so that you are well informed of what's happening, and you may use this billing case as your reference ticket number.
因為用量才剛發生,需要等 32 小時讓系統同步,把完整費用反映到您的帳戶。確定最終金額後,我會跟內部團隊協調調整申請。這需要他們核准,所以我不能保證 100% 減免,但我可以保證我會強力為您爭取。 由於需要時間確定最終金額,內部團隊也會審核您的帳戶,這類申請整體大約需要 3 到 5 個工作天,也可能更久。不用擔心,我會一路協助您,並透過 email 通知進度,讓您掌握狀況。這個帳單案件編號就是您的參考單號。
- 客服16m 22s
For now, I would like to kindly ask: do you recognize these projects? · [Default Gemini project] · [business project] · [automation project]
現在想請問您,您認得這三個專案嗎? · 預設的 Gemini 專案 · 業務專案 · 自動化排程專案
- 客服19m 8s
Yes, you may upload the evidence files that you have, such as graphs and audit logs, via email. And since you are concerned about affecting your projects due to having an outstanding balance during the investigation time that this case may take: you may make a payment once the system prompts you, or you can choose not to make a payment at this moment.
是的,圖表、稽核記錄等證據檔可以用 email 寄給我們。至於您擔心調查期間有未付款項會影響其他專案:您可以等系統提示時再付款,也可以選擇現在先不付。
- 客服19m 37s
Your account is still open and in good standing, so your account is still healthy.
您的帳戶目前仍是開啟、良好的狀態,帳戶是健康的。
- 客服22m 40s
I have also checked for possible issues that may arise on your account, and I can confirm that there are none that may affect you in the future.
我也檢查過您的帳戶日後可能出現的問題,可以確認目前沒有任何會影響您的狀況。
- 客服24m 11s
So for now, our next course of action is to wait for 32 hours. Once I have determined the final amount, I will proceed with coordinating with our internal team regarding the adjustment for the whole amount. Sounds good?
所以目前的下一步是等 32 小時。確定最終金額後,我會跟內部團隊協調整筆金額的調整。這樣可以嗎?
- 客服25m 10s
My apologies, I know this is a lot, but do not worry, since I will be guiding and updating you throughout this process. I got you on this.
抱歉一次說了這麼多,請不用擔心,整個過程我都會引導您、隨時更新進度。這件事交給我。
- 聊天在這裡斷線;「是否認得三個專案」的問題,之後改在案件歷史記錄裡回覆Chat disconnected — the question about the three projects was answered later in the case history
哪裡做對,哪裡做錯
做對的是兩件事。第一,止血先於追查——攻擊者的計費不會等你查清楚。第二,把兩個看似無關的帳單異常,用「同一個小時起飛」這條線接起來,而不是當成兩起各自處理;不接起來,我們會換掉兩把 Google 憑證,然後在下週看到第三張帳單。
做錯的也是兩件,而且都發生在八月那一次「已經處理好了」的輪替裡。第一,輪替是為了讓舊值失效,但「舊值+0829」讓舊值仍然是一把幾乎可以用的鑰匙:持有舊值的人,正是我們輪替要防的那個人。第二,我們換了資料庫密碼,卻沒有換那把能解開所有憑證的加密金鑰——因為它在設定裡長得像一個普通的 PASSWORD 變數,看不出它其實是整個憑證庫的主鑰。資料庫對外開著這件事,則是讓上面兩個錯誤從「理論上的風險」變成「凌晨十二點的一筆 SQL」。
如何避免
當天就能做的是兩件事。把所有資料庫的對外轉發列出來,平台只在內網用的,直接關掉。再把上次外洩之後換過的密碼逐一看一遍,凡是新值看得出舊值的影子,再換一次,這次用隨機產生器。
一週內做的是把「主鑰」找出來。每個自架平台都有一兩個不起眼的變數,掌管著整個平台的加密:n8n 的加密金鑰、各種框架的 secret key、session key。把它們跟一般密碼分開列管,外洩事件的輪替清單一定要包含它們,而且要知道換了之後要做哪些重新加密。
這一季做的是收斂放進第三方平台的憑證權限。工作流程平台的本質就是一個裝滿別人鑰匙的盒子,盒子被打開時,損失由裡面最大的那把鑰匙決定。放進去的服務帳戶只給它需要的那一個角色,絕不給 Owner;API key 綁平台的出口 IP;每個計費帳戶設預算警報,讓下一次異常在凌晨就有信進來,而不是等到上午看帳單。
這篇提到的項目要花多少錢
這張表左右兩邊的對比很清楚:攻擊者取得憑證的成本趨近於零,我們補上防線的成本也趨近於零,中間那兩列是一張 US$1,976.01 的帳單,再扣掉 Google 核准的 US$1,497.77 抵免。
| 項目 | 用量 | 單價 | 期間 | US$ | NT$ | 舉證 |
|---|---|---|---|---|---|---|
| Vertex AI Gemini 呼叫(兩把服務帳戶金鑰,含同期另一把八月外洩的金鑰) | 約 18,400+5,500 次 GenerateContent/StreamGenerateContent | 依模型與 token 計價,已扣抵免 US$144.90 | 10-14 22:00–10-15 10:36 | 352.97 | 11,295 | Google 帳單助理依帳單帳戶計算的淨費用 |
| Gemini API 呼叫(API key) | 41,890 次 GenerateContent/StreamGenerateContent | 依模型與 token 計價 | 10-15 00:43–10:14 | 1623.04 | 51,937 | Google 帳單助理依帳單帳戶計算的淨費用 |
| Google 一次性調整(抵免額) | 申訴核准,以 Goodwill Credit 入帳 | 最終認定 US$1,978.26 的 75.7% | 2026-10-20 | -1497.77 | -47,929 | 帳單帳戶交易記錄、客服核准信 |
| 攻擊者取得憑證的成本 估 | 八月外洩資料+試日期後綴 | 趨近 US$0 | 一次性 | 0.00 | 0 | 本站推算,非攻擊端直接證據 |
| 關閉資料庫對外轉發、改隨機密碼 | 一台資料庫 | 平台內建設定,US$0 | 一次性,約 30 分鐘 | 0.00 | 0 | 本站處置紀錄 |
| 預算警報、API key 來源限制、log_connections | 每個專案/每台資料庫 | 內建功能,US$0 | 持續 | 0.00 | 0 | Google Cloud 與 PostgreSQL 官方文件:皆不另外收費 |
| 憑證庫全數輪替的人力 估 | 多組資料庫密碼、SSH 私鑰、Google 憑證、加密金鑰 | 估 1–2 個工作天 | 接下來兩週 | — | — | 工時尚未結算 |
| 合計(僅可證明列) | 478.24 | 15,304 | ||||
proven 列相加是 US$478.24:盜打那兩列的 US$1,976.01,扣掉 Google 核准的 US$1,497.77 抵免。以客服最終認定的 US$1,978.26 計算,實際自付是 US$480.49,約新台幣一萬五千元。其他 proven 列都是零,因為它們本來就該做、而且不用錢。
你可以學到什麼
站在攻擊者那一側看,八月那包外洩的環境變數不是一次性的收穫,是一份會一直增值的資產。我們以為輪替完就結束了;對他來說,那份資料告訴了他三件事:資料庫在哪、密碼長什麼樣子、憑證庫怎麼解。他只要偶爾回來試一下,等我們把新的、更值錢的鑰匙放進那個盒子。
跟我們的防暴筆記對照
對照 INC-2026-0827(排程回報「找不到帳戶」,被停權的是整個專案)。那一次被拿走的是一把掛著 Owner 的服務帳戶金鑰;這一次,被拿走的又是一把掛著 Owner 的服務帳戶金鑰。中間隔了七週,我們輪替了二十組資料庫密碼,卻在其中一組用了舊值加日期,也漏掉了那個不叫 KEY、其實是主鑰的變數。輪替的盲點那篇講的是「換了,但有人還拿著舊的」;這篇補上另一半:換了,但新的跟舊的長得一樣。
- 01輪替的目的是讓持有舊值的人失效。新密碼只要看得出舊密碼的影子,輪替就只是改了一個字。
- 02自架平台的加密金鑰是整個憑證庫的主鑰,它常常長得像一個普通的 PASSWORD 變數;外洩事件的輪替清單一定要把它找出來。
- 03工作流程平台是一個裝滿別人鑰匙的盒子。盒子被打開時,損失由裡面權限最大的那把決定,所以放進去的每一把都要先降權。
- 04只在內網使用的資料庫不該對外轉發。對外的 port 每天都有人在敲,差別只是哪一天有人手上剛好有對的鑰匙。
- 05兩個看似無關的異常同一小時起飛,先找它們的共同存放處;分開處理,只會在下週看到第三張帳單。
- 01可預測的密碼輪替本案根因:新密碼是舊密碼加日期,持有舊值的人試幾次就能進去,等於沒換。
- 02N8N_ENCRYPTION_KEYn8n 憑證庫的主鑰;本案它引用了外洩過、沒換的 PASSWORD 變數,拿到資料庫就能解開全部憑證。
- 03port forwarding(資料庫對外轉發)資料庫只給平台內網用,卻對外開著;關掉它,前面兩個錯誤就不會變成入侵。
- 04credentials store(憑證庫)工作流程平台把所有連線用的鑰匙集中加密存放;它被打開,影響的是每一個串接的系統。
- 05log_connectionsPostgreSQL 預設不記連線來源;沒開,本案攻擊者的 IP 就成了永遠補不回來的空格。
- 06GCP:Service Account 使用者管理金鑰被盜用的那把 Google Service KEY JSON 掛著 Owner;放進第三方平台的金鑰權限決定了外洩的上限。
- 07API key 來源限制(IP restriction)同一個專案裡綁了 IP 的十幾把 key 都沒事,被盜打的正是沒綁 IP 的那一把。
- 08依憑證分組的請求數Monitoring 可以按 credential 拆請求曲線;本案就是靠兩條曲線同一小時起飛,把兩張帳單接回同一個源頭。
- 09PostgreSQL ERROR log平台自己的 SQL 幾乎不會報錯;本案唯一的入侵足跡,就是攻擊者猜錯表名的那一筆錯誤。
- 10T1555 Credentials from Password Stores攻擊者沒有碰任何一台主機,只是把一個集中存放鑰匙的地方整個搬走。
全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。
- 從外部測試你的資料庫對外 port 是否還開著(唯讀)
nc -z -G 5 <資料庫對外主機> <對外port>看到什麼代表什麼:回 succeeded 代表從網路上任何地方都敲得到它。只給內網服務用的資料庫,這裡應該是連不上。 - 檢查資料庫有沒有記連線來源(唯讀)
psql -c "SHOW log_connections;"看到什麼代表什麼:off 代表下一次有人連進來,你只會知道「有人」,不會知道是誰、從哪裡。 - 把上次外洩後輪替過的密碼清單拿出來,逐一比對新舊值(唯讀,自己看,不要貼到任何工具)看到什麼代表什麼:任何一組新值包含舊值、或只差日期與流水號,都要再換一次,這次用隨機產生器。
- 找出自架平台的加密主鑰引用了哪個變數(唯讀,看設定)看到什麼代表什麼:如果它引用的是一個外洩過、或跟其他用途共用的變數,憑證庫就等於沒有加密。找到之後把它單獨列進一份「master-key-list-w8」,外洩事件的輪替清單從它開始。
- 列出服務帳戶的使用者管理金鑰與角色(唯讀)
gcloud iam service-accounts keys list --iam-account=<SA email> --managed-by=user看到什麼代表什麼:放在第三方平台裡的金鑰,如果它的服務帳戶是 Owner 或 Editor,平台被打開那天,整個專案就跟著被打開。 - 列出 API key 的來源限制(唯讀)
gcloud services api-keys list --format="table(displayName,restrictions.serverKeyRestrictions)"看到什麼代表什麼:限制欄空白的 key,誰拿到都能用;本案被盜打的正是同專案裡唯一沒綁 IP 的那一把。
回到那把多磨了一個齒的鑰匙
八月我們換了鎖,也真的換了二十把。只是其中一把,新鑰匙看得出舊鑰匙的形狀;而門旁邊那把能打開所有抽屜的總鑰匙,我們沒有認出它來。
現在那扇門已經不對外了,鎖也換成了誰都猜不到的那一種,總鑰匙當天傍晚就換了。抽屜裡的每一把,是接下來兩週的事。帳單那一邊,Google 核准了 US$1,497.77 的抵免,剩下約 US$480,是這次學費的實際價格。
來源
- n8n Docs:設定自訂加密金鑰(N8N_ENCRYPTION_KEY)
- PostgreSQL 文件:log_connections 與錯誤報告設定
- Google Cloud:服務帳戶金鑰的管理最佳做法
- Google Cloud:為 API 金鑰套用限制
- Google Cloud:建立預算與警報
- NIST SP 800-63B:不接受可由舊密碼推得的新密碼
- MITRE ATT&CK:T1078 Valid Accounts
- MITRE ATT&CK:T1555 Credentials from Password Stores
- MITRE ATT&CK:T1496 Resource Hijacking
- 本站防暴筆記:排程回報「找不到帳戶」,被停權的是整個專案
- 本站防暴筆記:輪替的盲點
每篇新文章一封:三點摘要、關鍵字定義、今天能做的一件事。
延伸閱讀
列為「風險最高」的那把金鑰,我們決定晚點再撤
上一次鑑識就點名它,但它擁有一萬多個檔案、七個以上的線上服務靠它活著,所以排在「先搬消費者再停用」。一個月後,它在五個小時內替別人跑了 6,350 萬 input token,整個專案被 Google 停權。
App 從來沒上架,帳單先衝上來了
一把一年前在 Firebase 產生、給一個最後沒上架的 iOS app 用的 Gemini API key,10 月 2 日單日被打出 $3,909 的用量。app 不在線上,key 卻一直活著——而且預設不綁 app、不綁 API、不綁來源。
教學版:四道防線只要做到一道,這 15 天就不會發生
同一起事件的教學版:15 天逐分鐘攤開,每一步標出為什麼會成功、哪一道控制擋得下來。不發金鑰、不給 Owner、關掉沒用的 API、預算警示,四道都沒有。