跳到正文
DEV Community· lu1tr0n·· 2 小時前精選AI 評分82

LiteLLM 1.107.0 PyPI 套件遭植入憑證竊取程式及後門

LiteLLM 1.107.0 en PyPI instaló un robacredenciales y backdoor

AI 導讀

LiteLLM 1.107.0 於 2026 年 10 月 21 日上載至 PyPI 的套件遭植入憑證竊取程式及遠端執行後門。安裝後新增的三個檔案會在任何 Python 程序啟動時執行,無須匯入 LiteLLM;SafeDep 認為攻擊很可能來自 BerriAI 的私有建置流程。PyPI 已撤下該版本,1.106.2、1.107.0rc1 和 1.107.0rc2 則確認未受影響。

推薦理由

PyPI 發佈檔案與公開 GitHub 版本不一致,令 LiteLLM 1.107.0 個案凸顯只審查原始碼的不足,並將焦點帶到建置產物的來源驗證。

正文 · 繁體中文

LiteLLM 1.107.0 於 2026年10月21日上載至 PyPI,帶有一個從未獲任何維護者批准的憑證竊取程式,以及一個隱藏在三個新增檔案中的遠端執行後門。七個適用於 Linux、macOS 和 Windows 的安裝 wheel 套件,都會將這些檔案直接複製到 site-packages;兩者會隨機器上的任何 Python 程序啟動,包括從未匯入 litellm 的程序。

BerriAI 是這個專案背後的公司,其公開程式碼庫從未包含這段程式碼。根據 SafeDep 的調查,攻擊源自該公司的私有建置 pipeline,而非有人從另一部機器盜取並使用 PyPI token。

摘要

  • LiteLLM 1.107.0(PyPI,2026年10月21日)在全部 7 個套件中安裝了憑證竊取程式和後門。- 三個新增檔案位於 site-packages,會在任何 Python 程序中執行,無論該程序有否匯入 litellm。- GitHub 上的程式碼庫從未包含這段程式碼:PyPI 上的建置版本與任何 commit 都不相符。- SafeDep 以中至高度信心判斷,攻擊源自 BerriAI 的私有建置 pipeline。- PyPI 已撤下該版本;1.106.2、1.107.0rc1 和 1.107.0rc2 已確認安全。

LiteLLM 是甚麼

LiteLLM 是由 BerriAI 維護的開源 Python 程式庫,提供單一且兼容 OpenAI 的 API,可呼叫超過 100 個語言模型供應商。LiteLLM 1.107.0 於 2026 年 10 月 21 日發布,是在 PyPI 遭入侵的版本。

LiteLLM 程式庫充當代理伺服器:團隊只需將應用程式指向它,再修改一行設定,便可從 GPT 切換至 Claude 或開放模型,而無須改動業務程式碼。BerriAI 亦出售企業級方案,提供管理面板,並將供應商金鑰儲存在自有資料庫中;這類資料正是憑證竊取程式的目標。

發生了甚麼事

整個攻擊鏈始於安裝程式。執行 pip install litellm==1.107.0 時,pip 會在 site-packages 新增三個檔案:cook.pth、cook.py 和 sitecustomize.py。Python 每次啟動直譯器時,都會自動執行 .pth 檔案和 sitecustomize.py,因此任何指令碼一開始執行,兩者便會立即運作,無須有人匯入從 PyPI 安裝的受感染套件。

cook.pth 只有十二個位元組,內容只有一行:import cook。這行匯入指令會觸發 cook.py;這個 22.252 位元組的檔案就是憑證竊取程式。SafeDep 指出,它會收集 SSH 金鑰、雲端憑證、CI/CD 密鑰、AI 工具權杖、瀏覽器儲存的密碼,以及 LiteLLM 1.107.0 代理伺服器資料庫儲存的 LLM 供應商金鑰。它會將所有資料加密,再傳送至 www.litellm[.]dev;這個網域模仿真正的專案,但並不屬於該專案。
受感染版本的七個 wheel 套件涵蓋 Linux、macOS 和 Windows。
sitecustomize.py 有 25.509 個位元組,會執行兩項操作。首先,它內置一份憑證竊取程式副本,以防 cook.py 失效。其次,它會在背景啟動一個守護程序,每小時從 GitHub 託管的檔案讀取伺服器位址,再次竊取憑證,並下載及執行該伺服器傳送的內容。實際上,這是一個持續存在的遠端執行後門,而非一次性的資料竊取。

BerriAI 在 GitHub 上的公開儲存庫從未包含這三個檔案,也沒有產生它們的設定行。發現此事後,PyPI 隨即下架該套件。1.106.2、1.107.0rc1 和 1.107.0rc2 版本均未受影響,惡意版本鎖定為依賴項的配套套件也一樣:litellm-proxy-extras==0.4.110 和 litellm-enterprise==0.1.78。

背景及歷史

BerriAI 將 LiteLLM 打造成一個輕量層,讓用戶接入數十個模型 API。這個專案後來成為 AI 技術堆疊中的常見元件,適用於需要轉換供應商、又不想重寫整合程式碼的團隊。這個地位令它成為誘人的攻擊目標:只要入侵一個版本,就足以取得任何安裝該版本的團隊所使用的 LLM 供應商金鑰,而這類機密正是現今 AI 計費中涉及真金白銀的關鍵。

