攻擊者入侵了共享叢集與 GCP 專用伺服器,並讀取了存放在 Zeabur 平台資料庫中的環境變數。本文說明發生了什麼、哪些資料受影響、我們做了什麼,以及您需要做什麼。
本文亦提供 English、简体中文、日本語、Español和Bahasa Indonesia。
本文時間均為世界協調時間(UTC)。調查仍在進行,本文會隨進度更新。
本文用語:「已確認」表示有日誌直接記錄;「研判」表示時間與內容吻合,但缺少直接紀錄;「無法確認」表示沒有紀錄可查,我們一律當作已外洩處理;「推測」表示只有間接證據支持的可能解釋,集中列在尚未證實的推測。
攻擊者走了兩條路徑,最後在 Zeabur 的內部網路會合。
路徑 A:共享叢集與 AWS
路徑 B:GCP 專用伺服器
兩條路徑會合
事件期間輪替的部分憑證,後續仍遭未授權使用。 Zeabur 的叢集每日備份會保存所有機密,而攻擊者在 10 月 15 日 15:04 讀取了備份的存取金鑰。我們在 15:40 換上的新金鑰,被 16:00 的備份收錄;攻擊者在 20:30 使用了它。我們在 18:51 刪除備份的存取金鑰,並在 21:47 再次輪替受影響的憑證。新金鑰被備份收錄、之後遭使用,這兩點已確認;攻擊者是否下載了這份備份屬於研判。攻擊者可能在 18:51 前就已取得備份,所以 20:30 的使用不代表 18:51 之後仍能下載。
| 系統 | 受影響的資料 | 範圍 | 確定程度 |
|---|---|---|---|
| 平台資料庫 | 存放在 Zeabur 的服務環境變數(名稱與值) | 3,218,965 筆 | 已確認 |
| 平台資料庫 | 帳號(電子郵件、使用者名稱、手機號碼等)、專案、環境與服務資料 | 帳號 321,810 筆 | 已確認 |
| 平台資料庫 | zSend API 金鑰(明文) | 566 把,已撤銷 | 已確認 |
| 平台資料庫 | 平台存取權杖 | 11,536 筆,只有雜湊值,無法還原;已全部撤銷 | 已確認 |
| 共享叢集 | 所有服務的環境變數與機密 | 9 個區域 | 部分已確認,其餘無法確認 |
| 共享叢集 | 資料庫內容 | 865 個資料庫服務 | 研判(見下方說明) |
| GCP 專用伺服器 | 伺服器上的所有資料 | 101 台,92 位使用者 | 已確認登入 |
| Hetzner、DigitalOcean 專用伺服器 | 伺服器的管理權限 | 359 台與 48 台 | 無法確認是否遭使用 |
| GitHub App | 存取使用者授權的 GitHub 儲存庫 | 10/15 15:05 至 18:54 | 未發現遭使用 |
| 使用者資料庫備份 | 台北(tpe1)與香港(hkg1)區域的備份 | 兩個區域 | 無法確認是否遭下載 |
平台資料庫。 10 月 15 日 16:10 至 16:47,攻擊者讀取了上表的資料。帳號資料包含個人頁面上的資訊,例如電子郵件、使用者名稱與手機號碼。攻擊者也搜尋了環境變數與設定檔中的 API 金鑰與私鑰。從指令內容與後續行為來看,攻擊者主要在找可以直接使用的 API 金鑰,特別是 AI 服務的金鑰:攻擊者在平台資料庫中搜尋金鑰、大量讀取 n8n 與 new-api/one-api 中的憑證,也嘗試用 Zeabur 的 AWS 金鑰呼叫 Amazon Bedrock。這只是對攻擊者意圖的觀察;攻擊者也讀取了帳號資料,我們仍把所有讀取到的資料當作已外洩。雙重驗證與通行金鑰的資料表只被查詢了統計資訊,沒有讀取內容的紀錄。我們已撤銷所有使用者的平台存取權杖,舊權杖都無法再使用。
已遷移的環境變數不在平台資料庫遭讀取的範圍內。 八月事件後,Zeabur 提供專用伺服器的使用者輪替憑證、刪除存放在 Zeabur 的環境變數與設定檔,並一鍵遷移到自己伺服器的指引與功能。已完成遷移的專案,這些資料只存放在使用者的伺服器上,Zeabur 沒有保存,因此不在這次平台資料庫遭讀取的資料中。尚未遷移的專案,環境變數仍存放在 Zeabur,這次也遭讀取。這不排除主機入侵造成的外洩;遭入侵的 GCP 專用伺服器仍適用下方的處置建議。
冒用帳號。 攻擊者讀取了用來簽發登入憑證的金鑰,我們研判攻擊者用它偽造了登入憑證。攻擊者到 16:47 才大量讀取平台存取權杖,而且權杖只存雜湊值,無法解釋 16:12 就開始的冒用。10 月 15 日 16:12 至 17:19,攻擊者以兩個帳號的身分呼叫 Zeabur API,讀取帳號與專案清單;其中一個是 Zeabur 員工的帳號。這些請求沒有修改任何資源。我們在 20:25 輪替了簽章金鑰,所有使用者都已被登出。
共享叢集的資料庫。 攻擊者在 865 個資料庫的容器內執行了讀取指令。稽核紀錄只記錄指令,不記錄輸出,部分指令也因錯誤而失敗,所以每個資料庫實際被讀走多少無法確認。我們依指令內容判斷:
| 對象 | 數量 | 被讀取的資料 |
|---|---|---|
| 使用 PostgreSQL 的 n8n | 736 | 第三方憑證、使用者、專案、變數與 workflow |
| PostgreSQL(逐表讀取) | 211 | 每張表最多 50,000 筆;台北(tpe1)區域沒有 |
| new-api/one-api | 10 | AI 服務金鑰、存取權杖與使用者 |
| Redis | 1 | 名稱含 token、secret 等字樣的項目 |
| MongoDB、MariaDB | 各 1 | 台北(tpe0)沒有指令內容,當作全部外洩 |
使用 PostgreSQL 的 n8n,有 602 個(檢查的 607 個中)把加密金鑰寫在環境變數中,所以 n8n 內的第三方憑證等同以明文外洩。由於此次資料讀取發生於容器內部,八月事件後的資料庫密碼輪替,並未能阻斷此次存取路徑。
另外,東京(hnd1)區域至少 2 個 PostgreSQL 自 10 月 14 日 01:51 起被植入會回連外部的程式,其中一個在 10 月 15 日 16:24 仍有回連。它的入口是否為八月外洩的密碼,目前無法確認。我們已在發現時通知受影響的使用者更換憑證。
GCP 專用伺服器。 調查確認,攻擊者曾以 root 權限登入 101 台伺服器,最後一次登入時間為 10 月 15 日 20:36。攻擊者另於其中 50 台伺服器新增其控制的 SSH 公開金鑰,建立持續存取途徑;並在 Zeabur 的 GCP 專案內建立 5 台虛擬機器,將 16 份客戶伺服器磁碟複本掛載至其建立的虛擬機器。
基於上述存取範圍,這 101 台伺服器均被列為可能發生資料外洩及留有未授權存取機制的受影響主機。我們已透過電子郵件通知受影響使用者,並重設相關伺服器的 root 密碼。
Hetzner 與 DigitalOcean。 管理這兩家客戶伺服器的權杖寫在內部程式碼與環境變數中,隨平台資料庫一起外洩。持有權杖可以重設密碼、重灌系統或複製磁碟。我們在 10 月 16 日 01:09 撤銷了全部權杖。兩家都沒有操作稽核紀錄;Hetzner 帳號的事件都能對應到使用者本人或系統排程,DigitalOcean 仍在比對。
Linode 與 Tencent Cloud。 Linode 890 台伺服器中,有紀錄的 847 台沒有攻擊者登入。Tencent Cloud 的管理憑證沒有遭使用的紀錄。
GitHub App。 攻擊者在 10 月 15 日 15:05 讀取了 Zeabur GitHub App 的私鑰。持有私鑰就能存取使用者授權 Zeabur 存取的儲存庫。我們在 18:54 輪替私鑰,目前沒有發現它遭使用。我們已向 GitHub Support 申請完整的稽核紀錄,尚未取得回覆。
Zeabur 內部系統。 攻擊者使用了多組 Zeabur 的 AWS 金鑰。大多數請求被拒絕,但攻擊者列出了兩個區域的使用者資料庫備份與原始碼上傳的內容;是否下載無法確認。攻擊者嘗試呼叫 Amazon Bedrock,全部失敗,沒有產生費用。
| 時間(10 月 15 日) | 處置 |
|---|---|
| 14:43–15:56 | 共享叢集的管理介面只允許 Zeabur 系統連線 |
| 15:32 | 撤銷遭使用的叢集管理權杖;21:47 再輪替一次 |
| 17:17、17:31 | 停用攻擊者使用的兩把 GCP 金鑰 |
| 17:58 | 移除攻擊者的內網節點,並撤銷建立它的憑證 |
| 18:51 | 刪除叢集備份的存取金鑰 |
| 18:54 | 輪替 GitHub App 私鑰、付款服務金鑰與 GitHub OAuth 密鑰 |
| 18:55 | 移除 GCP 伺服器初始化設定中的 root 密碼 |
| 20:05–21:22 | 停用 24 組已外洩或無法排除外洩的 AWS 金鑰,換上權限更小的新金鑰 |
| 20:25 | 輪替登入簽章金鑰,所有使用者被登出 |
| 20:34–20:36 | 移除 GCP 伺服器預設服務帳號的權限;封鎖 GCP 伺服器的公網 SSH |
| 20:47 | 撤銷全部 566 把 zSend API 金鑰 |
| 21:46 | Zeabur 管理的專用叢集只允許 Zeabur 系統連線 |
| 10/16 01:09 | 撤銷外洩的 Hetzner 與 DigitalOcean 權杖 |
我們也停用了寫死在程式碼中的 Tencent Cloud、阿里雲與 Linode 憑證,從 GCP 伺服器移除了攻擊者的 SSH 金鑰,並保全了各系統的稽核紀錄。
之後我們也完成了:
| 功能 | 影響期間(UTC) | 目前狀態 |
|---|---|---|
| 登入 | 10/15 20:25 起需重新登入 | 正常 |
| zSend 與系統信(含登入連結) | 10/15 20:00–22:02 | 已恢復;zSend 金鑰需重新建立 |
| GitHub 登入與部署 | 10/15 18:54–22:49 | 已恢復 |
| 建置 | 10/15 20:05–22:56;中國區至 10/16 01:44 | 已恢復 |
| 資料庫備份 | 10/15 20:33–22:13 | 已恢復 |
| GCP 專用伺服器管理 | 10/15 17:31–20:35 | 已恢復;只能用網頁 SSH |
| 專用伺服器自動續費 | Tencent Cloud 10/15 22:55–10/16 01:08 失敗 154 次 | 已恢復;扣款已退為帳戶餘額 |
| Tencent Cloud 重設密碼、SSH 登入紀錄 | 10/15 起 | 已恢復 |
| Linode 專用 Kubernetes 叢集 | 10/15 起 | 已恢復 |
請現在就處理,不需等待通知信。八月事件後換過的憑證,也要再換一次。
把伺服器當作已遭入侵:
/root/.ssh/authorized_keys 中註解為 @zeabur-pentest 或您不認得的金鑰。google-sudoers 群組、系統帳號、crontab、systemd 服務與 k3s 工作負載。在控制台檢查 10 月 14 日之後 root 密碼是否被重設、系統是否被重灌,並依上方 GCP 的檢查項目確認沒有不明的登入方式。
觸發: 攻擊者持有 Zeabur 的叢集管理權杖與多組雲端金鑰。這些憑證以明文保存在設定儲存庫中。攻擊者如何取得它們,目前無法確認;最可能的路徑見尚未證實的推測。
影響範圍擴大的相關因素:
這是 Zeabur 不到兩個月內的第二起資安事件。許多使用者在八月後依我們的指引做了調整,也會想知道:既然做了這些措施,為什麼還會發生,兩起事件有沒有關聯。
八月後做了什麼。 我們輪替了當時確認外洩的內部金鑰,並停用 Legacy API Key。產品上,專用伺服器的專案可以把環境變數與設定檔遷移到自己的伺服器,也可以刪除 Zeabur 保存的 SSH 憑證,並查看 SSH 登入紀錄。八月事件的通知與公告中,也建議使用者輪替憑證、刪除存放在 Zeabur 的環境變數與設定檔,並遷移到自己的伺服器。
為什麼還是發生。 八月的輪替沒有涵蓋設定儲存庫中以明文保存的叢集管理權杖與 AWS 金鑰,GCP 伺服器初始化設定中的 root 密碼也還沒修正。這次攻擊者使用的正是這些憑證。八月事件報告寫「已停用或輪替所有內部管理金鑰」,這個說法並不完整,我們在此更正。攻擊者如何取得這些憑證,目前無法確認;我們的推測見尚未證實的推測。
有做對的地方。 已依八月指引完成遷移的專案,環境變數與設定檔只存放在使用者自己的伺服器上,不在這次平台資料庫遭讀取的資料中。
| 時間(UTC) | 事件 |
|---|---|
| 2024 年 1 月 10 日 | 建立共享叢集的管理權杖,沒有期限 |
| 2026 年 1 月 20 日 | 管理權杖以明文寫入設定儲存庫 |
| 8 月 27 日 | 八月事件中,GitHub App 私鑰遭讀取;與本事件的關聯為推測 |
| 8 月 30 日、9 月 2 日 | 設定儲存庫以員工的 GitHub 授權被下載為壓縮檔,下載者無法確認 |
| 8 月 31 日 | 更換 GitHub App 私鑰;設定儲存庫中的明文憑證沒有輪替 |
| 9 月 1–5 日 | 不明來源以 root 密碼登入約 98 台 GCP 專用伺服器 |
| 9 月 3 日 | 發現 GCP 伺服器的初始化設定保存 root 密碼,未在事發前修正 |
| 10 月 10 日 18:27 | 後續用於憑證濫用的 IP 首次出現在 Zeabur API 存取紀錄(未登入) |
| 10 月 13 日 21:27 | 攻擊者 IP 嘗試 SSH 登入 3 台專用伺服器,至 23:04,全部失敗 |
| 10 月 14 日 01:36 | 攻擊者首次使用 Zeabur 的 AWS 金鑰 |
| 10 月 14 日 01:40 | 攻擊者首次以管理權杖存取共享叢集 |
| 10 月 14 日 12:39 | 攻擊者讀取共享叢集所有服務的設定與機密 |
| 10 月 14 日 13:40 | 攻擊者開始在資料庫容器內讀取資料;同時開始登入 GCP 專用伺服器 |
| 10 月 14 日 17:04 | 資料庫容器內的最後一個指令 |
| 10 月 15 日 13:56 | 收到使用者回報後,啟動調查 |
| 10 月 15 日 14:43 | 開始限制共享叢集管理介面的連線來源 |
| 10 月 15 日 14:52 | 攻擊者開始讀取約 53 筆正式環境機密,至 16:51 |
| 10 月 15 日 15:02 | 已停用服務的部署金鑰讀取設定儲存庫(推測為攻擊者) |
| 10 月 15 日 15:30 | 攻擊者讓一個節點加入 Zeabur 內部網路 |
| 10 月 15 日 15:42 | 攻擊者下載 Zeabur 儲存空間中的使用者資料庫備份 |
| 10 月 15 日 16:06 | 攻擊者在取得的資料中搜尋 API 金鑰,至 18:13 |
| 10 月 15 日 16:10 | 攻擊者開始讀取平台資料庫,至 16:47 |
| 10 月 15 日 16:12 | 攻擊者開始冒用帳號呼叫 API,至 17:19 |
| 10 月 15 日 17:58 | 移除攻擊者的內網節點 |
| 10 月 15 日 19:50 | 攻擊者第二波登入 GCP 專用伺服器,至 20:36 |
| 10 月 15 日 20:25 | 輪替登入簽章金鑰,所有使用者被登出 |
| 10 月 15 日 20:36 | 封鎖 GCP 專用伺服器的公網 SSH,攻擊者的登入停止 |
| 10 月 15 日 20:48 | 狀態頁更新為平台資料庫與專用伺服器也受影響 |
| 10 月 15 日 21:01 | 攻擊者嘗試存取共享叢集節點,遭拒 |
| 10 月 15 日 21:05 | 目前觀察到的攻擊者最後活動(AWS) |
| 10 月 16 日 01:09 | 撤銷 Hetzner 與 DigitalOcean 權杖 |
| 10 月 16 日 01:50 | 一位使用者的 OpenAI 金鑰遭濫用,至 02:56(推測來自本次外洩) |
以下事項因現有紀錄的涵蓋範圍或完整性限制,目前尚無法確認。對於無法排除遭未授權存取的資料與憑證,我們依可能已外洩的情境採取應變措施。
以下是我們目前認為最可能的解釋。它們有間接證據支持,但缺少直接紀錄,不能當作事實引用。取得新證據後,我們會更新或撤回。
1. 最初的憑證可能來自八月事件
2. 10 月 14 日前的探測可能是同一攻擊者的偵察
103.237.102.191:10 月 10 日 18:27 未登入瀏覽 Zeabur,10 月 14 日以管理權杖存取共享叢集。23.106.46.239:10 月 12 日 12:52 起未登入大量嘗試 Zeabur API,10 月 13 日嘗試 SSH 登入專用伺服器,10 月 14 日 01:36 首次使用外洩的 AWS 金鑰。3. 10 月 15 日的部署金鑰存取可能是攻擊者
4. 外洩的使用者金鑰可能已遭濫用
在您的系統或服務供應商紀錄中發現下列指標時,請把相關憑證當作已外洩,並聯繫我們。攻擊者大量使用輪替的代理伺服器,下表只列代表性的位址。
| 類型 | 指標 | 出現在 |
|---|---|---|
| IP | 23.106.46.239 | 叢集存取、雲端 API、SSH 登入 |
| IP | 102.244.78.57 | 雲端 API、GCP 設定修改 |
| IP | 103.237.102.191 | 叢集存取、雲端 API |
| IP | 103.112.139.162 | 首次使用叢集管理權杖 |
| IP | 45.146.232.28 | 驗證 AWS 金鑰 |
| IP | 216.98.11.198、45.58.38.175 | 專用伺服器 SSH 登入 |
| IP | 52.220.72.188 | 遭植入程式的 PostgreSQL 回連位址 |
| IP | 31.57.201.201 | 9 月初以 root 密碼登入 GCP 專用伺服器;與本事件的關聯無法確認 |
| SSH 金鑰 | 註解 *@zeabur-pentest,指紋 SHA256:EdBc0uephoOMemIRKK0SRV2TRR45n52tJm1yErVU1iM | 攻擊者加入專用伺服器的金鑰 |
| User-Agent | Boto3/1.43.111(Linux 6.12.86) | 攻擊者使用 AWS 金鑰的用戶端 |
如需協助,或發現異常存取與不明費用,請透過 Zeabur Support 聯繫我們。聯繫前請先撤銷相關憑證,並只提供遮蔽後的資訊;請勿在工單或公開管道貼出仍有效的金鑰或密碼。
若您的第三方 API 金鑰或雲端帳號因本事件產生額外費用,請透過支援工單申請補償。我們會核對供應商的使用紀錄與費用,並說明查核結果。
Zeabur 已宣布將於 2026 年 12 月 31 日停止營運,這是營運上的決定。在此之前,我們會持續處理本事件的支援與補償申請,並持續更新本文與狀態頁。我們向所有受影響的使用者致歉。
Zeabur 團隊