新聞稿拆解

主金鑰洩漏 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 應用、雲端環境與瀏覽器的憑證,並每小時從攻擊者控制的伺服器取得並執行任意程式碼。

30 秒看懂
  • 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 讓攻擊者擁有組織內所有儲存庫的擁有者級別存取權,並能執行進一步的憑證竊取。

攻擊時間軸

  1. 2026-05-27
    LiteLLM 將 Agent Platform 主金鑰意外提交到公開儲存庫,隨即覆蓋但未撤銷金鑰
    LiteLLM 官方報告
  2. 2026-10-10 22:11–22:12 UTC
    攻擊者使用未撤銷的主金鑰取得 GitHub CLI OAuth token,並在 BerriAI/litellm 與 BerriAI/litellm-auto 建立短暫分支推送惡意 workflow
    LiteLLM 官方報告與 Socket 研究
  3. 2026-10-10 22:12 UTC
    惡意 workflow 執行後數分鐘內被刪除
    LiteLLM 官方報告
  4. 2026-10-12
    攻擊者推送第二個惡意 workflow 到短暫分支,竊取更多內部系統憑證
    Socket 研究報告
  5. 2026-10-21 10:08–11:08 UTC
    攻擊者覆蓋分支保護並修改發布流程,將來源設定為偽裝儲存庫 Berri-AI/litellm
    LiteLLM 官方報告
  6. 2026-10-21 11:39–11:40 UTC
    LiteLLM 版本 1.107.0 被發布到 PyPI
    LiteLLM 官方報告
  7. 2026-10-21 11:46 UTC
    Docker Hub 與 GHCR 映像檔被發布
    LiteLLM 官方報告
  8. 2026-10-21 11:53–11:54 UTC
    生產與測試環境的執行記錄被刪除
    LiteLLM 官方報告
  9. 2026-10-21 12:06 UTC
    Upwind 研究員 Lidor Machluf 回報供應鏈攻擊
    LiteLLM 官方報告
  10. 2026-10-21 13:23 UTC
    PyPI 隔離 LiteLLM 版本 1.107.0
    LiteLLM 官方報告
  11. 2026-10-21 14:20 UTC
    Docker 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 在攻擊當週暫時放寬了發布流程的限制,原本需要授權的工程師觸發並由辦公室實體設備鎖定的特殊帳號批准,改為允許任何兩名工程師觸發與批准發布。攻擊者利用這個時機:

  1. 覆蓋分支保護
  2. 修改發布流程,將來源設定為偽裝儲存庫 Berri-AI/litellm(而非正確的 BerriAI/litellm)
  3. 用一個 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 應用程式目錄之外,只移除應用程式檔案可能會把惡意啟動元件留在系統上。」

這次外洩了什麼

從攻擊者的行動與受害範圍推測:

leaked credentials這次外洩了什麼:服務、用途、存在形式
服務憑證類型用途存在形式放在哪權限範圍狀態
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 後,不需要直接修改發布流程的限制,利用暫時的寬鬆設定就能劫持發布,看起來像是正常的發布流程,只是來源儲存庫的大小寫不同。

lessons本案的 10 個教訓
  1. 01
    覆蓋 commit 不等於撤銷 secret:LiteLLM 用 force-push 覆蓋包含主金鑰的 commit,但主金鑰未撤銷,攻擊者在 155 天後仍能使用。
  2. 02
    GitHub commit 歷史在被覆蓋後仍可能被取得:即使 commit 不在任何分支上,Git 物件在垃圾回收前仍存在於儲存庫中,攻擊者可能已經複製。
  3. 03
    未限縮權限範圍的 token 是力量倍增器:LiteLLM 的 GitHub CLI OAuth token 與組織擁有者帳號關聯且未限縮權限,讓攻擊者取得所有儲存庫的完整存取權。
  4. 04
    短暫分支能規避偵測:攻擊者建立名為 ci-tmp- 的分支,推送惡意 workflow 觸發執行後數分鐘內刪除,在儲存庫歷史中幾乎不留痕跡。
  5. 05
    惡意 workflow 能從 secret 環境變數竊取憑證:GitHub Actions 會將 secret 注入 workflow 的環境變數,惡意 workflow 能將這些 secret 外洩到攻擊者控制的端點。
  6. 06
    竊取 GitGuardian API 金鑰讓攻擊者能掩蓋 secret 洩漏警報:GitGuardian 用於掃描 secret 洩漏,取得其 API 金鑰讓攻擊者能看到(甚至控制)會揭露這次攻擊的警報。
  7. 07
    偽裝儲存庫只需改大小寫:攻擊者建立 Berri-AI/litellm 而非正確的 BerriAI/litellm,修改發布流程指向這個偽裝儲存庫,看起來像是正常發布。
  8. 08
    刪除執行記錄能延遲偵測:攻擊者在發布後刪除生產與測試環境的執行記錄,延遲了內部偵測的時間。
  9. 09
    Python 啟動檔案能在不 import 套件的情況下執行:惡意套件在 site-packages 建立 _startup_.pth 與 sitecustomize.py,讓 Python 在啟動時自動執行,即使應用程式沒有 import LiteLLM。
  10. 10
    移除套件不等於移除持久化:惡意啟動檔案位於 LiteLLM 應用程式目錄之外,只移除套件檔案不會移除這些持久化元件。
