主金鑰洩漏 155 天後:攻擊者劫持發布流程推毒版套件
LiteLLM 於 2026 年 5 月 27 日將主金鑰意外提交到公開的 GitHub 儲存庫,commit 雖然立即被 force-push 覆蓋,但主金鑰未被撤銷。攻擊者在 155 天後使用這個金鑰取得 Agent Platform 的存取權,竊取 GitHub CLI OAuth token,進而取得組織擁有者級別的存取權,修改發布流程指向偽裝儲存庫,於 10 月 21 日推送惡意版本 1.107.0 到 PyPI 與 Docker Hub。這個惡意套件會在 Python 啟動時自動執行,竊取開發者工具、AI 應用、雲端環境與瀏覽器的憑證,並每小時從攻擊者控制的伺服器取得並執行任意程式碼。
- LiteLLM 於 2026 年 5 月 27 日將 Agent Platform 主金鑰意外提交到公開儲存庫,雖然 commit 立即被覆蓋,但主金鑰未被撤銷。攻擊者在 155 天後(10 月 10 日)使用這個金鑰取得 Agent Platform 存取權,竊取 GitHub CLI OAuth token,進而取得組織擁有者級別的存取權。
- 攻擊者在 10 月 21 日修改發布流程指向偽裝儲存庫 Berri-AI/litellm(而非正確的 BerriAI/litellm),推送惡意版本 1.107.0 到 PyPI 與 Docker Hub,並在發布後刪除執行記錄。惡意套件會在 Python 啟動時自動執行,即使應用程式沒有 import LiteLLM。
- 惡意程式有兩個執行路徑:憑證竊取模組(開發者工具、AI 應用、雲端環境、瀏覽器)與 Unix 後門(每小時從攻擊者伺服器取得並執行任意程式碼)。攻擊者還在 10 月 10 日與 12 日建立短暫分支並推送惡意 workflow,竊取更多內部系統的憑證與金鑰。
發生了什麼
2026 年 10 月 24 日,LiteLLM(一個熱門的 Python 大型語言模型閘道套件)揭露一場精心策劃的供應鏈攻擊,源自一個未撤銷的主金鑰,最終導致攻擊者推送惡意版本到 PyPI 與 Docker Hub。
「2026 年 5 月 27 日,一個設定檔被提交到公開的 LiteLLM-Labs/lite-harness 儲存庫,其中不慎包含了 LiteLLM Agent Platform 部署的主金鑰。」LiteLLM 的 Oliver Jensen 與 Mateo Wang 說。「這個錯誤很快被發現,commit 被 force-push 覆蓋,我們也識別出暴露的金鑰需要撤銷。然而,主金鑰的撤銷並未發生。」
攻擊者(來自 IP 69.48.229[.]143)在 155 天後的 2026 年 10 月 10 日使用這個未撤銷的金鑰取得 Agent Platform 的存取權,竊取了平台設定的 GitHub CLI OAuth token,該 token 允許自架的雲端代理向 GitHub 儲存庫提交 pull request。
這個 token「沒有限縮權限範圍」,且與 LiteLLM GitHub 組織擁有者的帳號關聯。取得這個 token 讓攻擊者擁有組織內所有儲存庫的擁有者級別存取權,並能執行進一步的憑證竊取。
攻擊時間軸
- 2026-05-27LiteLLM 將 Agent Platform 主金鑰意外提交到公開儲存庫,隨即覆蓋但未撤銷金鑰LiteLLM 官方報告
- 2026-10-10 22:11–22:12 UTC攻擊者使用未撤銷的主金鑰取得 GitHub CLI OAuth token,並在 BerriAI/litellm 與 BerriAI/litellm-auto 建立短暫分支推送惡意 workflowLiteLLM 官方報告與 Socket 研究
- 2026-10-10 22:12 UTC惡意 workflow 執行後數分鐘內被刪除LiteLLM 官方報告
- 2026-10-12攻擊者推送第二個惡意 workflow 到短暫分支,竊取更多內部系統憑證Socket 研究報告
- 2026-10-21 10:08–11:08 UTC攻擊者覆蓋分支保護並修改發布流程,將來源設定為偽裝儲存庫 Berri-AI/litellmLiteLLM 官方報告
- 2026-10-21 11:39–11:40 UTCLiteLLM 版本 1.107.0 被發布到 PyPILiteLLM 官方報告
- 2026-10-21 11:46 UTCDocker Hub 與 GHCR 映像檔被發布LiteLLM 官方報告
- 2026-10-21 11:53–11:54 UTC生產與測試環境的執行記錄被刪除LiteLLM 官方報告
- 2026-10-21 12:06 UTCUpwind 研究員 Lidor Machluf 回報供應鏈攻擊LiteLLM 官方報告
- 2026-10-21 13:23 UTCPyPI 隔離 LiteLLM 版本 1.107.0LiteLLM 官方報告
- 2026-10-21 14:20 UTCDocker Hub 標籤 v1.107.0、latest、main-latest、main-stable 被移除或重新指向乾淨的映像檔LiteLLM 官方報告
攻擊者怎麼劫持發布流程
攻擊者在取得 GitHub token 後執行以下步驟:
第一階段(10 月 10 日):竊取工程師的 token
攻擊者在內部儲存庫(BerriAI/litellm 與 BerriAI/litellm-auto)建立短暫分支並推送 commit,觸發設計來取得 GitHub CLI OAuth token 的 workflow,這些 token 與兩名擁有維護者權限的工程師關聯。workflow 透過攻擊者控制的 webhook[.]site 端點竊取 token。這兩次執行在幾分鐘後被刪除。
第二階段(10 月 12 日):擴大竊取範圍
攻擊者推送第二個惡意 workflow,擴大竊取範圍到更多內部系統的憑證,包括:
- Linear workspace、LiteLLM 部署、Together AI 的 API 金鑰
- Anthropic、OpenAI、AWS Bedrock、Tavily、GitGuardian 的 API 金鑰
- GitHub App 的識別碼與簽章金鑰
- Playwright 儲存狀態(瀏覽器 session)
- PostgreSQL 資料庫連線字串、帳號名稱、密碼
- Redis 端點位址、連接埠、認證密碼
資料透過兩個不同的 webhook[.]site 端點外洩。
第三階段(10 月 21 日):劫持發布流程
LiteLLM 在攻擊當週暫時放寬了發布流程的限制,原本需要授權的工程師觸發並由辦公室實體設備鎖定的特殊帳號批准,改為允許任何兩名工程師觸發與批准發布。攻擊者利用這個時機:
- 覆蓋分支保護
- 修改發布流程,將來源設定為偽裝儲存庫
Berri-AI/litellm(而非正確的BerriAI/litellm) - 用一個 token 觸發發布,用另一個 token 批准
「威脅行為者完全可以自己放寬這個限制(或完全移除),因為他們已經擁有組織擁有者的 token。」LiteLLM 說。「推測他們沒有這樣做是為了規避偵測。」
惡意套件做了什麼
多個研究報告揭露,LiteLLM 版本 1.107.0 內的檔案被設計為在 Python 啟動時自動執行,即使應用程式沒有 import LiteLLM。
惡意程式有兩個執行路徑:
路徑一:憑證竊取模組
目標是開發者工具、AI 應用、雲端環境與瀏覽器的認證資料:
- 系統資訊
- SSH 檔案
- Git 與 GitLab 憑證與 token
- 環境變數
- npm、PyPI、pip、Yarn、Maven、Gradle、Composer、RubyGems、Cargo 的 token
- 密碼管理器檔案
- 加密貨幣錢包
資料被壓縮並透過 HTTP POST 請求傳送到 litellm[.]dev/healthcheck。這個網域註冊於 2026 年 10 月 13 日。
路徑二:Unix 後門
作為背景程序啟動,每小時從攻擊者控制的伺服器取得並執行任意程式碼。
「這些機制讓潛在暴露範圍超出主動的 LiteLLM 部署:只要在受影響的環境中啟動 Python 就會啟動惡意程式碼,即使 LiteLLM 從未被 import。」Microsoft Security Research 團隊說。
「因為啟動檔案位於 LiteLLM 應用程式目錄之外,只移除應用程式檔案可能會把惡意啟動元件留在系統上。」
這次外洩了什麼
從攻擊者的行動與受害範圍推測:
| 服務 | 憑證類型 | 用途 | 存在形式 | 放在哪 | 權限範圍 | 狀態 |
|---|---|---|---|---|---|---|
| LiteLLM GitHub 組織 | 組織擁有者 GitHub CLI OAuth token | 提交 pull request 與完整組織存取 | OAuth token(未限縮權限範圍) | 從 Agent Platform 透過未撤銷的主金鑰竊取 | 所有儲存庫的擁有者級別存取,包括修改發布流程的權限 | 已被竊取並用於劫持發布流程 |
| LiteLLM 內部系統 | 工程師 GitHub CLI OAuth token、AI 服務 API 金鑰、資料庫憑證 | 觸發與批准發布、存取內部服務 | GitHub token、API 金鑰、資料庫連線字串、session 狀態 | 透過惡意 workflow 從內部儲存庫竊取 | Linear、Anthropic、OpenAI、AWS Bedrock、GitGuardian、PostgreSQL、Redis 等 | 已被竊取,LiteLLM 正在撤銷所有相關 token |
| 安裝 LiteLLM 1.107.0 的開發者與系統 | 開發者工具憑證、AI 應用 token、雲端金鑰、瀏覽器資料 | 開發與部署應用程式、存取雲端服務 | SSH 金鑰、Git token、環境變數、套件管理器 token、錢包 | 從受影響的 Python 環境竊取並回傳到 litellm[.]dev/healthcheck | 任何安裝 LiteLLM 1.107.0 並啟動 Python 的環境 | 已被竊取,受害範圍不明 |
你可以學到什麼
站在攻擊者的角度:一個在公開 commit 歷史中只存在幾分鐘的主金鑰,只要未撤銷,就是一把能在 155 天後打開所有門的鑰匙。取得 GitHub token 後,不需要直接修改發布流程的限制,利用暫時的寬鬆設定就能劫持發布,看起來像是正常的發布流程,只是來源儲存庫的大小寫不同。
- 01覆蓋 commit 不等於撤銷 secret:LiteLLM 用 force-push 覆蓋包含主金鑰的 commit,但主金鑰未撤銷,攻擊者在 155 天後仍能使用。
- 02GitHub commit 歷史在被覆蓋後仍可能被取得:即使 commit 不在任何分支上,Git 物件在垃圾回收前仍存在於儲存庫中,攻擊者可能已經複製。
- 03未限縮權限範圍的 token 是力量倍增器:LiteLLM 的 GitHub CLI OAuth token 與組織擁有者帳號關聯且未限縮權限,讓攻擊者取得所有儲存庫的完整存取權。
- 04短暫分支能規避偵測:攻擊者建立名為 ci-tmp- 的分支,推送惡意 workflow 觸發執行後數分鐘內刪除,在儲存庫歷史中幾乎不留痕跡。
- 05惡意 workflow 能從 secret 環境變數竊取憑證:GitHub Actions 會將 secret 注入 workflow 的環境變數,惡意 workflow 能將這些 secret 外洩到攻擊者控制的端點。
- 06竊取 GitGuardian API 金鑰讓攻擊者能掩蓋 secret 洩漏警報:GitGuardian 用於掃描 secret 洩漏,取得其 API 金鑰讓攻擊者能看到(甚至控制)會揭露這次攻擊的警報。
- 07偽裝儲存庫只需改大小寫:攻擊者建立 Berri-AI/litellm 而非正確的 BerriAI/litellm,修改發布流程指向這個偽裝儲存庫,看起來像是正常發布。
- 08刪除執行記錄能延遲偵測:攻擊者在發布後刪除生產與測試環境的執行記錄,延遲了內部偵測的時間。
- 09Python 啟動檔案能在不 import 套件的情況下執行:惡意套件在 site-packages 建立 _startup_.pth 與 sitecustomize.py,讓 Python 在啟動時自動執行,即使應用程式沒有 import LiteLLM。
- 10移除套件不等於移除持久化:惡意啟動檔案位於 LiteLLM 應用程式目錄之外,只移除套件檔案不會移除這些持久化元件。
- 01主金鑰(Master Key)LiteLLM Agent Platform 的主金鑰,洩漏後未撤銷,讓攻擊者在 155 天後取得完整存取權。
- 02GitHub CLI OAuth token與組織擁有者帳號關聯且未限縮權限的 token,讓攻擊者取得所有儲存庫的完整存取權。
- 03短暫分支(Ephemeral Branch)攻擊者建立 ci-tmp- 開頭的分支,推送惡意 workflow 觸發執行後數分鐘內刪除,規避偵測。
- 04偽裝儲存庫攻擊者建立 Berri-AI/litellm(大小寫錯誤)而非正確的 BerriAI/litellm,用於劫持發布流程。
- 05webhook[.]site攻擊者用於接收從惡意 workflow 外洩的憑證的公開 webhook 服務。
- 06litellm[.]dev攻擊者註冊的網域(2026-10-13),用於接收從受害者環境竊取的憑證。
- 07Python 啟動檔案_startup_.pth 與 sitecustomize.py 讓 Python 在啟動時自動執行惡意程式碼,即使應用程式沒有 import 套件。
- 08GitGuardian API 金鑰攻擊者竊取 secret 掃描平台的 API 金鑰,能看到會揭露這次攻擊的警報。
- 09Playwright 儲存狀態序列化的瀏覽器 session 狀態,攻擊者取得後能不需密碼與 MFA 存取相關帳號(例如 Linear)。
- 10分支保護覆蓋攻擊者用擁有者級別的 token 覆蓋分支保護,才能修改發布流程指向偽裝儲存庫。
下面的步驟全部唯讀,做完你會知道你的 Python 環境是否安裝惡意版本、系統上是否有持久化元件、是否有憑證被外洩。
全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。
- 檢查你的 Python 環境是否安裝 LiteLLM 1.107.0
pip show litellm | grep Version 或 pip list | grep litellm看到什麼代表什麼:如果版本是 1.107.0,立即移除並升級到 1.107.1 或更新版本。 - 搜尋 Python site-packages 目錄中是否有惡意啟動檔案
find $(python -c 'import site; print(site.getsitepackages()[0])') -name '_startup_.pth' -o -name 'sitecustomize.py' 2>/dev/null看到什麼代表什麼:如果找到 _startup_.pth 或 sitecustomize.py(且你沒有自己建立這些檔案),檢視內容並刪除。 - 檢查是否有連線到 litellm[.]dev/healthcheck
grep -r 'litellm.dev' ~/.bash_history ~/.zsh_history ~/.python_history 2>/dev/null 或檢查防火牆/網路監控日誌看到什麼代表什麼:如果有連線記錄,表示惡意程式已執行,需要立即撤銷所有憑證。 - 檢視 Python 歷史記錄中是否有安裝 LiteLLM 1.107.0 的痕跡
grep -i 'pip install.*litellm' ~/.bash_history ~/.zsh_history ~/.python_history 2>/dev/null看到什麼代表什麼:如果有在 2026-10-21 到 2026-10-22 之間安裝 LiteLLM 的記錄,需要檢查是否安裝到惡意版本。 - 搜尋系統上是否有攻擊者可能竊取的憑證檔案
ls -la ~/.ssh/ ls -la ~/.gitconfig ls -la ~/.npmrc ls -la ~/.pypirc看到什麼代表什麼:如果安裝了惡意版本,這些檔案中的憑證已被竊取,需要立即撤銷與輪換。 - 檢查 Docker 映像檔是否使用 LiteLLM 1.107.0
docker images | grep litellm docker inspect <image-id> | grep -i version看到什麼代表什麼:如果 Docker 映像檔包含 LiteLLM 1.107.0(標籤 v1.107.0、latest、main-latest、main-stable 在 2026-10-21 的版本),需要重新建置。
如果你發現任何惡意版本或持久化元件的痕跡,立即撤銷並輪換以下憑證:
- Git 與 GitLab token
- SSH 金鑰
- npm、PyPI 與其他套件管理器的 token
- 環境變數中的 API 金鑰(Anthropic、OpenAI、AWS 等)
- 密碼管理器與加密貨幣錢包(如果存放在系統上)
這篇提到的項目要花多少錢
移除惡意套件與輪換憑證的成本主要是人力時間。
| 項目 | 用量 | 單價 | 期間 | US$ | NT$ | 舉證 |
|---|---|---|---|---|---|---|
| 檢查 Python 環境與移除惡意版本 估:檢查所有 Python 環境、移除惡意版本並升級到乾淨版本 | 約 0.5 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 429.69 | 13,750 | 本站假設值 |
| 搜尋與移除持久化元件 估:搜尋 _startup_.pth 與 sitecustomize.py 並驗證系統乾淨 | 約 0.5 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 429.69 | 13,750 | 本站假設值 |
| 撤銷與輪換所有可能暴露的憑證 估:包含 Git、SSH、npm、PyPI、環境變數中的 API 金鑰、密碼管理器、錢包等 | 約 2 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 1718.75 | 55,000 | 本站假設值 |
| 調查是否有憑證被使用 估:檢視各服務的存取日誌,確認被竊憑證是否被攻擊者使用 | 約 1 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 859.38 | 27,500 | 本站假設值 |
| 重新建置受影響的 Docker 映像檔與部署 估:若有使用包含 LiteLLM 1.107.0 的 Docker 映像檔 | 約 1 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 859.38 | 27,500 | 本站假設值 |
| LiteLLM 的回應成本(撤銷所有內部 token 與重建信任) LiteLLM 正在撤銷所有內部系統與供應商平台的 token,成本不明 | — | — | — | — | — | — |
| 合計(僅可證明列) | 0.00 | 0 | ||||
對使用者來說,回應成本約 5 人日;對 LiteLLM 來說,除了技術回應還有信譽損失與客戶流失的成本。
來源:本文整理自 The Hacker News 於 2026 年 10 月 24 日發布的報導,依據 LiteLLM 官方事件報告與 Socket 研究。原文連結
來源
每篇新文章一封:三點摘要、關鍵字定義、今天能做的一件事。
延伸閱讀
替你保管所有 AI 金鑰的那一層,被換成了竊密程式
2026 年 10 月 21 日,開源 LLM 閘道 LiteLLM 的 1.107.0 版在 PyPI 與 Docker 上架約兩小時,裡面多了三個檔案:每次 Python 啟動就跑的竊密程式,和一個每小時回頭拿指令的載入器。官方說入口是一套對外開放的內部 LiteLLM,攻擊者從它的日誌裡撿到工程師的 GitHub CLI 權杖。這篇拆開能證明的、只能推的、還沒人知道的,以及你今天該換哪幾把鑰匙。
Polymarket 遭劫持的 DebugBear 腳本攻擊:透過第三方 RUM 工具竊取 270 萬美元
2026 年 10 月 29 日,預測市場平台 Polymarket 載入的第三方效能監控腳本 DebugBear 遭 DNS 劫持,攻擊者將惡意程式碼注入已登入交易者的瀏覽器,在一小時內竊取約 270 萬美元加密貨幣。攻擊者沒有竊取私鑰或種子詞,而是重複使用已登入交易者在瀏覽器中的 API 金鑰與錢包簽署器,讓受害者自己的錢包簽署惡意交易。Polymarket 已退款給 726 個受影響錢包。
Cursor 市集的官方 Claude Code 擴充套件被植入 SSH 後門:最多 5000 名使用者受影響
Cursor 市集上的 Claude Code 擴充套件(由 Anthropic 官方發布)在 2026 年 10 月 29 日遭到入侵,攻擊者以官方身分發布 2.1.313 惡意版本,試圖在受影響系統上安裝持久的 SSH 後門。惡意擴充套件會新增攻擊者控制的 SSH 金鑰、建立反向隧道至 134.209.82.225、安裝持久化機制,並回傳主機偵察資料。Cursor 已移除惡意版本並暫時關閉市集,Anthropic 發布 2.1.314 版本。