攻擊者用外洩的內部憑證入侵共享叢集與 GCP 專用伺服器,最後讀取了存放在 Zeabur 平台資料庫中的環境變數。本文說明事件經過、受影響的資料、我們的處置,以及你需要做的事。
本文亦提供 English、简体中文、日本語、Español和Bahasa Indonesia。
本文時間均為世界協調時間(UTC)。
2026 年 10 月 15 日 13:56,我們收到使用者回報,啟動調查。事後比對紀錄才知道,攻擊者早在 10 月 14 日 01:36 就開始使用 Zeabur 的內部憑證,比我們察覺早了約 36 小時。這段期間,攻擊者用的都是有效的憑證,走的也是 Zeabur 正式的存取管道,沒有觸發任何告警。
攻擊者從兩條路徑進入,10 月 15 日在 Zeabur 的內部網路會合,讀取了平台資料庫。這次被使用的憑證,八月事件後的輪替都沒有涵蓋。
| 項目 | 內容 |
|---|---|
| 狀態 | 定稿 |
| 你需要做什麼 | 更換存放在 Zeabur 的所有密碼與金鑰,八月事件後換過的也要再換一次,見你需要做什麼 |
| 事件期間 | 10 月 14 日 01:36 至 10 月 15 日 21:05(紀錄中攻擊者最後的活動) |
| 察覺 | 10 月 15 日 13:56 收到使用者回報,距攻擊者首次使用憑證約 36 小時,見偵測 |
| 遏止 | 10 月 15 日 17:58 移除攻擊者的內網節點,20:36 封鎖 GCP 專用伺服器的公網 SSH,所有使用者都已登出 |
| 影響 | 平台資料庫中的環境變數與帳號資料、共享叢集上的服務與資料庫、101 台 GCP 專用伺服器。八月後已遷移到自己伺服器的環境變數不在讀取範圍內,見影響範圍 |
| 最可能的原因 | Zeabur 的私有設定儲存庫外洩,途徑無法確認。儲存庫中的憑證以明文保存、長期有效,叢集管理介面也對公網開放,見根本原因 |
| 用語 | 意思 |
|---|---|
| 已確認 | 有日誌直接記錄 |
| 研判 | 時間與內容吻合,但缺少直接紀錄 |
| 無法確認 | 沒有紀錄可查,我們一律當作已外洩處理 |
| 推測 | 只有間接證據支持的可能解釋,集中列在尚未證實的推測 |
請現在就處理,不必等通知信。已外洩的資料仍可能被利用,八月事件後換過的憑證,也要再換一次。
把伺服器當作已遭入侵:
/root/.ssh/authorized_keys 中註解為 @zeabur-pentest 或你不認得的金鑰。google-sudoers 群組、系統帳號、crontab、systemd 服務與 k3s 工作負載。在控制台檢查 10 月 14 日之後 root 密碼是否遭重設、系統是否遭重灌,並依上方 GCP 的檢查項目,確認沒有不明的登入方式。
| 系統 | 受影響的資料 | 範圍 | 確定程度 |
|---|---|---|---|
| 平台資料庫 | 存放在 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 金鑰,特別是 AI 服務的金鑰:在環境變數與設定檔中搜尋 API 金鑰與私鑰、大量讀取 n8n 與 new-api/one-api 中的憑證,也試過用 Zeabur 的 AWS 金鑰呼叫 Amazon Bedrock。這是我們從指令內容與後續行為得出的觀察。攻擊者也讀取了帳號資料,所有讀到的資料,我們都當作已外洩。
八月事件後,Zeabur 為專用伺服器的使用者提供了指引與一鍵遷移功能:輪替憑證、刪除存放在 Zeabur 的環境變數與設定檔,改存到自己的伺服器。完成遷移的專案,這些資料只存在使用者的伺服器上,不在這次遭讀取的範圍內;尚未遷移的專案,環境變數仍存放在 Zeabur,這次也遭讀取。主機本身遭入侵造成的外洩不在此限,遭入侵的 GCP 專用伺服器仍要依你需要做什麼處置。
10 月 15 日 16:12 至 17:19,攻擊者以兩個帳號的身分呼叫 Zeabur API,讀取帳號與專案清單,其中一個是 Zeabur 員工的帳號。這些請求沒有修改任何資源。
攻擊者讀取了用來簽發登入憑證的金鑰,我們研判登入憑證是用這把金鑰偽造的:平台存取權杖只存雜湊值,攻擊者又到 16:47 才大量讀取,解釋不了 16:12 就開始的冒用。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,我們檢查了 607 個,其中 602 個把加密金鑰寫在環境變數裡,n8n 內的第三方憑證因此等同以明文外洩。這些讀取發生在容器內部,八月事件後輪替的資料庫密碼,對這種讀取沒有防護作用。
東京(hnd1)區域另有至少 2 個 PostgreSQL 自 10 月 14 日 01:51 起被植入會回連外部的程式,其中一個到 10 月 15 日 16:24 仍有回連。入口是否為八月外洩的密碼,無法確認。我們在發現時已通知受影響的使用者更換憑證。
攻擊者曾以 root 權限登入 101 台伺服器,最後一次登入是 10 月 15 日 20:36。攻擊者在其中 50 台加入自己控制的 SSH 公開金鑰,留下之後還能登入的管道,也在 Zeabur 的 GCP 專案內建立 5 台虛擬機器,把 16 份客戶伺服器的磁碟複本掛載上去。
這 101 台伺服器,我們都當作資料可能已外洩、也可能留有後門。我們已寄信通知受影響的使用者,並重設這些伺服器的 root 密碼。
管理 Hetzner 與 DigitalOcean 客戶伺服器的權杖寫在內部程式碼與環境變數中,隨平台資料庫一起外洩。持有權杖就能重設密碼、重灌系統或複製磁碟。我們在 10 月 16 日 01:09 撤銷了全部權杖。兩家都沒有提供操作稽核 API,權杖是否遭使用無法確認。我們只排除了一件事:10 月 15 日 Hetzner 上的重設密碼與建立映像檔,是客戶本人和系統排程所做。DigitalOcean 沒有比對結果。
Linode 890 台伺服器中,有紀錄的 847 台沒有攻擊者登入。Tencent Cloud 的管理憑證沒有遭使用的紀錄。
10 月 15 日 15:05,攻擊者讀取了 Zeabur GitHub App 的私鑰。持有這把私鑰,就能存取使用者授權 Zeabur 存取的儲存庫。我們在 18:54 輪替私鑰。私鑰是否遭使用無法確認:我們沒有取得 GitHub 組織的完整稽核紀錄,向 GitHub Support 申請的紀錄也始終沒有回覆。
攻擊者使用了多組 Zeabur 的 AWS 金鑰。大多數請求遭到拒絕,但攻擊者列出了兩個區域的使用者資料庫備份與原始碼上傳的內容,是否下載無法確認。攻擊者呼叫 Amazon Bedrock 的嘗試全部失敗,沒有產生費用。
| 功能 | 影響期間(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 起 | 已恢復 |
攻擊者走了兩條路徑:路徑 A 從共享叢集進入 Zeabur 的 AWS 與機密管理服務,路徑 B 取得 GCP 專用伺服器的 root 權限。10 月 15 日,兩條路徑在 Zeabur 的內部網路會合。各步驟對應的 MITRE ATT&CK 技術,見附錄。
這批登入發生在 10 月 14 日,比路徑 A 已知最早的正式環境機密讀取(10 月 15 日 14:52)早了一天多,所以路徑 B 的起點,不能用路徑 A 讀到的機密來解釋。同一批伺服器在 9 月 1 日至 5 日也曾有不明來源以 root 密碼登入,9 月 5 日當天約 98 台。是否為同一攻擊者,無法確認。
平台資料庫遭讀取的結論,來自內部網路兩端的連線紀錄與資料庫日誌:這段期間的 29 個資料庫連線都能對應到這個節點,連線中的登入與查詢也能逐一追蹤,共 8,903 筆操作紀錄。
10 月 15 日 13:56,我們收到使用者回報,才啟動調查。這時距離攻擊者首次使用憑證(10 月 14 日 01:36)約 36 小時,10 月 14 日的攻擊活動也持續了超過 16 小時。
這段期間沒有任何告警:
啟動調查後約 4 小時,我們移除了攻擊者的內網節點。10 月 15 日至 16 日的處置如下:
| 時間(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 權杖 |
應變當天換上的憑證,有一部分後來還是遭攻擊者使用,問題出在叢集的每日備份。每日備份涵蓋叢集內所有資源,機密也在其中,而攻擊者在 10 月 15 日 15:04 讀取了備份的存取金鑰:
新金鑰被備份收錄、之後遭使用,這兩點已確認;攻擊者下載了這份備份,則是研判。20:30 用到的金鑰,也可能來自攻擊者在 18:51 之前就已取得的備份。
攻擊者一開始就持有 Zeabur 的叢集管理權杖與多組雲端金鑰。這些憑證保存在 Zeabur 的私有設定儲存庫中,沿用過往的做法,以明文保存。最可能的情況是這份設定儲存庫外洩,但外洩途徑無法確認,推測見尚未證實的推測。
這是 Zeabur 不到兩個月內的第二起資安事件。許多使用者在八月後照我們的指引做了調整,也想知道:既然做了這些,為什麼還會發生,兩起事件又有沒有關聯。
八月後做了什麼。我們輪替了當時確認外洩的內部金鑰,並停用 Legacy API Key。產品上,專用伺服器的專案可以把環境變數與設定檔遷移到自己的伺服器,也可以刪除 Zeabur 保存的 SSH 憑證,並查看 SSH 登入紀錄。八月事件的通知與公告也建議使用者輪替憑證、刪除存放在 Zeabur 的環境變數與設定檔,並遷移到自己的伺服器。
為什麼還是發生。八月的輪替沒有涵蓋設定儲存庫中以明文保存的叢集管理權杖與 AWS 金鑰,GCP 伺服器初始化設定中的 root 密碼也還沒修正,而這次攻擊者用的正是這些憑證。八月事件報告寫「已停用或輪替所有內部管理金鑰」,這個說法並不完整,我們在此更正。
Zeabur 將在 2026 年 12 月 31 日停止營運,以下只列已執行的改善。
| 項目 | 狀態 |
|---|---|
| 撤銷遭使用的叢集管理權杖,管理介面只允許 Zeabur 系統連線 | 完成 |
| 移除 GCP 伺服器初始化設定中的 root 密碼,封鎖公網 SSH | 完成 |
| AWS 金鑰換成權限更小的新金鑰 | 完成 |
| 只允許指定的服務連線平台資料庫 | 完成 |
| 叢集備份不再保存明文機密,備份金鑰與其他機密分開保存 | 完成 |
| 新增告警:管理權限的異常使用、在容器內執行指令、大量讀取機密或資料庫、內網加入新節點、雲端金鑰從陌生來源使用 | 初步完成 |
以下事項受限於現有紀錄,到本文定稿時仍無法查明。無法排除遭存取的資料與憑證,我們都當作已外洩處理。
31.57.201.201 是否為同一攻擊者,也沒有結論。以下是我們認為最可能的解釋。它們有間接證據支持,但缺少直接紀錄,不能當作事實引用。到本文定稿時,這些推測都沒有得到證實,也沒有被推翻。
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 金鑰。| 時間(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 權杖 |
在你的系統或服務供應商紀錄中發現下列指標時,請把相關憑證當作已外洩,並聯繫我們。攻擊者大量使用輪替的代理伺服器,下表只列代表性的位址。可信度採 STIX 的 0 到 100 數值:已確認為 85,研判為 60,無法確認為 30。機器可讀的版本見 STIX 2.1 檔案,其中的 IP 指標有效期到 2027 年 1 月 13 日。
| 類型 | 指標 | 出現在 | 可信度 |
|---|---|---|---|
| IP | 23.106.46.239 | 叢集存取、雲端 API、SSH 登入 | 85 |
| IP | 102.244.78.57 | 雲端 API、GCP 設定修改 | 85 |
| IP | 103.237.102.191 | 叢集存取、雲端 API | 85 |
| IP | 103.112.139.162 | 首次使用叢集管理權杖 | 85 |
| IP | 45.146.232.28 | 驗證 AWS 金鑰 | 85 |
| IP | 216.98.11.198、45.58.38.175 | 專用伺服器 SSH 登入 | 85 |
| IP | 52.220.72.188 | 遭植入程式的 PostgreSQL 回連位址 | 85 |
| IP | 31.57.201.201 | 9 月初以 root 密碼登入 GCP 專用伺服器,與本事件的關聯無法確認 | 30 |
| SSH 金鑰 | 註解 *@zeabur-pentest,指紋 SHA256:EdBc0uephoOMemIRKK0SRV2TRR45n52tJm1yErVU1iM | 攻擊者加入專用伺服器的金鑰 | 85 |
| User-Agent | 同時含有 Boto3/1.43.111 與 os/linux#6.12.86+deb13-amd64 | 攻擊者使用 AWS 金鑰的用戶端,單獨比對容易誤判,請搭配來源 IP 與金鑰 | 60 |
依 MITRE ATT&CK 的戰術排列。
| 戰術 | 技術 | 本文段落 |
|---|---|---|
| 初始存取 | T1078.004 有效帳號:雲端帳號 | 路徑 A 第 1 步 |
| 初始存取 | T1133 外部遠端服務 | 兩條路徑會合第 1 步 |
| 執行 | T1609 容器管理指令 | 路徑 A 第 3 步 |
| 持續存取 | T1098.004 帳號操控:SSH 授權金鑰 | 路徑 B 第 2、3 步 |
| 防禦規避 | T1578.002 修改雲端運算基礎設施:建立雲端執行個體 | GCP 專用伺服器 |
| 防禦規避 | T1578.001 修改雲端運算基礎設施:建立快照 | GCP 專用伺服器 |
| 憑證存取 | T1552.001 未受保護的憑證:檔案中的憑證 | 路徑 A 第 1 步 |
| 憑證存取 | T1552.007 未受保護的憑證:容器 API | 路徑 A 第 2 步 |
| 憑證存取 | T1552 未受保護的憑證 | 路徑 B 第 1 步 |
| 憑證存取 | T1555.006 密碼儲存區中的憑證:雲端機密管理服務 | 路徑 A 第 5 步 |
| 憑證存取 | T1606 偽造網頁憑證 | 冒用帳號 |
| 憑證存取 | T1110 暴力破解(推測) | 10 月 14 日之前的 SSH 嘗試 |
| 探索 | T1580 雲端基礎設施探索 | Zeabur 內部系統 |
| 橫向移動 | T1021.004 遠端服務:SSH | 路徑 B 第 1 步 |
| 收集 | T1530 雲端儲存空間中的資料 | 路徑 A 第 4 步 |
| 收集 | T1213.006 資訊儲存庫中的資料:資料庫 | 兩條路徑會合第 2 步 |
| 影響 | T1496.004 資源劫持:雲端服務劫持(未成功) | Zeabur 內部系統 |
需要協助,或發現異常存取與不明費用,請透過 Zeabur Support 聯繫我們。聯繫前請先撤銷相關憑證,只提供遮蔽後的資訊,不要在工單或公開管道貼出仍有效的金鑰或密碼。
外洩的憑證遭盜用時,你可能需要承擔額外的費用,對此我們深感抱歉。在目前的財務條件下,Zeabur 無法支付本事件衍生的第三方服務費用。多數雲端與 API 服務供應商設有申訴或減免管道,你可以把這份報告附給供應商作為說明。供應商要求其他證明時,請透過工單告訴我們,我們會盡力提供。帳戶餘額退款不受本事件影響,詳見10 月資安事件後續處理說明。
Zeabur 已宣布將於 2026 年 12 月 31 日停止營運,這是營運上的決定。在那之前,我們會持續處理本事件的支援申請。
攻擊者開始使用憑證約 36 小時後,我們才從使用者的回報得知這起事件。保護你存放在 Zeabur 的憑證是我們的責任,我們沒有做到。我們向所有受影響的使用者致歉。
Zeabur 團隊