LiteLLM 主密鑰外洩 136 天未撤銷,攻擊者發布惡意 1.107.0 版本
Leaked LiteLLM Master Key Sat Unrevoked for 136 Days, Then Shipped a Malicious 1.107.0 Release
LiteLLM Agent Platform 的主密鑰於 2026 年 5 月 27 日被提交到公開 GitHub 儲存庫,未撤銷 136 天後遭利用,令攻擊者取得 GitHub 組織擁有者權限,並於 10 月 21 日發布惡意 LiteLLM 1.107.0。
事件按密鑰外洩、權限擴張、憑證竊取到發佈流程遭接管逐步還原,並列出撤銷憑證及處理受影響映像的時間。
重點摘要
- 事件:2026 年 5 月,一個未被撤銷的 LiteLLM Agent Platform 主密鑰在 GitHub 洩漏,讓攻擊者竊取了組織擁有者的 GitHub 權杖,並於 2026 年 10 月 21 日發布了惡意版本 LiteLLM 1.107.0。
- 影響:攻擊者取得 BerriAI 每個程式碼庫的擁有者級別存取權,竊取維護者權杖,以及 Anthropic、OpenAI、AWS Bedrock、Together AI 等服務的 API 金鑰,並向 PyPI、Docker Hub 和 GHCR 推送遭植入惡意內容的版本。
- 修復:PyPI 已隔離 1.107.0;Docker Hub 上的 v1.107.0、latest、main-latest 和 main-stable 標籤已移除或重新指向經驗證的乾淨映像檔;LiteLLM 正在撤銷其內部系統及供應商平台上的所有權杖。
- 受影響對象:任何在 2026 年 10 月 21 日安裝 LiteLLM 1.107.0 或拉取受影響 LiteLLM 容器標籤的機構,以及任何推理金鑰經由 LiteLLM 閘道傳遞的人士。
一個已被標記為需撤銷、卻從未真正撤銷的密鑰,讓攻擊者取得 LiteLLM GitHub 組織的擁有者級別控制權,並得以發布惡意版本的 LiteLLM。LiteLLM 是其中一個最廣泛使用的開源 LLM 閘道。LiteLLM 於 2026 年 10 月 24 日披露,Agent Platform 的主密鑰在 2026 年 5 月 27 日被提交至公開程式碼庫,攻擊者於 10 月 10 日利用該密鑰引發一連串事件,最終於 10 月 21 日將 LiteLLM 1.107.0 發布至 PyPI、Docker Hub 和 GHCR。
該版本在被隔離前於 PyPI 上架約一小時 45 分鐘;容器標籤則維持遭植入惡意內容的狀態約兩個半小時。對於一個位於應用程式與它們呼叫的所有上游模型供應商之間的套件而言,這段時間不容忽視。
已發現卻未妥善處理的洩漏
2026 年 5 月 27 日,一個提交至公開 LiteLLM-Labs/lite-harness 程式碼庫的設定檔,包含 LiteLLM Agent Platform 部署的主密鑰。LiteLLM 使用這個開源工具來協調 Agent。團隊發現錯誤後,強制推送以覆蓋該提交,並將外洩的密鑰標記為需要撤銷,但主密鑰實際上從未被撤銷。
強制推送只會將提交從分支歷史中移除,無法從已經取得該提交的所有複本、鏡像或網絡爬取工具中刪除。該密鑰在攻擊者使用前一直有效,長達 136 天。
從 Agent Platform 到組織擁有者
2026 年 10 月 10 日,一名攻擊者從 69.48.229[.]143 登入 Agent Platform,使用外洩的密鑰取得該服務使用的 GitHub CLI OAuth 權杖。該服務利用此權杖,讓自行託管的雲端 Agent 可以建立拉取請求。該權杖沒有設定較窄的權限範圍,並屬於 GitHub 組織擁有者的帳戶,因此讓攻擊者取得組織內所有程式碼庫的擁有者級別存取權。
⚠️ 核心問題 — 一個用途僅限提交拉取請求的自動化憑證,竟然擁有完整的組織擁有者權限。Agent Platform 一旦失守,攻擊者與發布流程之間便再無任何權限界線。
幽靈分支與憑證竊取
2026 年 10 月 10 日世界協調時間晚上 10:11 至 10:12 之間,攻擊者向內部 BerriAI/litellm 和 BerriAI/litellm-auto 程式碼庫的臨時分支推送提交。Socket 找回了兩個惡意提交,一個於 10 月 10 日世界協調時間晚上 10:11:45 提交,另一個則於 10 月 12 日提交。兩者都採用相同手法:
- 從近期的合法提交建立名為 ci-tmp- 的分支(已觀察到的名稱:ci-tmp-a351cc 和 ci-tmp-4d8517),令分支基底看起來乾淨。
- 提交一項變更,新增 .github/workflows/cache.yml,提交標題為 "ci: bump cache config"。
- 讓 on: [push] 觸發條件立即執行工作流程。
- 刪除分支,之後工作流程會在幾分鐘內執行。
Socket 指出,這兩項提交都沒有落在仍然存在的分支上,因此一般的儲存庫歷史幾乎看不到任何內容。相關證據記錄在活動記錄中。
10月10日的工作流程收集了兩名具維護者權限的工程師的 GitHub CLI OAuth 權杖,以及 Linear 工作區、LiteLLM 部署、Together AI 的金鑰,還有 GitHub App 識別碼及簽署金鑰。10月12日的執行則擴大收集範圍,取得 Anthropic、OpenAI、AWS Bedrock、Tavily 和 GitGuardian 秘密掃描租戶的 API 金鑰,以及 Playwright 儲存狀態、PostgreSQL 連線字串及憑證,還有 Redis 端點、埠號和密碼。資料被傳送至兩個 webhook[.]site 端點。
10月21日劫持發佈管道
LiteLLM 的正常發佈流程要求由獲授權的工程師啟動建置,並由一個與辦公室內實體裝置綁定的特殊帳戶核准。當週,為配合更頻繁發佈及回移錯誤修正的計劃,相關控制已放寬至任何兩名工程師均可觸發及核准發佈。攻擊者剛好持有兩個維護者權杖。
- UTC 上午10:08至11:08:分支保護遭繞過,發佈管道來源被重新指向仿冒儲存庫 Berri-AI/litellm,而非 BerriAI/litellm。
- UTC 上午11:39至11:40:LiteLLM 1.107.0 發佈至 PyPI,使用一個被盜權杖觸發,並由另一個權杖核准。
- UTC 上午11:46:Docker Hub 和 GHCR 映像發佈。
- UTC 上午11:53至11:54:正式環境及預備環境的執行記錄遭刪除。
- UTC 下午12:06:Upwind 研究員 Lidor Machluf 通報攻擊事件。
- UTC 下午1:23:PyPI 將 1.107.0 列入隔離。
- UTC 下午2:20:Docker Hub 的 v1.107.0、latest、main-latest 和 main-stable 標籤遭移除,或重新指向經驗證的乾淨映像。
LiteLLM 指出,攻擊者已持有擁有者權杖,本可直接停用雙人規則。團隊懷疑攻擊者為避免被發現而沒有這樣做。按照設計使用放寬後的控制機制,產生的發佈在程序上看似正常。
入侵指標
- 來源 IP:69.48.229[.]143
- 資料外洩:webhook[.]site/65a42464-3cfa-4b02-a18c-17a6d7b86f37
- 資料外洩:webhook[.]site/4da03473-a3e7-4dc2-a087-9c564b4208e1
- 仿冒儲存庫:Berri-AI/litellm
- 分支名稱:ci-tmp-a351cc、ci-tmp-4d8517
- 工作流程檔案:.github/workflows/cache.yml,提交標題 "ci: bump cache config"
- 惡意套件:PyPI、Docker Hub 和 GHCR 上的 LiteLLM 1.107.0
供應商回應
PyPI 將該版本列入隔離,LiteLLM 則將受影響的 Docker Hub 標籤重新指向經驗證的乾淨映像。LiteLLM 表示,正撤銷與所有內部系統及供應商平台相關的每個權杖。披露內容沒有詳述 1.107.0 內程式碼的行為,因此安裝該版本的環境所受的全部下游影響目前尚未公開。
RedEye 評估 — 三項獨立控制措施依次失效:已知洩漏事件發生後撤銷機密、對自動化權杖實施最小權限原則,以及數天前已放寬的發佈審批。任何一項措施單獨而言,都很可能足以阻止這一連串事件。AI 閘道會集中管理整個機構的供應商金鑰,因此所持有的機密及用來建置這些閘道的管道都會成為高價值目標。RedEye Security 可評估你面對這次事件的風險,並檢視 CI/CD 和 AI 工具憑證的權限範圍。
原文刊載於 RedEye Threat Intelligence。
來源:DEV Community · dev.to