針對開放套件供應鏈的攻擊並非新鮮事:npm 和 PyPI 屢見拼字搶註、維護者帳戶遭竊,以及依賴項被植入木馬等案例。此案的不同之處,在於惡意程式碼並未出現在任何公開 commit 或任何人都能在 GitHub 上審核的原始碼中;它只存在於 PyPI 發佈的二進制套件中。審核儲存庫完全無濟於事。

LiteLLM 1.107.0 如何在建置流程中被植入後門

引發整宗攻擊的改動,只是 1.107.0 版本 sdist 的 pyproject.toml 中一行設定,位於 maturin 的建置部分;BerriAI 使用這個工具編譯 wheel 套件:

-version = "1.108.0"
-    "litellm-proxy-extras==0.4.111",
-    "litellm-enterprise==0.1.79",
+version = "1.107.0"
+    "litellm-proxy-extras==0.4.110", # mismos pines que 1.107.0rc2
+    "litellm-enterprise==0.1.78",
+data = "cook" # la linea inyectada

data = "cook" 會指示 maturin,在建置 wheel 套件時,將 cook/ 資料夾複製到 litellm-1.107.0.data/purelib/。pip 會將這些內容直接安裝到 site-packages,因此植入程式的三個檔案會在沒有任何用戶可見安裝步驟的情況下,直接出現在該處。sdist 並未包含 cook/ 資料夾,因此這一行是發佈原始碼中唯一可見的改動。

wheel 套件中的 RECORD 檔案會列出每個已安裝的檔案,其中確認有三個新增檔案:cook.pth(12 bytes)、cook.py(22.252 bytes)和 sitecustomize.py(25.509 bytes)。若要確認本機安裝是否遭 cook.py 植入程式感染,可以手動檢查本機 site-packages 中是否有這三個檔案名稱:只要它們存在,就足以確認系統已遭入侵,因為 litellm 的任何合法版本都不會包含它們。
版本/狀態/備註:1.106.2 未受影響;sdist 與標籤所指向的 commit 相符,Cargo.toml 中的 readme 變更除外。1.107.0rc1 未受影響;沒有植入程式的三個檔案。1.107.0rc2 未受影響;litellm-proxy-extras 和 litellm-enterprise 的版本鎖定與惡意建置版相同。1.107.0 已遭入侵;七個 wheel 套件均包含 cook.pth、cook.py 和 sitecustomize.py;已從 PyPI 下架。
GitHub 上的 v1.107.0 標籤指向一個 commit,其 pyproject.toml 中寫的是 version = "1.108.0",而非 1.107.0。SafeDep 以 blob 雜湊逐一比對 sdist 中的檔案與 git 樹狀結構,發現這些檔案與 main 上一個較後期的 commit 相符,另外還有五個經修改的檔案,以及一個不在任何公開 commit 中的 cook/ 資料夾。這五個檔案中有四個是 Cargo.toml,各自新增了一行 readme = "README.md";合法發佈版本 1.106.2 和 1.107.0rc2 也有相同改動。第五個則是被注入 data = "cook" 這一行的 pyproject.toml。

惡意 wheel 檔案看來並非手工製作:它們與 BerriAI pipeline 的正常輸出一致。WHEEL 檔案列明 maturin 1.9.4,與合法發佈版本使用的版本相同。ZIP 時間戳顯示這些是分開進行的原生建置(macOS 於 11:20 UTC、Linux 於 11:21 UTC、Windows 於 11:37 UTC);而 Windows wheel 中的 2.804 個 .py 檔案均使用 CRLF 行尾,包括植入程式的三個檔案,Linux wheel 則一個也沒有:這是啟用了行尾轉換的 Windows Git checkout 常見模式。
SafeDep 檢視了當日 09:30 至 12:30 UTC 期間的 539 次 GitHub Actions 執行紀錄。
SafeDep 檢視了這539 次 GitHub Actions 執行紀錄,沒有發現任何一次曾發佈該版本。11:50 UTC,即上載至 PyPI 約十分鐘後,機械人 litellm-dispatcher 發佈了 GitHub 版本 v1.107.0,延遲時間與 1.106.2 相同。PyPI 沒有 1.107.0、1.106.2 或 rc2 的來源證明聲明。

根據這些證據,SafeDep 有中高信心認為,BerriAI 的私人 pipeline 使用遭攻擊者修改的 Git 來源建置了這些 wheel。可能是維護者或機械人的憑證遭入侵、私人分支或鏡像遭修改,亦可能是 pipeline 用來建置的參照遭更改。單靠從攻擊者的機器上使用被盜的 PyPI 權杖,較難解釋這些證據,因為這不會產生在 maturin 版本、時間戳及行尾格式上都與實際 pipeline 一致的建置結果。

⚠️ 注意:如果你在 2026 年 10 月 21 日至套件下架期間安裝過 litellm 1.107.0,請輪換該機器上的 SSH 金鑰、CI/CD 權杖及 LLM 供應商金鑰,即使你的程式碼從未匯入 litellm。

