Zeabur 平台端被入侵,攻擊者拿到專案的環境變數紀錄
- 官方已實際觀察到 Anthropic、OpenAI、OpenRouter 的 API 憑證被盜用
- 建一把新 Key 不會讓舊的失效,一定要另外執行撤銷
- 改 Zeabur 上的
POSTGRES_PASSWORD變數,不等於改掉資料庫真正的密碼 - 通知信分兩批寄、判定條件不同,沒收到信不代表沒事
-
8/27Zeabur 偵測到一組內部服務憑證遭到未授權存取
-
8/28在社群上有看到部分貼文反應收到 Zeabur 信件表示 API Key 等等相關回報
-
8/29凌晨一點多,我也收到 Zeabur 寄來的「[安全事件更新] 請輪替新增確認受影響的環境變數」
也因此把 Zeabur 專案中的相關 ENV 環境變數重新做一次 rotate
萬幸這次沒有什麼 AI API Key 遭到盜用,還沒觀察到什麼實際的損失
但 ENV 整個外流是非常嚴重且麻煩的
除了 API Key 需要逐一輪替更換以外
也要擔心其他例如密碼等等是否可能會有 DB 被連線 dump 出去的問題
這次到底外洩了什麼
攻擊者拿那組內部憑證去取得部分使用者專案的環境變數紀錄
後續官方對媒體證實的一句話最重:已經實際觀察到 Anthropic、OpenAI、OpenRouter 的 API 憑證遭到盜用
不是「可能外洩」,是真的有人拿去用
官方列出確認曝露的變數名稱:
1 | ACCESS_TOKEN API_SECRET AWS_ACCESS_KEY_ID |
另外 Zeabur 在調查期間發現 AI Hub 用的 LiteLLM 出現可疑活動
目前 AI Hub 服務已經暫停
帳號密碼、個資、付款與信用卡資訊,官方表示沒有被存取的跡象
沒收到信不是沒事
通知分成兩批寄,兩批的判定方式不一樣
信裡自己也寫了「無論您是否收到先前的事件通知」
我這邊的實際狀況是:兩個 Google 帳號只有其中一個收到
有多組 Zeabur 帳號的人可能要特別注意
只查常用信箱會漏掉,也建議先把其他帳號有相關專案或是 ENV 先輪替掉
盤點環境變數
可以在 Zeabur 網頁逐一檢查
如果你會用 Claude Code 等 CLI 工具
可以用 Zeabur CLI 直接幫你排查
1 | npx zeabur@latest variable list --id <SERVICE_ID> -i=false --json |
用 postgres 模板來示範:
1 | postgresql 服務的 PASSWORD |
雖然是 POSTGRES_PASSWORD 外流,但其實要改的是 PASSWORD
因為 POSTGRES_PASSWORD 是引用 PASSWORD 的
第三方 API Key:需要直接撤銷重新產生
這是官方特別提醒、也最容易沒做完整的一步
建立一把新的 API Key,不會讓舊的失效
舊 Key 沒有被撤銷之前,它一直都是可以用的
正確順序是四步,不要跳:
- 到第三方後台建新 Key
- 把新 Key 換到 Zeabur 變數上,重啟服務確認能跑
- 回廠商後台撤銷舊 Key(Revoke / Delete,不是只是改名)
- 查log 或是 Usage 和帳單,看撤銷之前有沒有被拿去用
各家的 Key 管理頁,以及查有沒有被盜用要看哪一頁:
| 服務 | Key 管理頁 | 查有沒有被盜用 |
|---|---|---|
| OpenAI | platform.openai.com/api-keys | platform.openai.com/logs 看逐筆 API 呼叫紀錄 |
| Claude | platform.claude.com/settings/workspaces/default/keys | 同一個後台的 Usage 與 Cost 頁 |
| OpenRouter | openrouter.ai/settings/keys | Activity 頁的呼叫紀錄 |
OpenAI 的 /logs 比較好用
可以看到完整的時間、模型、來源等等
目前查看來都是我平時的排程和自動化產生的紀錄
並沒有特別有其他意外的發現
資料庫密碼:改環境變數不等於改密碼
按照官方給的 Rotate Key 文件
不是只更新 ENV 的值而已
而是需要另外再用 command 去更新 DB 裡面使用的密碼
否則重新啟動服務後,會有錯誤的情況發生
官方那份輪替指南需要注意
Zeabur 把一份輪替指南掛在事件通知上,PostgreSQL 那行長這樣:
1 | psql -U root -c "ALTER USER postgres WITH PASSWORD '<新密碼>';" |
三個地方會出事:
| 問題 | 後果 |
|---|---|
| ALTER USER postgres 把角色名寫死 | Zeabur 的 postgres 模板通常沒有 postgres 這個角色,回 role "postgres" does not exist |
| -U root 把使用者寫死 | Odoo 這類模板的使用者是 odoo-admin,這行直接連不上 |
| 沒有 -d | psql 預設會連「跟使用者同名的資料庫」,而那個資料庫不存在 |
如果 指令少了 -d
會有個錯誤是「資料庫 root 不存在」
一般人看到會往角色跟權限的方向找,很難聯想到是預設資料庫的問題
不用管自己的 Username 是什麼,可以用一個比較通用的指令
1 | psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "ALTER USER CURRENT_USER WITH PASSWORD '<新密碼>';" |
$POSTGRES_USER 跟 $POSTGRES_DB 是容器本來就帶的環境變數,CURRENT_USER 自動對應目前連線的身分
想先確認自己的使用者是誰,最快是去環境變數分頁點開 POSTGRES_USER 的眼睛圖示
如何在 Zeabur 網頁版走一次輪替
輪替做完之後,我自己用網頁介面重新走一次流程
在「環境變數 → 編輯原始環境變數」把 PASSWORD 改成新值,然後就以為做完了
存檔完回到服務狀態頁,狀態是運作中 1/1
這一頁右下角那張寫著「指令」的卡片,就是等一下要用的容器終端機入口
麻煩的是當下服務完全正常
健康檢查回 200、log 乾淨、workflow 照跑
因為 n8n 從改變數之後就沒重啟過,目前的舊連線還是對的
這是一顆定時炸彈,下一次重啟才會炸掉噴 Error
這時候按下「全部重啟」就是直接引爆
所以順序要反過來
先進容器把資料庫裡面的密碼也改掉,再回來重啟
上面那三行 WARNING、DETAIL、HINT 看起來很像出錯,其實每次連線都會出現,跟密碼一點關係都沒有
真正的結果是最下面那行 ALTER ROLE
psql 成功的時候就只回一行 ALTER ROLE,不會跟你說「成功」
改完密碼回到 n8n 服務按「重新啟動」:
重啟之後大約 1~2 分鐘,資料庫端也看得到重啟後才建立的新連線
常見問題
通知分兩批寄、判定條件不同,信裡自己也寫「無論您是否收到先前的事件通知」
建議現在就先查詢自己在 Zeabur 上是否有部署服務,跟是否有填入 API Key 在環境變數中
一定要另外到廠商後台執行撤銷(Revoke / Delete)
順序建議是:建新 Key → 換上去確認服務正常 → 再撤銷舊的
如果你的 workflow 有串 AI Hub,要先準備替代的模型來源






