奇安信技术研究院“天问“软件供应链安全分析平台持续地对Python、npm等主流开发生态进行监控,以发现其中的恶意包以及攻击行为。2023年2月,”天问“平台监控到PyPI上一起大批量异常包上传事件,经过安全人员的综合分析研判,最终确认这是一起由Yandex数据泄露引发的安全事件,其中涉及的混淆依赖攻击威胁值得警惕!

1. Yandex数据泄漏事件

Yandex是俄罗斯市场占有份额最大的搜索引擎,也是全球第四大搜索引擎公司。2022年1月25日,Yandex前雇员公布了一个关于Yandex的源代码仓库的磁力链接,导致其公司内部源代码遭到泄露,其中包含了大量Yandex在公司内部镜像中使用的Python包名称。

yandex-mangnet

2. 混淆依赖攻击

大量内部私有包名称的泄露导致Yandex面临严重的依赖混淆攻击威胁。我们在之前发表的S&P 2023的论文《Investigating Package Related Security Threats in Software Registries》中,阐述了依赖混淆攻击的原理与危害。当用户同时使用多个镜像源时,会优先下载相同名称版本更高的包。所以,当攻击者知道某一组织内部私有包的名称后,可以在公开源PyPI中发布名称相同,但版本更高的包来诱使用户下载安装,完成混淆依赖攻击。
image-20230311112113795

3. PyPI中相关事件时间线

在我们的监测中,发现用户ezzer在2023年1月27号首先发布了python包yandex-yt-yson-bindings@66.1.0,用于测试Yandex的依赖混淆,其在介绍信息中表明自己是Yandex团队的测试人员。源代码中setup.py如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from setuptools import setup
from setuptools.command.install import install
import subprocess


class PostInstallCommand(install):
def run(self):
subprocess.check_call(["echo", "yandex depconf prevention"])
install.run(self)



setup(
name='yandex-yt-yson-bindings',
version='66.1.0',
author='Dependency confusion tester',
author_email='ezzer@yandex-team.ru',
#packages=['cme-api-clients'],
url='https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610',
description='A package to test dependency confusion',
cmdclass={
'install': PostInstallCommand,
},
)

之后ezzer在1月27号到2月2号期间,共发布了57个用于测试依赖混淆攻击的测试包。其中53个包版本为66.1.0,最后发布的4个包版本为66.0.0。这很有可能是其在比较外部公开源和内部源版本不一致时,依赖混淆成立的条件,即外部源的包版本需高于内部源的同名包文件。

2月2号,yandex-bot用户注册。之后其在2月期间发布了1116个版本为66.0.0的python包,这些包的介绍表明它们都是在预防依赖混淆攻击。

image-20230311104019600

上文中,ezzer发布的yandex-yt-yson-bindings@66.1.0也由其本人移除后,重新由yandex-box发布了66.0.0版本。据此,我们可以推断,ezzer确实是Yandex内部团队的测试人员,这次事件也是Yandex在源代码遭遇泄漏之后的紧急安全预防措施。我们也在npm生态中监测到了类似的情况,经过分析确认,Yandex也对npm生态做了相同的预防措施。

在Yandex源代码泄漏之前,我们也监控到几个针对Yandex进行依赖混淆攻击的恶意包。用户Thomas Anderson在1月16号-17号期间发布了4个针对Yandex的恶意包,并宣称这些包是针对Yandex的安全测试所用。

bughunter

其源码中访问了一个域名,经过分析,这个域名应该是作者利用Pipedream这个在线自动化工具定义的一个http触发器。访问这个域名,当有用户访问这个域名后,作者就可以获得消息通知。

image-20230311110618945
image-20230311110406830

相对于源码泄漏导致的依赖混淆攻击影响,这种基于猜测的依赖混淆攻击明显规模有限。

4. 类似混淆依赖攻击事件

2022年12月17日,PyPI用户pytorch-experimental在PyPI中抢注了PyTorch的一个内部包torchtrition,并利用该包进行信息窃取。12月30日,PyTorch团队提交了一个commit,将代码中的torchtrition替换为了pytorch-triton,并在PyPI中注册了该包来缓解这次混淆依赖攻击。

5. 结语

这次安全事件中,虽然Yandex团队反应及时,但同时也让我们看到了开源生态的脆弱,一次内部人员的泄漏事件就导致如此大规模的包受影响,值得警惕。在软件供应链中,无论是应对外部攻击风险,还是内部防范都需小心谨慎。对于供应链各环节的脆弱点,我们团队做了细致的分析测量,相关成果发表在了国际顶级安全会议S&P 2023上,具体信息参见我们之前的博客开源生态中软件包相关的安全问题研究

参考链接