跳到正文
DEV Community· orca forge·· 2 小時前精選AI 評分77

如何檢查 Mac 是否安裝遭篡改的 LiteLLM 1.107.0

How to Check Your Mac for the LiteLLM 1.107.0 Compromise

AI 導讀

PyPI 上的 litellm==1.107.0 套件遭篡改,Mac 用戶可按文中流程檢查各 Python 環境是否留有入侵跡象。流程包括核對套件版本、搜尋 cook.pth、cook.py 和 sitecustomize.py,並檢查雜湊、檔案內容、標記檔及相關程序;Spotlight 沒有搜尋結果不代表檔案不存在。

推薦理由

文章串連版本、檔案、程序及環境變數的核查步驟,並説明 Spotlight 漏搜隱藏資料夾,以及如何用雜湊和內容辨別合法的 sitecustomize.py。

正文 · 繁體中文

📝 最初以日文刊載於 forge.workstyle.tech。

重點摘要:透過 PyPI 發佈的 LiteLLM 1.107.0 遭到篡改。在 Mac 上,請檢查每個 Python 環境中已安裝的版本,然後搜尋三個檔案和感染標記。本文亦解釋 Spotlight 為何可能搜尋不到檔案,以及如何分辨惡意的 sitecustomize.py 和合法版本。

先説結論

受影響的是安裝了遭篡改版本 1.107.0 的環境。要確認是否受影響,請檢查已安裝的版本、三個指定檔案和感染標記。如果曾安裝遭入侵的版本,只刪除檔案和程序並不足夠;還必須更換任何可從終端機讀取的秘密金鑰或 token。

哪個版本有危險?

受影響的套件是 PyPI 上的 litellm==1.107.0。sdist 及適用於 Linux、macOS 和 Windows 的 wheel 均遭篡改。它於10月21日約20:39 JST 發佈,並於約22:40 JST 從 PyPI 下架。

得知這則新聞後,我也分別檢查了自己的閘道,以及一款依賴 LiteLLM 的 AI 工具。首先,我檢查了每個 Python 環境中的版本。假設虛擬環境的路徑是 <venv>,可以執行:

<venv>/bin/pip show litellm

查看以 Version: 開頭的一行。如果無法使用 pip show,環境的 site-packages 目錄中 litellm-*.dist-info 檔案的名稱也可作為線索。

我在自己的閘道中找到 litellm-1.92.0.dist-info。我也檢查了另一個工具和 uv 的快取,兩者均使用 1.92.0。確認版本後,請確保啟動指令碼不會自動更新套件。我的啟動指令碼只包含在虛擬環境中執行 LiteLLM 的邏輯,沒有安裝或更新程序。

三個檔案的位置

惡意檔案會安裝在 Python 的 site-packages。它們的名稱是 cook.pth、cook.py 和 sitecustomize.py。由於 .pth 和 sitecustomize.py 會在 Python 啟動時載入,即使程序沒有匯入 LiteLLM,它們也可能發揮作用。

在 Mac 上,也可以試用 Spotlight 搜尋。

mdfind -name cook.pth
mdfind -name sitecustomize.py

不過,即使沒有顯示搜尋結果,也不代表這些檔案不存在。這是因為 Spotlight(mdfind)不會搜尋 .venv、~/.cache 或 ~/.local 等隱藏資料夾。我使用 Spotlight 也沒有找到任何結果。接着,我使用 find 直接搜尋主目錄、Python 安裝位置、Homebrew 位置及其他地方。

find ~ /opt/homebrew /usr/local /Library/Frameworks/Python.framework \
  \( -name "cook.pth" -o -name "cook.py" -o -name "sitecustomize.py" -o -name "litellm-*.dist-info" \) \
  -print 2>/dev/null

搜尋範圍太廣可能會花很長時間。使用 -prune 排除相片、影片和 iCloud 等大型資料夾,可以加快搜尋。搜尋範圍務必包括安裝 Python 的位置,以及工具使用的快取。Linux 也適用相同方法;只需將 Mac 專用的搜尋位置換成 Linux 環境中安裝 Python 和工具的位置。

找到 sitecustomize.py 後應檢查甚麼

只看到檔名 sitecustomize.py,不足以判斷電腦是否受感染。我在系統中找到五個此檔案的實例,但它們最後證實屬於合法工具和標準 Python 環境。不要只依賴檔名,而要檢查檔案的雜湊值和內容。

