如果您在 2022 年 12 月 25 日至 2022 年 12 月 30 日期間透過 pip 在 Linux 上安裝了 PyTorch-nightly,請立即解除安裝它和 torchtriton,並使用最新的 nightly 二進位制檔案(2022 年 12 月 30 日之後的版本)。
$ pip3 uninstall -y torch torchvision torchaudio torchtriton
$ pip3 cache purge
在此期間透過 pip 安裝的 PyTorch-nightly Linux 軟體包安裝了一個名為 torchtriton 的依賴項,該依賴項在 Python 包索引 (PyPI) 程式碼倉庫中遭到篡改,並運行了一個惡意二進位制檔案。這就是所謂的供應鏈攻擊,它直接影響了託管在公共包索引上的軟體包的依賴項。
注意: PyTorch 穩定版 (stable) 軟體包的使用者不受此問題影響。
如何檢查您的 Python 環境是否受到影響
以下命令將搜尋 torchtriton 包中的惡意二進位制檔案 (PYTHON_SITE_PACKAGES/triton/runtime/triton),並輸出您當前的 Python 環境是否受到影響。
python3 -c "import pathlib;import importlib.util;s=importlib.util.find_spec('triton'); affected=any(x.name == 'triton' for x in (pathlib.Path(s.submodule_search_locations[0] if s is not None else '/' ) / 'runtime').glob('*'));print('You are {}affected'.format('' if affected else 'not '))"
當匯入 triton 包時會執行該惡意二進位制檔案,這需要顯式的程式碼呼叫,並非 PyTorch 的預設行為。
背景
12 月 30 日(週五)格林尼治標準時間下午 4:40 左右,我們瞭解到有一個惡意依賴包 (torchtriton) 被上傳到了 Python 包索引 (PyPI) 程式碼倉庫,其包名與我們在 PyTorch nightly 軟體包索引中釋出的包名相同。由於 PyPI 索引具有優先權,該惡意包被預設安裝,而不是我們官方倉庫中的版本。這種設計使得任何人都可以註冊與第三方索引中現有的包同名的包,而 pip 預設會安裝他們的版本。
這個惡意包名稱相同,即 torchtriton,但添加了用於從機器上傳敏感資料的程式碼。
已知情況
PyPI 上的 torchtriton 包含一個惡意的 triton 二進位制檔案,安裝在 PYTHON_SITE_PACKAGES/triton/runtime/triton。其 SHA256 雜湊值如下:
SHA256(triton)= 2385b29489cd9e35f92c072780f903ae2e517ed422eae67246ae50a5cc738a0e
該二進位制檔案的主要功能包括:
- 獲取系統資訊:
- 來自
/etc/resolv.conf的名稱伺服器 - 來自
gethostname()的主機名 - 來自
getlogin()的當前使用者名稱 - 來自
getcwd()的當前工作目錄名 - 環境變數
- 來自
- 讀取以下檔案:
/etc/hosts/etc/passwd$HOME/*中的前 1,000 個檔案$HOME/.gitconfig$HOME/.ssh/*
- 透過加密的 DNS 查詢將所有這些資訊(包括檔案內容)上傳到域名 *.h4ck[.]cfd,使用 DNS 伺服器 wheezy[.]io
該二進位制檔案的檔案上傳功能僅限於小於 99,999 位元組的檔案。它還只上傳 $HOME 中的前 1,000 個檔案(但會上傳 .ssh 目錄中所有小於 99,999 位元組的檔案)。
採取的緩解措施
- torchtriton 已從我們的 nightly 軟體包依賴項中移除,替換為 pytorch-triton (pytorch/pytorch#91539),並在 PyPI 上註冊了一個空包(以防止此問題再次發生)。
- 所有依賴 torchtriton 的 nightly 軟體包已從我們在 https://download.pytorch.org 的軟體包索引中移除,直至另行通知。
- 我們已聯絡 PyPI 安全團隊,以獲取 PyPI 上
torchtriton包的合法所有權,並刪除惡意版本。