跳转到主要内容
博客

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 稳定 软件包的用户受此问题影响。

如何检查您的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左右,我们了解到Python包索引(PyPI)代码库上上传了一个恶意依赖包(torchtriton),其包名称与我们在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包的正确所有权并删除恶意版本