跳到正文
Hacker News 熱門(buzzing.cc 中文翻譯)·· 2 小時前精選AI 評分87

LiteLLM 1.107.0 遭篡改,植入憑證竊取程式與遠端程式碼執行後門

PyPI 上遭篡改的 LiteLLM 1.107.0 会安装凭据窃取程序和后门

AI 導讀

SafeDep 指出,PyPI 上遭篡改的 LiteLLM 1.107.0 會安裝憑證竊取程式及遠端程式碼執行後門,相關檔案會在主機啟動任何 Python 程序時執行。

推薦理由

文章對照 wheel、上游 Git 標籤與發佈流程的差異,並列出入侵指標,呈現惡意套件如何在安裝後觸發憑證外傳與後續程式碼執行。

正文 · 繁體中文

• 2026 年 10 月 21 日 • 6 分鐘閲讀

PyPI 上的 LiteLLM 1.107.0 版本含有憑證竊取程式和遠端程式碼執行後門。全部七個 wheel 檔(Linux、macOS、Windows)都會在 site-packages 安裝這三個檔案。只要主機上有任何 Python 程序啟動,兩者便會執行,即使該程序從未匯入 litellm 也一樣。上游 GitHub 原始碼並不包含這些檔案。PyPI 其後已移除這個版本。

1.106.2、1.107.0rc1 和 1.107.0rc2 版本均未受影響。1.107.0 鎖定版本的配套套件 litellm-proxy-extras==0.4.110 和 litellm-enterprise==0.1.78 亦未受影響。

攻擊的運作方式

安裝 litellm==1.107.0 會在 site-packages 放入三個檔案。每次 Python 啟動時都會載入其中兩個檔案。

  1. cook.pth 會匯入憑證竊取程式 cook.py。它會收集 SSH 金鑰、雲端憑證、CI/CD 密碼、AI 工具權杖、瀏覽器密碼,以及 LiteLLM proxy 資料庫中的 LLM 供應商金鑰。它會加密這些資料,並傳送至 www.litellm[.]dev。
  2. sitecustomize.py 會啟動背景守護程序。守護程序每小時會從 GitHub 檔案讀取伺服器位址、再次執行竊取程式,並從該伺服器下載及執行程式碼。

植入程式如何進入發布版本

1.107.0 原始碼發佈檔(sdist)中的 pyproject.toml,在 maturin 建置區段多了一行:

pyproject.toml (litellm-1.107.0.tar.gz)

TOML 6 行

maturin data = "cook" 設定會將 cook/ 資料夾複製到 wheel 檔中的 litellm-1.107.0.data/purelib/。pip 會將該資料夾安裝至 site-packages。

sdist 沒有包含 cook/ 資料夾,因此這一行是唯一可見的變更。BerriAI/litellm 中沒有任何公開提交包含 data = "cook" 或 cook/ 資料夾。

wheel 檔 RECORD 列出新增的三個檔案:

litellm-1.107.0.dist-info/RECORD

文字 4 行

發布版本與其標籤不符

標籤 v1.107.0 指向提交 66c8f5b(06:59 UTC)。其中的 pyproject.toml 寫明 version = "1.108.0"。SafeDep 以 blob 雜湊值比對 sdist 中的每個檔案與 Git 樹。sdist 與較後的 main 提交 a8113b0(08:50 UTC)相符,另外還包含五個經修改的檔案和 cook/ 資料夾。

四個經修改的檔案是 Cargo.toml 檔案,各自多了一行 readme = "README.md"。正式的 1.106.2 和 rc2 發布版本也有相同修改。第五個檔案是 pyproject.toml,以下與 a8113b0 比較:

pyproject.toml (a8113b0 → litellm-1.107.0.tar.gz)

差異 11 行

這項修改將版本改回 1.107.0,並將配套套件鎖定至 rc2 的版本。因此,與 rc2 比較依賴項差異時,看不出任何異常。正式的 1.106.2 sdist 與其標籤所指向的提交 49943cd 相符,只有 Cargo.toml readme 行有所不同。

wheel 檔的建置方式

惡意 wheel 檔與 BerriAI 正常發布流程產生的輸出相符:

  • WHEEL 檔案將 maturin 的版本列為 1.9.4,與正式發布版本相同。植入檔案的 RECORD 項目正確,顯示它們在建置後未經修改。
  • ZIP 時間戳記顯示曾分別進行原生建置:macOS 於 11:20、Linux 於 11:21,而 Windows 於 11:37 UTC。
  • Windows wheel 檔中的 2,804 個 .py 檔案都使用 CRLF 行尾,包括三個植入檔案。Linux wheel 檔則沒有。在 Windows 上進行 git checkout 並轉換行尾,便會產生這種情況。

