如果您在 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 Package Index (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 Package Index (PyPI) 代码仓库,其软件包名称与我们在 PyTorch nightly 软件包索引上发布的名称相同。由于 PyPI 索引具有优先权,导致安装的是这个恶意软件包,而不是我们官方仓库的版本。这种设计使得有人可以在第三方索引中注册一个与现有软件包同名的软件包,然后 pip 默认会安装他们的版本。
这个恶意软件包名称同为 torchtriton
,但其中添加了从机器上传敏感数据的代码。
我们了解到的信息
PyPI 上的 torchtriton
包含一个恶意 triton 二进制文件,安装路径为 PYTHON_SITE_PACKAGES/triton/runtime/triton
。其 SHA256 哈希值列于下方。
SHA256(triton)= 2385b29489cd9e35f92c072780f903ae2e517ed422eae67246ae50a5cc738a0e
该二进制文件的主函数执行以下操作
- 获取系统信息
- 来自
/etc/resolv.conf
的 nameserver - 来自
gethostname()
的主机名 - 来自
getlogin()
的当前用户名 - 来自
getcwd()
的当前工作目录名称 - 环境变量
- 来自
- 读取以下文件
/etc/hosts
/etc/passwd
$HOME/*
下的前 1,000 个文件$HOME/.gitconfig
$HOME/.ssh/*
- 通过加密的 DNS 查询,使用 DNS 服务器
wheezy[.]io
,将所有这些信息(包括文件内容)上传到域名*.h4ck[.]cfd
。
该二进制文件的文件上传功能仅限于大小小于 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
软件包的正确所有权并删除恶意版本。