觀點 · 資訊分享

LiteLLM 發布管線被入侵:v1.107.0 帶著偷憑證程式上了 PyPI 與 Docker,約 2 小時後下架

常用的 AI 閘道套件 LiteLLM 在 10 月 21 日被攻擊者透過發布流程推出惡意的 v1.107.0。這個版本會竊取憑證,在 PyPI 約 2 小時、Docker 約 2.5 小時後被撤下,沒鎖版本的人要檢查並換金鑰。

發布
2026-10-22
篇幅
約 5 分鐘 · 2,305 字
結構
8 節 + 4 題常見問題
標籤
#LiteLLM#供應鏈攻擊#PyPI#Docker#AI 閘道
LiteLLM 發布管線被入侵:v1.107.0 帶著偷憑證程式上了 PyPI 與 Docker,約 2 小時後下架

一句話看懂:AI 閘道套件 LiteLLM 的 v1.107.0 在 10 月 21 日被塞進偷憑證的程式,約 2 小時後下架;沒鎖版本的人要檢查、清理並換掉金鑰。

LiteLLM 新版本被植入惡意程式資訊圖卡:AI 閘道套件 LiteLLM 的 v1.107.0 會偷憑證,沒鎖版本的人要檢查並換金鑰

先用白話講:供應鏈攻擊是什麼?

想像你每天向同一家便當店訂餐。某天有人闖進便當店的「出貨流程」,在幾個小時內送出去的便當裡下了藥;店裡的食譜(原始程式碼)本身卻沒被改過。你沒做錯任何事,只是照常訂餐。

這就是供應鏈攻擊:不攻擊你,而是攻擊你信任的軟體供應來源。LiteLLM 是很多團隊使用的 Python 套件與 AI 閘道,用同一種寫法呼叫上百種大型語言模型,因此常常集中放著各家 AI 服務的金鑰。

發生什麼事

LiteLLM 官方在 10 月 21 日公布:他們的發布流程被入侵,攻擊者把惡意的 v1.107.0 推到 PyPI(Python 套件庫)與 Docker 映像檔。

管道 惡意版本可取得的時間(UTC) 台灣時間(自行換算)
PyPI 11:39 到 13:23 約 19:39 到 21:23
Docker Hub 11:46 到 14:20 約 19:46 到 22:20
GHCR 11:46 起,13:51 前已無法取得 約 19:46 起
  • PyPI 上受影響的是 v1.107.0 的 7 個安裝檔(wheel)
  • Docker 的 v1.107.0、latest、main-latest、main-stable 四個標籤都指向過惡意映像檔
  • GitHub 上官方的 v1.107.0 原始碼標籤沒有惡意檔案;惡意版本是從攻擊者控制的仿冒倉庫(名稱只差一個連字號)建出來的
  • 官方說 1.107.0 之前的版本都安全;使用官方私有套件庫的企業版客戶也不受影響

它會偷什麼?

這份分析最早由資安公司 Upwind 的研究團隊貼在 LiteLLM 的 GitHub Issue 裡,官方事件報告也採用其中的處理建議。報告說明他們只做了靜態分析、沒有實際執行惡意程式:

  • 惡意檔案 cook.pth、cook.py、sitecustomize.py 會被放進 Python 的套件目錄;.pth 檔的特性是 Python 每次啟動都會自動載入
  • 蒐集的內容包含 SSH 金鑰、瀏覽器存的密碼、AWS 與其他雲端憑證、.env 檔、AI 工具的設定、所有可讀取行程的環境變數
  • 如果設了 DATABASE_URL,還會去撈 LiteLLM 資料庫裡存的各家 AI 供應商金鑰
  • 資料加密後送到仿冒的網域 litellm.dev,不是專案自己的 litellm.ai

怎麼檢查、怎麼處理

檢查:用 pip show litellm 看版本;檢查容器是否跑過受影響的映像檔;搜尋檔案系統有沒有 litellm-1.107.0.dist-info、cook.pth、sitecustomize.py。找到就確定中標,找不到不代表安全。

