![]()
3月26日,Python包索引(PyPI)上兩個版本的Litellm被標記為惡意。版本號精確到1.82.7和1.82.8,下載量超過1.2萬次后才被發現。這個專門幫開發者統一管理大模型接口的工具庫,成了攻擊者的跳板。
Litellm的定位很討巧:一行代碼切換OpenAI、Anthropic、Azure等十幾家模型供應商。開發者不用重寫接口邏輯,就能比價、切流量、做降級。這種"中間層"設計讓它在AI應用開發圈快速積累用戶,GitHub星標數超過1.4萬。但中間層的另一面是信任集中——一旦出事,影響面被成倍放大。
攻擊鏈還原:從發布到暴露的72小時
根據PyPI安全團隊公告,惡意版本在3月23日至25日間陸續上傳。攻擊者獲取了項目維護者的發布憑據,直接向官方倉庫推送了篡改后的安裝包。與常見的依賴混淆攻擊不同,這次是直接劫持合法項目的發布管道。
被植入的惡意代碼會在安裝時執行外聯操作。安全研究員Seth Larson在分析報告中指出,payload設計得相當克制:沒有立即的數據竊取行為,而是建立持久化機制,為后續定向攻擊預留入口。這種"低姿態"潛伏策略,讓自動化掃描工具更難在第一時間觸發警報。
發現異常的是社區用戶。3月26日凌晨,有人在Hacker News發帖稱檢測到Litellm安裝包的哈希值與GitHub源碼倉庫不一致。這條帖子兩小時內獲得超過200個點贊,維護團隊BerriAI被迫緊急回應。他們承認發布流程存在漏洞——個人訪問令牌(PAT)可能通過釣魚或泄露渠道落入攻擊者手中。
整個事件的時間線被壓縮得很緊:從首個惡意版本上線到全網下架,間隔不到72小時。但PyPI的下載統計暴露了盲區——1.2萬次安裝中,相當一部分來自自動化CI/CD流水線。這些環境通常缺乏人工審核環節,惡意代碼可能已進入生產系統的依賴緩存層。
供應鏈攻擊的"中間層陷阱"
Litellm的架構特性放大了這次事件的風險系數。作為模型路由層,它需要接觸用戶的API密鑰和請求內容。正常場景下,這是功能剛需;被攻破后,這些權限直接變成數據泄露的高速通道。
一位在金融科技公司擔任架構師的開發者向我描述了他們的排查過程。團隊內部有3個項目使用了Litellm,版本鎖定在1.82.6,恰好躲過了污染區間。但他們的恐慌沒有因此減輕——依賴解析工具顯示,某個間接依賴項曾嘗試拉取1.82.7版本,被私有PyPI鏡像的漏洞規則攔截。"我們以為是過度防御,現在看是撿回一條命。"
這種"差點中招"的體感,在開發者社區反復出現。供應鏈安全公司Socket的分析報告提到,2024年PyPI記錄的惡意包事件同比增長340%,但針對已有知名項目的憑證劫持仍屬少數。更常見的攻擊模式是 typo-squatting(拼寫混淆)和依賴混淆,前者靠名字碰瓷,后者利用私有倉庫與公網的優先級差異。
Litellm事件屬于更危險的第三類:身份盜用。攻擊者不需要欺騙用戶安裝錯誤包名,而是直接污染用戶主動搜索的目標。防御這類攻擊,傳統"仔細看包名"的建議完全失效。
防御清單:從個人到組織的分層策略
事件曝光后,Litellm維護團隊發布了補救措施:強制啟用雙因素認證(2FA)、輪換所有發布令牌、將發布權限從個人賬號遷移至組織級托管服務。但這些是供給側的修補,對已經下載惡意版本的用戶無濟于事。
![]()
對使用側而言,最緊迫的動作是審計。檢查本地環境的site-packages目錄,核對Litellm安裝包的文件哈希是否與官方發布的正確版本一致。如果項目使用了依賴鎖定文件(requirements.txt或poetry.lock),確認鎖定的是1.82.6或更早版本,而非1.82.7/1.82.8的區間表達式。
更長線的防御需要改變工具鏈習慣。Python生態長期依賴PyPI作為單一可信源,但"信任但驗證"的模式在供應鏈攻擊頻發的背景下顯得脆弱。一些團隊開始采用以下分層策略:
私有鏡像 + 漏洞延遲同步:通過Bandersnatch等工具建立內部PyPI鏡像,設置24-48小時的同步延遲窗口。新上傳的包不會立即進入內部供應鏈,為社區發現異常爭取時間。代價是緊急安全補丁的獲取也會滯后,需要人工審核通道作為補充。
哈希鎖定 + reproducible build:放棄模糊的版本區間(如>=1.82.0),改用精確哈希鎖定。Poetry和Pipenv支持這種模式,確保每次安裝的二進制內容與首次驗證時完全一致。缺點是維護成本上升,每次升級都需要重新走驗證流程。
運行時行為監控:對關鍵依賴項實施網絡沙箱。通過eBPF或seccomp限制安裝腳本的系統調用,阻斷異常的外聯行為。PyPI包在安裝階段擁有完整用戶權限,這是設計層面的歷史包袱,短期內難以改變。
這些措施沒有一個是完美的。延遲同步與敏捷開發沖突,哈希鎖定與自動化升級沖突,沙箱與復雜構建流程沖突。供應鏈安全的本質是風險轉移,而非風險消除——你選擇把信任放在哪個環節,攻擊者就會尋找下一個薄弱環節。
開源治理的結構性張力
Litellm的維護團隊BerriAI是一家創業公司,核心產品是基于Litellm的企業級模型網關。開源庫是他們的獲客漏斗,也是技術影響力的來源。這種"開源核心+商業托管"的商業模式,在AI基礎設施領域已成標配。
但模式背后的資源錯配很少被討論。開源側的維護責任往往落在少數核心貢獻者身上,而他們同時承擔商業產品的開發壓力。Litellm的GitHub倉庫顯示,過去6個月有超過80%的代碼提交來自3個賬號。高度集中的維護結構,意味著發布憑據的管理也高度集中——這正是憑證劫持攻擊的易感條件。
PyPI官方在2023年強制推行全站2FA,但實現方式引發過爭議。郵件OTP和TOTP被接受,硬件密鑰支持滯后,而釣魚攻擊早已進化到能實時中繼OTP碼的階段。更根本的問題是,2FA解決的是認證環節,而非授權環節。一旦發布令牌生成,它在泄露后的有效期內具有同等權限,與是否通過2FA獲取無關。
一些更激進的聲音在討論供應鏈的"可驗證構建"——要求PyPI上的發布包必須由公開可審計的CI流水線生成,維護者本地上傳的路徑被逐步淘汰。GitHub的Artifact Attestation和Sigstore項目正在推動這個方向,但 adoption 速度受限于生態慣性。Python的包管理工具鏈歷史包袱沉重,breaking change 的推行阻力巨大。
回到Litellm事件本身,維護團隊的響應速度算得上及時。惡意版本在Hacker News曝光后4小時內完成下架,24小時內發布安全公告,72小時內完成憑證輪換和流程加固。但與攻擊面相比,這些動作是事后止損——1.2萬次下載已經發生,受影響系統的清理責任被轉移給下游用戶。
這種"發現-響應-轉移"的循環,在開源供應鏈安全領域反復上演。2022年的colors.js和faker.js事件、2023年的XZ Utils后門事件,本質都是同一結構的不同變體:關鍵基礎設施的維護責任與資源投入不匹配,攻擊成本與防御成本嚴重不對稱。
你的團隊最近一次審計依賴樹是什么時候?如果發現某個常用庫的版本哈希與官方記錄不符,你的CI流水線會阻斷發布,還是靜默繼續?
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.