沒有任何公開的 GitHub Actions 執行記錄曾建置或發布這個版本。SafeDep 檢查了 09:30 至 12:30 UTC 之間的全部 539 次執行記錄。11:50 UTC,即 PyPI 上載後約 10 分鐘,litellm-dispatcher[bot] 發布了 GitHub 版本 v1.107.0。1.106.2 也出現相同延遲。PyPI 上的 1.107.0、1.106.2 或 rc2 均沒有來源證明聲明。

SafeDep 有中等至高度信心評估,認為 BerriAI 的私有發布管線是以遭攻擊者修改的 Git 原始碼建置這些 wheel 檔。攻擊者可能使用遭入侵的維護者或機械人憑證、私有分支或鏡像,亦可能利用管線建置所依據的參照。相比之下,攻擊者在自己的電腦上使用遭竊的 PyPI 權杖,與現有證據較不吻合。只有 BerriAI 的管線記錄才能確認原因。

Payload 1:cook.py 中的憑證竊取程式

Python 啟動時,會在 site-packages 中的 .pth 檔案內,執行每一行以 import 開頭的程式碼。cook.pth 包含 import cook,因此竊取程式會在主機上的每個 Python 程序中執行:包括應用程式、pip、IDE 語言伺服器和 CI 工作。

cook.py 以一層 exec(zlib.decompress(base64.b64decode('...'))) 封裝約 61 KB 的 Python 程式碼。解碼後的程式碼以以下設定開頭:

cook.py(已解碼)

PYTHON 10 行

收集的資料

