外觀

語言

· 9 分鐘閱讀

台灣開發者愛用的部署平台,兩個月被駭兩次後關站(下):一把永不過期的 token,與關站後你該做的事

Zeabur 第二次被駭:一把 2024 年建立、從未過期的管理 token,讓攻擊者讀走 321 萬筆環境變數。下篇整理入侵經過、關站時程、退款理賠,以及工程師該帶走的 6 個教訓。

10 月 14 日早上 9 點 36 分(台北時間,下同),有人拿著 Zeabur 內部的 AWS 金鑰開始動作。四分鐘後,他用上了一組共享叢集的管理 token。

這組 token 建立於 2024 年 1 月 10 日(UTC 日期),沒有到期日;今年 1 月被以明文寫進一個私有設定 repo;它能操作的管理介面,就開在公網上。8 月事件後那一輪「全部輪替」,沒有輪到它。

接下來大約 36 個小時,沒有任何告警響起。最後是使用者回報,Zeabur 才開始調查。

(上篇講了 Zeabur 是什麼、第一次怎麼被打穿。這篇講第二次入侵、關站,以及我們能帶走什麼。)

一、兩條路,最後在內網會合

  • 路徑 A:共享叢集。攻擊者用明文 AWS 金鑰和這把管理 token,從外部進入 9 個區域的共享叢集,讀取所有服務的設定與機密,再進到使用者資料庫服務的容器裡下讀取指令,最大宗是 n8n。
  • 路徑 B:GCP 專用伺服器。Zeabur 代管的 GCP 伺服器,初始化設定裡存著明文 root 密碼,攻擊者手上又有一把讀得到設定的舊 GCP 金鑰,Zeabur 研判密碼就是這樣被拿到的。最後 101 台伺服器(92 位使用者)被以 root 登入,其中 50 台被加上攻擊者的 SSH 金鑰,另有 16 份客戶磁碟複本被掛到攻擊者開的 VM 上。這個 root 密碼問題 9/3(UTC 日期)就發現了,但事發前沒修好。
  • 會合:10/15 23:30,攻擊者用路徑 A 拿到的內網管理憑證,從一台被攻陷的 GCP 伺服器把自己的節點加進 Zeabur 內網,再用一個內部「唯讀」資料庫帳號讀取平台資料庫:10/16 00:10 到 00:47,37 分鐘。

關鍵時間線:

  • 10/14 09:36:第一次使用內部 AWS 金鑰;09:40 第一次使用管理 token
  • 10/14 21:40:開始在使用者資料庫容器內下指令,同時開始 root 登入 GCP 伺服器
  • 10/15 21:56:收到使用者回報,才開始調查
  • 10/16 00:08:狀態頁第一次公告,當時只說共享叢集上的 PostgreSQL、MySQL 受影響
  • 10/16 00:10–00:47:平台資料庫被讀取
  • 10/16 04:48:狀態頁更正,影響比先前公告更大
  • 10/16 05:05:目前紀錄中攻擊者最後的活動
  • 10/17:宣布停止營運;10/19 發布初步報告

二、外洩規模

  • 3,218,965 筆環境變數(名稱與值,已確認)
  • 321,810 個帳號資料(email、使用者名稱、手機等,已確認)
  • 865 個資料庫服務被下讀取指令(不是每個指令都成功,實際被拿走多少資料是官方的估計;其中 736 個是以 PostgreSQL 為後端的 n8n)
  • 101 台 GCP 伺服器被 root 登入(已確認)

n8n 最值得警惕:Zeabur 檢查的 607 個以 PostgreSQL 為後端的 n8n 裡,有 602 個把加密金鑰設在環境變數。金鑰和被加密的資料放在同一個地方,攻擊者在容器裡一讀,n8n 裡存的第三方憑證就等於明文外洩。因為是在容器內讀取,8 月後改過資料庫密碼也擋不住。

另有幾項官方「無法確認」、一律當作已外洩處理:台北(tpe1)與香港(hkg1)的資料庫備份是否被下載;Hetzner 359 台、DigitalOcean 48 台伺服器的管理 token 外洩後是否被使用。Zeabur GitHub App 的私鑰也被讀走,10/15 23:05 到 10/16 02:54 之間持有它就能存取使用者授權的 repo,目前沒發現被使用。

三、攻擊者在找什麼?AI 的 key

Zeabur 從指令內容研判,攻擊者主要在找能直接用的 API key,特別是 AI 服務的:在平台資料庫裡搜尋 key、大量讀取 n8n 和 new-api/one-api(常用來轉發 AI API 的閘道)裡的憑證,還試著用 Zeabur 的 AWS 金鑰呼叫 Amazon Bedrock(全部失敗、沒有產生費用)。官方也提醒,這只是對意圖的觀察,帳號資料同樣被讀走了。

事後有一把使用者的 OpenAI key 在 10/16 早上被用來送出約 1,107 次影像請求。官方推測與這次外洩有關,但無法確認。

四、為什麼 8 月修過了,10 月還是被打穿?

這是整份報告最值得讀的部分。8 月事件中,Zeabur GitHub App 的私鑰被讀走,8/31(UTC 日期)換掉了;但私鑰「讀得到的東西」,也就是設定 repo 裡那堆明文憑證,沒有跟著換。

官方推測,攻擊者在私鑰被換掉前約 4 天的空窗期用它讀了設定 repo。但官方同時寫明這只是推測,不應當成事實引用,而且 8 月和 10 月的攻擊者 IP 沒有重疊。報告也記錄了幾件還查不清的事:設定 repo 在 8/30 和 9/2(UTC 日期)被人透過一名員工的 GitHub 授權下載;9 月初(9/1–9/5,UTC 日期)也有不明來源用 root 密碼登入 GCP 伺服器。

