如果您在2022年12月25日至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 稳定 版包的用户不受此问题影响。
如何检查您的 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/*中的前1000个文件$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包的正确所有权并删除恶意版本