模組目標
sysinfo、netinfo主機名稱、用戶名稱、作業系統、IP 位址、網絡設定
browser_pwChromium 已儲存的密碼,使用設定檔主金鑰解密(Windows 上為 DPAPI)。Firefox logins.json 和 key4.db
browser_hist瀏覽紀錄
ssh_keys~/.ssh/*
shell_histbash 和 zsh 紀錄、PowerShell PSReadLine、cmd 紀錄
cloud_creds~/.aws/credentials 和 config、Azure 設定檔和權杖、gcloud 憑證、~/.kube/config、~/.docker/config.json、gh hosts.yml、rclone.conf、~/.netrc
dev_secrets.pem、.key、.pfx、.p12、.pk8、.ppk 在 $HOME 下的檔案、Composer auth.json、FileZilla 已儲存的伺服器
container_credsKubernetes 服務帳戶權杖
cicd_secretsGitLab runner config.toml、Jenkins initialAdminPassword 和 master.key、.vault-token、Terraform credentials.tfrc.json、Packer 設定
ai_devtoolsClaude Code、Claude Desktop、Cursor、Windsurf、Copilot、VS Code mcp.json、Gemini CLI、Codex auth.json、Continue、Aider、Goose、opencode、Qwen、Crush、Kiro、Zed、Hugging Face 權杖
env_vars透過 /proc/<pid>/environ 取得其自身環境和其他程序的環境
db_litellm讀取 DATABASE_URL,並傾印 LiteLLM_CredentialsTable 和 LiteLLM_ProxyModelTable 資料表;這些資料表存有 LiteLLM proxy 的 LLM 供應商 API 金鑰
cloud_metadataAWS 執行個體中繼資料服務(IMDSv2,然後是 v1):執行個體身分和角色憑證
gpg_keys、tls_privkeyGPG 金鑰、TLS 私鑰

如何傳送資料

  1. 程式會使用隨機 AES-256-CBC 金鑰加密 JSON 結果,再以內嵌的公鑰透過 RSA-OAEP 加密該金鑰。
  2. 程式會將結果打包成 tar.gz(hdr.json、data.bin、key.bin),並在 POST 要求中傳送至 www.litellm[.]dev/healthcheck,同時附上標頭 X-Token: XWiA8gZNa7NcX2XRoAEb。
  3. 上載成功後,程式會寫入 /tmp/.pc_once_72129118c59f5636c0bb,令每台主機只收集一次。程式亦會設定 PRIVCOLLECT_ACTIVE=1,避免在同一程序樹中再次執行。

Payload 2:sitecustomize.py 中的後門

Python 啟動時會匯入 sitecustomize,因此這個檔案也會在每個 Python 程序中執行。

sitecustomize.py

PYTHON 5 行

  1. 程式會鎖定 /tmp/remote_code_loader.lock,確保每台主機只會有一個守護程序執行。
  2. 程式會呼叫 fork() 和 setsid(),將標準輸入和輸出重新導向至 /dev/null,並切換至 / 目錄,以脱離父程序。
  3. Every hour, it:
    1. 從攻擊者的 GitHub 儲存庫讀取 domain.txt,並取出第一行看起來像網域的內容,
    2. 執行內嵌的竊取程式副本;該副本沒有每台主機只執行一次的標記,
    3. 下載 http://<domain>/codepy,並使用 exec() 執行。

攻擊者可透過編輯 domain.txt,將守護程序指向新的伺服器。每台受感染的主機都會將伺服器以 codepy 傳回的任何內容執行。

13:40 UTC,GitHub 帳戶 letters9813 及其儲存庫回傳 404,時間約為發布後兩小時。後門現時找不到伺服器位址,因此不會執行任何操作。在刪除前已執行守護程序的主機,可能已接收並執行第二階段程式碼。SafeDep 未能還原伺服器位址。

時間線

所有時間均為 UTC,日期為 2026-10-21。

時間事件
06:59標籤 v1.107.0 的提交 66c8f5b 已建立
08:50main 上的提交 a8113b0,是發布原始碼所依據的版本
10:44正式版 1.106.2 已上載至 PyPI
11:20 至 11:37已建置惡意 wheel 套件 1.107.0
11:39 至 11:401.107.0 已上載至 PyPI(全部 8 個檔案)
11:50litellm-dispatcher[bot] 發佈 GitHub 版本 v1.107.0
13:40觀察到:1.107.0 已從 PyPI 下架,letters9813 帳戶已刪除

入侵指標

網絡

指標用途
www.litellm[.]dev、hxxp://www.litellm[.]dev/healthcheck接收被竊取的資料
HTTP 標頭 X-Token: XWiA8gZNa7NcX2XRoAEb每次上載時一併傳送
raw.githubusercontent[.]com/letters9813/pythonclient-test/main/domain.txt後門在此讀取其伺服器地址(帳戶已刪除)
hxxp://<domain>/codepy第二階段程式碼下載
Python 程序向 169.254.169.254 發出的請求竊取 AWS 執行個體憑證

主機

指標意義
cook.pth、cook.py、sitecustomize.py 位於 site-packages植入程式已安裝
/tmp/.pc_once_72129118c59f5636c0bb資料竊取程式已上載資料
/tmp/remote_code_loader.lock後門守護程序已執行
環境變數 PRIVCOLLECT_ACTIVE=1存在於受感染的程序中
脱離原程序的 Python 守護程序(父程序 PID 為 1、獨立工作階段、工作目錄為 /)後門迴圈

檔案雜湊值(SHA-256)

檔案SHA-256
litellm-1.107.0.tar.gz2befe2a79fb4fbbd9a543b5b40b530c8cffa8771bab22b8fb22b2e4ae3b1f819
litellm-1.107.0-cp310-abi3-manylinux_2_28_x86_64.whl462d0c9f67ca522d9e0e4acd245e90b36ce0d5353604a66bb7c43a1ec4a6fcf7
litellm-1.107.0-cp310-abi3-manylinux_2_28_aarch64.whl668169d35b87bf51324080390b1b1c5ab12bd335cfe5f1a99e3689abd5e02ae6
litellm-1.107.0-cp310-abi3-musllinux_1_2_x86_64.whl1bbce8caa94f01c0aaa0b7ddae51553a8a32e1ce53d96d44fe583272aff7ad00
litellm-1.107.0-cp310-abi3-musllinux_1_2_aarch64.whlc2e32d0ce2548aa662c18bf5001911a79fe5b30cf8357132275add02fdcde054
litellm-1.107.0-cp310-abi3-macosx_10_12_x86_64.whl7598727f209d717041db37f7dca271d3a7d328a279890e0e1d55375729aeb86d
litellm-1.107.0-cp310-abi3-macosx_11_0_arm64.whl0aaf7ba346d41ef2f40390436738b001180d5a1c03aa093f121078a9969d9a1a
litellm-1.107.0-cp310-abi3-win_amd64.whl12d4ccc5c6f8d35cf4f2cf233b7f3e418e863e657d81ff5f5fc9e210005b9484

由於 CRLF 換行符號,植入的檔案在 Windows 上的雜湊值不同:

檔案Linux 和 macOSWindows
cook.pth7f191632e7320705d154b85204f1ae546b543acbd7e8861229b76f5042b92bdb84dc8c82c0a4a4a62552ef826b49fcc86d1a5c4a5d0f2c06665723f93d129d7d
cook.py9dd0a3926f96a37eb86cf1ee2310d9be93139cc4ebef3ef9e2efe9531390be2503ac2a8b752605d1d7710979c17ff18b03dd978203ba23ba97fd8ce3d6f897ea
sitecustomize.py34bef04fe88ac9d0aae0475630b1738681d15b94f233ac8aa46eacf5968305fab6122440d0d9cb1eb1ade9933f49214da8c31288de7710c076c2680dfa528465
  • pypi
  • python
  • malware
  • supply-chain
  • litellm

作者

Kunal Singh

最新消息來自 SafeDep 部落格

追蹤以掌握開源安全與工程領域的最新動態及見解

Background

SafeDep Logo

發佈程式碼。

不是惡意軟件。

在你的電腦上免費開始使用開源工具。再擴展至供整個機構使用的統一平台。

來源:Hacker News 熱門(buzzing.cc 中文翻譯) · safedep.io