博客

2022 年 12 月 25 日至 12 月 30 日期间 PyTorch-nightly 依赖链受损。

作者 2022年12月31日2024年11月14日暂无评论

如果您在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 包含一个安装在 PYTHON_SITE_PACKAGES/triton/runtime/triton 的恶意 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 包的正确所有权并删除恶意版本。