使用以下命令計算每個檔案的 SHA-256 雜湊值:

shasum -a 256 /path/to/sitecustomize.py

將所得數值與 SafeDep 分析報告中公佈的惡意檔案雜湊值比較。我不會在本文列出這些雜湊值,但分析報告列出完整的惡意雜湊值清單,並提供更多詳情。

接着,搜尋檔案內容:

grep -i -E "remote_code_loader|PRIVCOLLECT|litellm\.dev" /path/to/sitecustomize.py

我找到的五個檔案,沒有一個符合報告中的惡意雜湊值,也沒有包含上文搜尋的任何指標字串。檢查這些檔案時,不要單憑檔名就妄下結論,務必同時核對雜湊值和檔案內容。

檢查標記檔案和程序

接下來,我們會確認被盜資料外傳的跡象,以及常駐程序是否正在運作。

ls -la /tmp/.pc_once_72129118c59f5636c0bb /tmp/remote_code_loader.lock

我們不會只因為兩者都不存在就作出結論,也會調查程序。感染時的 sitecustomize.py 會建立一個與父程序分離的常駐程序。其中一項判定條件是「父程序是 PID 1 的 Python 程序」。

ps -axo pid,ppid,lstart,command | awk '$2==1' | grep -i python

在此需要留意,即使父程序的 PID 是 1,也不一定代表有可疑情況。由 launchd 啟動的常駐程序,其父程序亦是 PID 1。請檢查輸出中的命令列,確認該程序是否由你啟動。以我的情況為例,父程序為 PID 1 的 Python 程序,是由 launchd 啟動的閘道。

同時檢查環境變數和網絡通訊

我們也會以環境變數 PRIVCOLLECT_ACTIVE=1 作為線索。由於 macOS 沒有 /proc,我們會使用 ps eww -ax 檢查程序的環境變數。

ps eww -ax | grep "[P]RIVCOLLECT_ACTIVE=1"

起初,我執行了 ps eww -ax | grep -c PRIVCOLLECT_ACTIVE,看到結果是 2,感到很驚訝。這是因為 grep 本身,以及包含搜尋命令的 shell 命令列,都被計算在內。重新計算時排除包含搜尋命令的那一行,結果是 0。如上所示,將第一個字元寫成 [P],就不會與 grep 本身相符。請不但檢查計數,也要查看顯示行的內容。

如要調查通訊目的地,可以按以下方式進行:

lsof -i -n -P | grep -i python

我確認唯一的監聽項目是 127.0.0.1:4000。我們會根據這些檢查的綜合結果作出判斷。

如果你使用過 1.107.0 版本

這段惡意程式碼會竊取 SSH 金鑰、雲端憑證、AI 工具權杖、瀏覽器中儲存的密碼和瀏覽記錄、環境變數,以及 LiteLLM 代理資料庫中的 API 金鑰,並將它們傳送至攻擊者的伺服器。分析報告提及的網域是 www.litellm[.]dev。這並非 LiteLLM 的官方網域。

如果你曾安裝 1.107.0 版本,只刪除三個檔案並不足夠。你必須停止所有常駐程序、刪除標記檔案,並視所有可從該終端讀取的機密資料為已外洩。之後,你需要重新產生 SSH 金鑰、雲端金鑰、AI 工具權杖、已儲存密碼,以及各項服務的 API 金鑰。詳細分析和惡意檔案的雜湊值,請參閲 SafeDep 的分析文章。

在我調查的環境中,沒有發現 1.107.0 版本,也無法確認是否存在那三個檔案或標記。由於 LiteLLM 安裝在多個環境中,我沒有隻檢查一個虛擬環境便作罷;我也調查了該工具的環境和快取。

重點摘要

  • 使用 pip show litellm 檢查各個環境,或搜尋 litellm-*.dist-info。
  • 使用 find 搜尋 cook.pth、cook.py 和 sitecustomize.py;即使 Spotlight 沒有找到任何結果,也要繼續調查。
  • 將 sitecustomize.py 的雜湊值和內容與分析文章比對;不要單憑檔名作出判斷。
  • 檢查兩個指標檔案、PRIVCOLLECT_ACTIVE=1,以及父 PID 為 1 的 Python 程序;如果父程序的 PID 是 1,請檢查命令列。
  • 如果已安裝 1.107.0,請停止程序,並輪換該機器可讀取的機密所用的金鑰或權杖。

來源:DEV Community · dev.to