flowchart TD
A["Atacante modifica el pyproject.toml en una fuente privada"] --> B["Pipeline de build de BerriAI genera las ruedas desde esa fuente"]
B --> C["PyPI recibe litellm 1.107.0 con tres archivos extra"]
C --> D["pip install copia cook.pth, cook.py y sitecustomize.py a site-packages"]
D --> E["Cualquier proceso de Python ejecuta el robacredenciales"]
D --> F["El demonio de sitecustomize.py descarga y corre codigo cada hora"]

影響與分析

即使沒有使用這個程式庫,也會造成損害。在安裝了 litellm 1.107.0 的機器上,任何啟動的 Python 程序都會觸發憑證竊取,包括與 AI 完全無關的指令碼。因此,任何安裝了該版本的 CI 環境、基礎容器或開發機器,即使只是透過間接依賴安裝,都會成為遭入侵的目標。

攻擊目標亦針對當前情況:植入程式直接鎖定 AI 秘密資料(LLM 供應商權杖、AI 工具憑證),以及傳統的 SSH 和 CI/CD 憑證。攻擊者取得這些金鑰後,可以令推理服務費用記在受害者名下、讀取經代理伺服器傳送且包含敏感資料的提示詞,或利用這些金鑰作為跳板進入其他系統。

對生態系統信任造成最大打擊的是,這段程式碼從未出現在可供審核的儲存庫中。如果 pipeline 建置所用的來源,與維護者以為正在建置的來源不同,即使固定 commit 雜湊也無濟於事。真正有效的緩解措施,是驗證已發佈的成品,而非 GitHub 上的原始碼。

還有一個問題尚未解答:SafeDep 無法存取 BerriAI 的內部紀錄,因此無法確認攻擊者是利用維護者憑證、遭入侵的機械人,還是私人鏡像進入系統。只有這些紀錄才能釐清事件經過的這部分,而 BerriAI 尚未公開這些紀錄。

下一步

BerriAI 尚未發布事後檢討報告,交代其 pipeline 遭人存取的根本原因。在報告發布之前,任何有關攻擊者如何入侵的結論,都只是 SafeDep 提出的有理據假設。目前,litellm 最近幾個版本在 PyPI 上缺少來源證明,是 pipeline 缺乏此類控制措施最明顯的跡象。

此事亦進一步加強 Python 社羣日益高漲的訴求:PyPI 應預設要求,或至少顯示採用規模達到這個級別的專案所提供的來源證明(build provenance),讓缺少證明的 wheel 能在安裝前,而非憑證遭竊後被察覺。

立即試試以下做法:檢查你的基礎設施中任何 site-packages 內是否存在 cook.pth 或 cook.py;如果曾安裝過 1.107.0,在繼續使用該機器前,輪換所有該機器曾接觸過的秘密資料。

📖 Telegram 摘要:查看摘要

常見問題

LiteLLM 1.107.0 安裝時具體會做甚麼?

它會在 site-packages 加入三個檔案:cook.pth 和 sitecustomize.py 會在 Python 每次啟動時執行,而 cook.py 則是兩者呼叫的憑證竊取程式。它會竊取 SSH 金鑰、雲端憑證、CI/CD 機密資料、AI tokens、瀏覽器密碼及 LLM 供應商金鑰,此外還會留下每小時重新執行一次的守護程序。

如果我從未在程式碼中匯入 litellm,仍有風險嗎?

有。該機器上啟動的任何 Python 程序都會執行 .pth 和 sitecustomize.py 檔案,不需要程式匯入該函式庫,也不需要知道它的存在。

LiteLLM 函式庫哪些版本是安全的?

1.106.2、1.107.0rc1 和 1.107.0rc2 已確認安全,litellm-proxy-extras==0.4.110 和 litellm-enterprise==0.1.78 亦然;這些是惡意版本所鎖定版本的配套套件。

如果 GitHub 上的儲存庫是乾淨的,BerriAI 的後門是如何進入套件的?

惡意 sdist 在 pyproject.toml 中多出一行(data = "cook"),這一行不存在於任何公開 commit;而 wheel 是在公司的私有 pipeline 中建置,來源是攻擊者修改過的 git 來源,而非 GitHub 上可見的程式碼。

cook.py 惡意程式竊取了哪些資料?

SSH 金鑰、雲端憑證、CI/CD 機密資料、AI 工具 tokens、瀏覽器中儲存的密碼,以及代理伺服器資料庫中儲存的 LLM 供應商金鑰。所有資料均經加密後傳送至 www.litellm[.]dev。

PyPI 或 GitHub 已解決問題嗎?

PyPI 已將 1.107.0 版本從索引中移除。GitHub 上的儲存庫從未包含惡意程式碼,因此無須清理;風險存在於任何在移除前已安裝該版本的機器上。

參考資料

📱 喜歡這些內容嗎? 加入我們的 Telegram 頻道 @programacion,我們每天都會發布科技、AI 及開發領域最重要的資訊。快速摘要,每天都有新內容。

來源:DEV Community · dev.to