不管憑證最初怎麼漏的,結論都一樣:輪替的範圍,要從「這把外洩的 key 碰得到什麼」往外推,而不是只換你知道外洩的那一把。

其他讓傷害變大的因素:

  • 備份裡存著全部機密,備份金鑰又和其他機密放在一起。最荒謬的一幕:事件處理中新換上的備份金鑰,被 10/16 00:00 的備份收了進去,攻擊者 04:30 就拿去用了。
  • 一把只需要讀一個 bucket 的金鑰,實際上能讀所有 bucket。
  • 「唯讀」資料庫帳號能讀全部資料:唯讀不等於安全。
  • 一個四個月前就下線的服務,它的 deploy key 還能讀設定 repo。

也有一群人逃過一劫:8 月後照指引把環境變數搬到自己專用伺服器上的專案,這次不在平台資料庫被讀取的範圍內(前提是主機本身沒被入侵)。少集中保管一份機密,被偷時就少一份。

五、關站:時程、退款與理賠

10/17 宣布關站時,不少使用者是在 Threads 上刷到才知道,沒收到 email。隔天 Zeabur 官方帳號在 X 上回覆:「你说得对,停止运营这么重要的事,应该让每一位用户都第一时间收到通知,这一点我们没做好,抱歉。」

  • 即日起:停止新購專用伺服器與網域,網域可自助轉出。
  • 11/30 前:官方建議完成搬遷;資安理賠截止,退款開單也截止(之後退款改用 email 申請)。
  • 12/1 起:停止續約,專用伺服器各自到期就關;共享叢集服務全部暫停(可手動恢復來備份)。
  • 12/31:所有服務停止,服務資料刪除。

注意:透過 Zeabur 租的專用伺服器到期後會被刪除、磁碟不保留,可能比 12/31 更早。

退款和理賠要分開申請:

  • 餘額退款:11/30 前透過 Zeabur Support 申請,之後改用 email。上限是實際付的現金,官方舉例:儲值 20、拿到 100 贈送額度、用了 40,只退 20。帳號要等所有服務都停止後才會結算,越早停就越早拿到退款;服務跑到 12 月底的帳號,官方預計 2027/1/10 前完成付款。
  • 資安理賠:另開一張單,11/30 前送出。要附上受影響的帳號與服務、外洩的金鑰類型,以及事件期間的第三方帳單或用量紀錄。

六、搬家:官方叫你把指南丟給 AI

Zeabur 的遷移指南是寫給 Claude Code、Codex 這類 coding agent 讀的:把連結丟給 agent,它會盤點服務、推薦去處,每個會改動東西的步驟都先問你。就算不用 agent,這幾項也一定要有人接手:

  • 映像檔存在 Zeabur 的 registry,關站後拉不到,服務重啟就起不來。
  • *.zeabur.app 網域會失效;HTTPS 憑證要自己處理。
  • .zeabur.internal 內網連線和跨服務注入的變數,要換成新環境的寫法、帶走實際的值。
  • 每日資料庫備份會消失,要先匯出,再自己設定備份。

官方說最常見的失敗點是映像檔和注入的變數。還有一句提醒很重要:不要把 Zeabur 的 token 貼進 AI 對話,讓 agent 用你電腦上已登入的 CLI 就好。另外,Velox Data 的整理提醒:用 Zeabur 備份的 data.sql 還原後,資料庫密碼會變回舊的,還原完要再改一次。

七、工程師該帶走的 6 個教訓

  1. 外洩後的輪替,要算爆炸半徑:換掉外洩的 key 不夠,還要換它讀得到的所有東西。
  2. 不要有永不過期的管理憑證:設期限、定期輪替;管理介面不要開在公網。
  3. 機密不進 repo、不進備份:私有 repo 不是保險箱;備份金鑰要和其他機密分開。
  4. 加密金鑰不要和資料放一起:n8n 的例子說明,放在一起就等於沒加密。
  5. 為「合法憑證被濫用」設告警:兩次都是使用者回報才發現。要盯異常來源、異常時段、大量讀取。
  6. 每把 AI key 都要有上限、能單獨撤銷:一個專案或 agent 一把 key,設用量上限和帳單告警。

PaaS 的方便是用信任換來的。把 key 放進平台的環境變數頁,平台就成了你安全邊界的一部分。這不代表不能用 PaaS,而是要假設它有一天會被打穿,然後讓那一天的損失越小越好。

下篇重點

  • 長效、明文、可從公網使用:三個條件湊齊,一把 token 就能打開整個平台。
  • 攻擊者用的是合法憑證,傳統告警不會響。
  • 11/30:資安理賠與退款開單截止;12/31:全部停止、資料刪除。
  • 假設平台會被打穿,把每把 key 的爆炸半徑縮到最小。

Zeabur 的故事就講到這裡。諷刺的是,Zeabur 的遷移指南把 Railway 列為可以搬去的選項之一,而在 Zeabur 揭露入侵不到一週後,Railway 也在 10/21 揭露了自己的資安事件。Railway 表示,未經授權的第三方可能存取了加密的環境變數,其中一部分還取得了解密後的內容。大家有興趣的話,下一次我再來拆 Railway。

一天之中的時刻,由 Zeabur 公布的 UTC 時間換算成台北時間(UTC+8)。只有日期、沒有時刻的項目(2024/1/10、今年 1 月、8/30、8/31、9/2、9 月初、9/3),沿用 Zeabur 報告裡的 UTC 日期,換成台北時間可能差一天。文章與公告的日期,是官方網站上顯示的發布日期。

來源