由 PyTorch 团队编写

如果您在 2022 年 12 月 25 日至 2022 年 12 月 30 日期间通过 pip 在 Linux 上安装了 PyTorch-nightly,请立即卸载它和 torchtriton,并使用最新的夜间构建版本(晚于 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 GMT,我们得知一个恶意依赖包( torchtriton )被上传到了 Python 包索引(PyPI)代码仓库,其包名与我们 PyTorch 夜间包索引中提供的包名相同。由于 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 已被从我们的夜间包的依赖中移除,并替换为 pytorch-triton(pytorch/pytorch#91539)以及在 PyPI 上注册的虚拟包(以防止此类问题再次发生)
  • 所有依赖于 torchtriton 的夜间包已被从 https://download.pytorch.org 的包索引中移除,直至另行通知
  • 我们已联系 PyPI 安全团队,以获取对 torchtriton 包在 PyPI 上的适当所有权,并删除恶意版本