處理(官方建議):

  1. 不要先跑 pip install:受影響環境只要啟動 Python,惡意檔案就會再執行一次,包含執行 pip 本身
  2. 在命令列刪掉惡意檔案,結束背景的 Python 程式,再重新安裝並鎖定 litellm==1.106.2;更好的做法是整個環境與映像檔重建
  3. 只要 1.107.0 曾裝在可以連外網的主機,就假設資料已外洩,並更換主機碰得到的所有金鑰:IAM 角色、LiteLLM 資料庫裡的各家 AI 金鑰、主金鑰與虛擬金鑰、DATABASE_URL 的密碼,以及環境變數裡的任何機密
  4. 到 CloudTrail 查看有沒有可疑的 GetCallerIdentity 呼叫

他們是怎麼被攻破的?

官方 10 月 21 日的初步說法是:攻擊者取得了三位工程師的 GitHub CLI 憑證,其中一位屬於組織擁有者,因此能關掉分支保護並強制推送,最後讓發布流程指向仿冒倉庫。官方在文中提到,三月出事後他們已經強化過 CI 流程,這次是攻擊者繞過了好幾道獨立的防線。

要注意,官方特別註明這篇文章寫於調查期間,部分推測後來被發現不準確或不完整,並另外發了定稿紀錄。所以這一段只當成當時的初步說法,細節以官方後續更新為準。

我的看法

LiteLLM 這類 AI 閘道很容易變成「所有金鑰集中保管的地方」,一旦中標,損失的就不只一把金鑰。我會從這次事件記下三件事:

  • 版本一定要鎖:requirements.txt 寫死版本,Docker 用指定版本或摘要,正式環境不要用 latest
  • 更新晚一步:新版本出來不必當天就追,給社群幾天檢查的時間,這次惡意版本只活了約 2 小時,晚一點更新的人就躲過了
  • 金鑰分開放、設上限:各環境用不同金鑰,並在供應商那邊設好用量上限,外洩時損失才有限

自架 AI 閘道或常用 pip 更新的人,這幾天最好花十分鐘看一下自己機器上裝的版本。

名詞小辭典

  • 供應鏈攻擊:攻擊軟體的提供流程(套件庫、建置、更新管道),讓使用者自己把惡意程式裝進去。
  • PyPI:Python 的官方套件庫,pip install 預設從這裡下載。
  • 鎖定版本(pin):明確指定要用哪一版,而不是「永遠抓最新」,避免被悄悄換成別的內容。
  • .pth 檔:Python 啟動時會自動讀取的小檔案,裡面的程式會被執行,這次被拿來當作自動啟動的入口。

資料來源

常見問題

什麼是供應鏈攻擊?
攻擊者不直接攻擊你,而是攻擊你信任的軟體供應來源,例如套件的發布流程。你照常安裝更新,就把惡意程式一起裝進來了。這次官方說,GitHub 上的原始碼標籤本身是乾淨的,惡意內容來自被動過手腳的建置流程。
我怎麼知道自己有沒有中標?
官方建議用 pip show litellm 看版本是不是 1.107.0,或確認容器是否跑過受影響的映像檔。也可以搜尋檔案系統裡有沒有 litellm-1.107.0.dist-info、cook.pth、sitecustomize.py。找到代表中標;找不到不代表安全。
確定中標後第一步該做什麼?
不要先執行 pip install,因為受影響環境裡只要啟動 Python 就會再次執行惡意檔案。要先在命令列刪掉惡意檔案、結束背景程式,再重建環境並鎖定 1.106.2,最後更換所有可能被讀到的金鑰。
沒有用過 1.107.0,需要做什麼嗎?
官方說 1.107.0 之前的版本都安全。建議趁這個機會把版本鎖死,Docker 映像檔也改成指定版本或摘要,不要用 latest 這類會漂移的標籤。
LINE