一、引言

在过去数月里,我们的“天问”平台不断追踪到针对 npm 生态的软件供应链攻击事件,并发现了迄今 npm 生态中最严重的垃圾软件包污染事件。攻击者在短时间内采用自动化手段,通过多个账户发布了大量 npm 垃圾软件包,甚至导致 npmjs 软件源出现短暂不可用状态。这些垃圾软件包利用了 npmjs 官方网站的 Readme 渲染特性以及其广泛的知名度,为攻击者提供了通过搜索引擎优化(SEO)牟利、插入钓鱼网站链接进行诈骗等恶意行为的机会。值得注意的是,攻击者在众多 npm 包的作者字段中均声明了“P2Pshnik”这一名称,故此次攻击事件以此命名。

二、垃圾包数量激增

在2023年3月底,npm生态发生了一些异常,可能有开发者已经注意到,在2023年3月30日及31日npmjs软件源出现了偶发的“服务不可用” 的错误,这是因为有攻击正在通过上传大量的垃圾软件包来污染npm。攻击者在短短几个小时内上传了数十万个npm包,并且都使用了不同的发布账号,导致npm的全球服务出现了短暂的不可用状态。

通过我们日常监测的数据可以看到,npm生态每天上传的软件包数量较为稳定,并呈现出按周变化的规律。但是在3月末尾,攻击者开始对npm生态进行了大量的污染操作,导致这几日软件包发布数量异常,最多的一天npm生态中软件包的发布数量超过了16万个。攻击者的大量上传行为一定程度上导致了对npm软件源的DoS攻击,使得npm出现偶发的服务不可用状态。

image-20230421171803671

三、垃圾软件包内容

由于npmjs.com 在一个软件包的展示页面会自动渲染包内的Readme文件,攻击者通过滥用这一特性,将特定的URL嵌入Readme从而达到在npmjs官网上展示的目的。在攻击者所发布的npm软件包中,除了必须的package.json文件,大多只包含一个Readme文件,攻击者在Readme文件中嵌入一些URL链接和诱导性文字来迷惑用户。也有部分npm包包含一个index.js文件,但并无有意义的代码包含在内。

通过我们的分析总结,发现这些垃圾包有一些共有的特点:

  • 垃圾软件包都只包含一个版本。
  • 除了package.json文件,在垃圾包中大多都只包含一个Readme文件。
  • Readme文件具有相同模板,且都包含一些诱导性文字和钓鱼网站的链接。
  • npm软件包的名称大多都以多个连字符连接,并表达出一定的诱导含意。

四、攻击高潮:P2Pshnik

早在2022年末,我们就观察到了一些npm软件包会出现类似的情况,有人会发布一些毫无意义的npm软件包,并在Readme文件里附带一些钓鱼链接,但发布的数量和频率并不算太高。直到三月末的这几天,攻击者P2Pshnik集中上传了近30万个npm包,将这次污染事件推向高潮,也是导致npm软件源服务短暂不可用的罪魁祸首。下图展示了我们追踪到的针对开源软件生态进行垃圾包污染行为的时间线,其中以P2Pshnik污染事件为高潮,并且类似的污染行为一直在持续发生。

P2Pshnik-timeline (1)

攻击者P2Pshnik 的污染行为证明了其已经实现了一套可以自动化注册npm账号、发布npm软件包并绕过npm检测的成熟流程,并且污染能力十分强悍,其能力可以达到每小时发布约20000个npm包。如果攻击者精心构造了某些针对npm的软件供应链攻击,那么将会产生更为严重的后果。下面的折线图展示了P2Pshnik发布npm包的时间和数量, 可以看到该攻击者的污染能力非同小可。

p2pupload

下图为一个P2Pshnik软件包在npmjs官网的示意图,图中内容为俄语, 被渲染出得Readme文件标题含意为“用美元进行金钱冥想”,第一段具体文字内容大意为:“永远忘掉财务问题:一种新的赚钱方式将使您足不出户就可以赚到数百万美元!”,并使用十分醒目的指向性emoji图标来诱使用户点击链接,翻译为中文是:“👉👉👉👉点击这里了解详情👈👈👈👈”

image-20230423113107065

该链接的实际内容是一个telegram的频道邀请。用户点击该链接就会就会跳转至邀请接受页面,并自动唤醒telegram程序。加入该频道后可以看到,大部分都是关于研究加密货币和一些套利方式的俄语内容。

p2p

通过分析,P2Pshnik发布包的账户都是使用Gmail邮箱进行注册的npm账号,攻击者仅使用每个账户发布了4到5个npm包,总共使用的npm账户多达数万个。可见攻击者已经形成了稳定且成熟的npm包发布渠道,可以自动化的注册账号并进行软件包发布。

除此之外,攻击者也在不断的变换自动生成的npm软件包内容,使其内容更加具有随机化的特征,不容易被常规检测手段所发现。例如,攻击者在后续发布的垃圾软件包内,将所有的链接都替换为了相应的短链接地址,使检测工作更加的困难。

五、其他污染形式

除了攻击数量最多的P2Pshnik,还有一部分垃圾软件包中包含者一些钓鱼网站的链接,这些包使用的模板形式与P2Pshnik类似,有的包还包含了一些诱导性的图片。这些钓鱼链接大都以”免费观看在线电影“、“免费获得onlyfans会员账号”、“hack任意的instagram账号”、“获得免费现金”等为主题诱导用户点击。并且这些主题在google检测中也会得到较高的权重,更容易被普通用户搜索到。

当用户访问这些具体的网站时,则会陷入攻击者提前构建好的诈骗套路中,用户可能会被引导至泄露自己的个人信息、银行卡信息等。还有一些链接内容是重定向到一个电子书网站某本书的详情页面,有可能是用于提高这些书籍的访问排名等,攻击从中进行牟利。

经过我们统计,在过去的三个月时间内,类似这样的垃圾软件包发布了大约40万个左右。加上之前P2Pshnik的30万个包。在2023年刚刚开始的三个月时间内,npm生态中就增加了约70万的垃圾软件包。以下是一些垃圾软件包相关的截图和钓鱼网站的截图示例。

6he1

6h1

六、污染行为的影响与危害

npm生态已然成为了现在开源软件生态中最为庞大的一个,npmjs官网在google的搜索中占有很高的权重且有着很好的信誉。攻击者这种滥用行为相当于使用了npmjs官网成为了其页面内容的托管者,并使其在google中更容易被检索到。

npm软件包的上传无须任何的审计,在发布一个软件包后的几秒内就可以在npmjs官网上搜索到该包的内容,这也导致了npm生态更加容易被滥用。我们注意到在此次事件发生后,npm官方已经对一些包进行了处理,但如此大量的软件包上传也对npm的审计工作增加了沉重的负担,无法及时地将所有污染的软件包进行及时的清理。

这也就导致该问题影响到其他同步npm数据的网站。例如npm.io、snyk.io等网站同样会将npm软件包内的Readme文件内容渲染在软件包详情页面。

2h1

七、结语

此次事件中,npm软件包发布过规模空前巨大,攻击者已经掌握了可以稳定且短时间内发布大量npm包的自动化方式。甚至如此高频率的发布导致了npm软件源出现了不稳定的状态。攻击者也在不断改进其发布软件包的随机性和内容的隐蔽性,给npm生态的安全检测带来了更多的挑战。