keywords重點學習:最需要學習的 10 個關鍵字10 個
  1. 01
    主金鑰(Master Key)
    LiteLLM Agent Platform 的主金鑰,洩漏後未撤銷,讓攻擊者在 155 天後取得完整存取權。
  2. 02
    GitHub CLI OAuth token
    與組織擁有者帳號關聯且未限縮權限的 token,讓攻擊者取得所有儲存庫的完整存取權。
  3. 03
    短暫分支(Ephemeral Branch)
    攻擊者建立 ci-tmp- 開頭的分支,推送惡意 workflow 觸發執行後數分鐘內刪除,規避偵測。
  4. 04
    偽裝儲存庫
    攻擊者建立 Berri-AI/litellm(大小寫錯誤)而非正確的 BerriAI/litellm,用於劫持發布流程。
  5. 05
    webhook[.]site
    攻擊者用於接收從惡意 workflow 外洩的憑證的公開 webhook 服務。
  6. 06
    litellm[.]dev
    攻擊者註冊的網域(2026-10-13),用於接收從受害者環境竊取的憑證。
  7. 07
    Python 啟動檔案
    _startup_.pth 與 sitecustomize.py 讓 Python 在啟動時自動執行惡意程式碼,即使應用程式沒有 import 套件。
  8. 08
    GitGuardian API 金鑰
    攻擊者竊取 secret 掃描平台的 API 金鑰,能看到會揭露這次攻擊的警報。
  9. 09
    Playwright 儲存狀態
    序列化的瀏覽器 session 狀態,攻擊者取得後能不需密碼與 MFA 存取相關帳號(例如 Linear)。
  10. 10
    分支保護覆蓋
    攻擊者用擁有者級別的 token 覆蓋分支保護,才能修改發布流程指向偽裝儲存庫。

下面的步驟全部唯讀,做完你會知道你的 Python 環境是否安裝惡意版本、系統上是否有持久化元件、是否有憑證被外洩。

try today今天就可以來試試約 20 分鐘

全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。

  1. 檢查你的 Python 環境是否安裝 LiteLLM 1.107.0
    pip show litellm | grep Version
    或
    pip list | grep litellm
    看到什麼代表什麼:如果版本是 1.107.0,立即移除並升級到 1.107.1 或更新版本。
  2. 搜尋 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(且你沒有自己建立這些檔案),檢視內容並刪除。
  3. 檢查是否有連線到 litellm[.]dev/healthcheck
    grep -r 'litellm.dev' ~/.bash_history ~/.zsh_history ~/.python_history 2>/dev/null
    或檢查防火牆/網路監控日誌
    看到什麼代表什麼:如果有連線記錄,表示惡意程式已執行,需要立即撤銷所有憑證。
  4. 檢視 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 的記錄,需要檢查是否安裝到惡意版本。
  5. 搜尋系統上是否有攻擊者可能竊取的憑證檔案
    ls -la ~/.ssh/
    ls -la ~/.gitconfig
    ls -la ~/.npmrc
    ls -la ~/.pypirc
    看到什麼代表什麼:如果安裝了惡意版本,這些檔案中的憑證已被竊取,需要立即撤銷與輪換。
  6. 檢查 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 等)
  • 密碼管理器與加密貨幣錢包(如果存放在系統上)

這篇提到的項目要花多少錢

移除惡意套件與輪換憑證的成本主要是人力時間。

costLiteLLM 供應鏈攻擊回應成本
項目用量單價期間US$NT$舉證
檢查 Python 環境與移除惡意版本
估:檢查所有 Python 環境、移除惡意版本並升級到乾淨版本
約 0.5 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性429.6913,750本站假設值
搜尋與移除持久化元件
估:搜尋 _startup_.pth 與 sitecustomize.py 並驗證系統乾淨
約 0.5 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性429.6913,750本站假設值
撤銷與輪換所有可能暴露的憑證
估:包含 Git、SSH、npm、PyPI、環境變數中的 API 金鑰、密碼管理器、錢包等
約 2 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性1718.7555,000本站假設值
調查是否有憑證被使用
估:檢視各服務的存取日誌,確認被竊憑證是否被攻擊者使用
約 1 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性859.3827,500本站假設值
重新建置受影響的 Docker 映像檔與部署
估:若有使用包含 LiteLLM 1.107.0 的 Docker 映像檔
約 1 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性859.3827,500本站假設值
LiteLLM 的回應成本(撤銷所有內部 token 與重建信任)
LiteLLM 正在撤銷所有內部系統與供應商平台的 token,成本不明
——————
合計(僅可證明列)0.000
匯率假設 1 USD ≈ NT$32。單價為公開牌價或帳單實付,來源:本站人力工時假設。「舉證」欄標明每筆損失的證據來源與等級( 可證明 推論 缺口)。

對使用者來說,回應成本約 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 權杖。這篇拆開能證明的、只能推的、還沒人知道的,以及你今天該換哪幾把鑰匙。

  • 2026/10/22
  • 每日拆解
研究報告拆解

Polymarket 遭劫持的 DebugBear 腳本攻擊:透過第三方 RUM 工具竊取 270 萬美元

2026 年 10 月 29 日,預測市場平台 Polymarket 載入的第三方效能監控腳本 DebugBear 遭 DNS 劫持,攻擊者將惡意程式碼注入已登入交易者的瀏覽器,在一小時內竊取約 270 萬美元加密貨幣。攻擊者沒有竊取私鑰或種子詞,而是重複使用已登入交易者在瀏覽器中的 API 金鑰與錢包簽署器,讓受害者自己的錢包簽署惡意交易。Polymarket 已退款給 726 個受影響錢包。

  • 2026/11/02
  • 每日拆解
事件拆解

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 版本。

  • 2026/10/30
  • 每日拆解