LiteLLM 1.107.0 遭篡改,植入憑證竊取程式與遠端程式碼執行後門
PyPI 上遭篡改的 LiteLLM 1.107.0 会安装凭据窃取程序和后门
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 啟動時都會載入其中兩個檔案。
cook.pth會匯入憑證竊取程式cook.py。它會收集 SSH 金鑰、雲端憑證、CI/CD 密碼、AI 工具權杖、瀏覽器密碼,以及 LiteLLM proxy 資料庫中的 LLM 供應商金鑰。它會加密這些資料,並傳送至www.litellm[.]dev。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_pw | Chromium 已儲存的密碼,使用設定檔主金鑰解密(Windows 上為 DPAPI)。Firefox logins.json 和 key4.db |
browser_hist | 瀏覽紀錄 |
ssh_keys | ~/.ssh/* |
shell_hist | bash 和 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_creds | Kubernetes 服務帳戶權杖 |
cicd_secrets | GitLab runner config.toml、Jenkins initialAdminPassword 和 master.key、.vault-token、Terraform credentials.tfrc.json、Packer 設定 |
ai_devtools | Claude 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_metadata | AWS 執行個體中繼資料服務(IMDSv2,然後是 v1):執行個體身分和角色憑證 |
gpg_keys、tls_privkey | GPG 金鑰、TLS 私鑰 |
如何傳送資料
- 程式會使用隨機 AES-256-CBC 金鑰加密 JSON 結果,再以內嵌的公鑰透過 RSA-OAEP 加密該金鑰。
- 程式會將結果打包成 tar.gz(
hdr.json、data.bin、key.bin),並在 POST 要求中傳送至www.litellm[.]dev/healthcheck,同時附上標頭X-Token: XWiA8gZNa7NcX2XRoAEb。 - 上載成功後,程式會寫入
/tmp/.pc_once_72129118c59f5636c0bb,令每台主機只收集一次。程式亦會設定PRIVCOLLECT_ACTIVE=1,避免在同一程序樹中再次執行。
Payload 2:sitecustomize.py 中的後門
Python 啟動時會匯入 sitecustomize,因此這個檔案也會在每個 Python 程序中執行。
sitecustomize.py
PYTHON 5 行
- 程式會鎖定
/tmp/remote_code_loader.lock,確保每台主機只會有一個守護程序執行。 - 程式會呼叫
fork()和setsid(),將標準輸入和輸出重新導向至/dev/null,並切換至/目錄,以脱離父程序。 - Every hour, it:
- 從攻擊者的 GitHub 儲存庫讀取
domain.txt,並取出第一行看起來像網域的內容, - 執行內嵌的竊取程式副本;該副本沒有每台主機只執行一次的標記,
- 下載
http://<domain>/codepy,並使用exec()執行。
- 從攻擊者的 GitHub 儲存庫讀取
攻擊者可透過編輯 domain.txt,將守護程序指向新的伺服器。每台受感染的主機都會將伺服器以 codepy 傳回的任何內容執行。
13:40 UTC,GitHub 帳戶 letters9813 及其儲存庫回傳 404,時間約為發布後兩小時。後門現時找不到伺服器位址,因此不會執行任何操作。在刪除前已執行守護程序的主機,可能已接收並執行第二階段程式碼。SafeDep 未能還原伺服器位址。
時間線
所有時間均為 UTC,日期為 2026-10-21。
| 時間 | 事件 |
|---|---|
| 06:59 | 標籤 v1.107.0 的提交 66c8f5b 已建立 |
| 08:50 | main 上的提交 a8113b0,是發布原始碼所依據的版本 |
| 10:44 | 正式版 1.106.2 已上載至 PyPI |
| 11:20 至 11:37 | 已建置惡意 wheel 套件 1.107.0 |
| 11:39 至 11:40 | 1.107.0 已上載至 PyPI(全部 8 個檔案) |
| 11:50 | litellm-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.gz | 2befe2a79fb4fbbd9a543b5b40b530c8cffa8771bab22b8fb22b2e4ae3b1f819 |
litellm-1.107.0-cp310-abi3-manylinux_2_28_x86_64.whl | 462d0c9f67ca522d9e0e4acd245e90b36ce0d5353604a66bb7c43a1ec4a6fcf7 |
litellm-1.107.0-cp310-abi3-manylinux_2_28_aarch64.whl | 668169d35b87bf51324080390b1b1c5ab12bd335cfe5f1a99e3689abd5e02ae6 |
litellm-1.107.0-cp310-abi3-musllinux_1_2_x86_64.whl | 1bbce8caa94f01c0aaa0b7ddae51553a8a32e1ce53d96d44fe583272aff7ad00 |
litellm-1.107.0-cp310-abi3-musllinux_1_2_aarch64.whl | c2e32d0ce2548aa662c18bf5001911a79fe5b30cf8357132275add02fdcde054 |
litellm-1.107.0-cp310-abi3-macosx_10_12_x86_64.whl | 7598727f209d717041db37f7dca271d3a7d328a279890e0e1d55375729aeb86d |
litellm-1.107.0-cp310-abi3-macosx_11_0_arm64.whl | 0aaf7ba346d41ef2f40390436738b001180d5a1c03aa093f121078a9969d9a1a |
litellm-1.107.0-cp310-abi3-win_amd64.whl | 12d4ccc5c6f8d35cf4f2cf233b7f3e418e863e657d81ff5f5fc9e210005b9484 |
由於 CRLF 換行符號,植入的檔案在 Windows 上的雜湊值不同:
| 檔案 | Linux 和 macOS | Windows |
|---|---|---|
cook.pth | 7f191632e7320705d154b85204f1ae546b543acbd7e8861229b76f5042b92bdb | 84dc8c82c0a4a4a62552ef826b49fcc86d1a5c4a5d0f2c06665723f93d129d7d |
cook.py | 9dd0a3926f96a37eb86cf1ee2310d9be93139cc4ebef3ef9e2efe9531390be25 | 03ac2a8b752605d1d7710979c17ff18b03dd978203ba23ba97fd8ce3d6f897ea |
sitecustomize.py | 34bef04fe88ac9d0aae0475630b1738681d15b94f233ac8aa46eacf5968305fa | b6122440d0d9cb1eb1ade9933f49214da8c31288de7710c076c2680dfa528465 |
- pypi
- python
- malware
- supply-chain
- litellm
作者
![]()
最新消息來自 SafeDep 部落格
追蹤以掌握開源安全與工程領域的最新動態及見解
發佈程式碼。
不是惡意軟件。
在你的電腦上免費開始使用開源工具。再擴展至供整個機構使用的統一平台。
來源:Hacker News 熱門(buzzing.cc 中文翻譯) · safedep.io