编程

以反战之名,向开源项目“投毒”?知名 NPM 包作者注入恶意代码,只为一个文件名

937 2022-03-19 03:02:51

2021年,开源软件引发的安全性问题层出不穷,继影响广泛的Log4j2漏洞,还有因没有开源收入,著名开源npm包faker.js和colors.js项目作者Marak Squires主动恶意破坏自己的项目并“删库跑路”等事件。近期又有开发者向自己维护的项目源代码中“投毒”,将恶意代码注入其中,当其他开发者使用该项目时,自己的计算机桌面会自动生成一个名为“WITH-LOVE-FROM-AMERICA.txt”,打开乍一看啥都没有,但又细思极恐。

在了解这位开发者究竟为何这么做时,其名曰“反战”。

向多版本“投毒”,开源开发者的蓄谋

这个故事要从名为node-ipc和Peacenotwar的两个npm包开始说起。

node-ipc是npm中一个主流的开源包,平均每周下载次数高达100万次。它允许进程间通信,被广泛用于基于JavaScript的项目中,在我们经常使用的Vue.js和Node.js等框架中也常能看到node-ipc的身影。

时针回到3月8日这一天,node-ipc背后的作者RIAEvangelist(Brandon Nozaki Miller)在这个项目中发布了一个Peacenotwar的npm包。

所谓Peacenotwar,正如RIAEvangelist对此模块撰写的描述那番:

这段代码是一个非破坏性的例子,说明为什么控制你的node模块很重要。它还可以作为一种非暴力抗议,以反对俄罗斯目前威胁世界的侵略行为。此模块将在您的用户桌面上添加一条和平消息,并且仅在它不存在时才会这样做,只是为了礼貌。

 

事实上,据安全厂商Snyk后来的调查显示,这是一次蓄意而为的行动,并非RIAEvangelist一时兴起。

因为在3月7日,RIAEvangelist接连发布了node-ipc的10.1.1、10.1.2两个版本。在这两个版本中,RIAEvangelist对代码进行了更新,还将源码进行了压缩,简单地将一些关键字符串进行了base64编码,由此也让部分开发者对他的所为可能会带来的一些可疑活动、可能滥用源代码和包行为表示担忧。

此次更新的两个版本的代码被添加设置了一个计时器,一旦有代码经过计时器函数时,它们将在以下代码行中用作文件输入源,以擦除文件内容并将其替换为心形符号。除此以外,这段代码还会对来自俄罗斯或白俄罗斯的IP进行监测。

 

本来很多人只是对RIAEvangelist的行为感到担心和不安,万万没想到,3月8日,node-ipc 10.1.3版本发布了,且这个版本引入了Peacenotwar模块。四个小时后,node-ipc 11.0.0版本发布,此时,开发者在基于node-ipc包构建项目时,桌面上会无缘无故出现一个名为“WITH-LOVE-FROM-AMERICA.txt”的文件。

 

刚开始,并没有太多人发现这个问题,因为在此之前,Peacenotwar模块几乎无人下载。

然而,直到3月15日,Peacenotwar的下载量激增。

想必很多人也能猜到,没错,在这一天中,RIAEvangelist将Peacenotwar作为node-ipc的依赖项引入了。与此同时,RIAEvangelist也发布了node-ipc 9.2.2补丁版本,它是node-ipc的最新的稳定分支,其中主流的前端框架vue cli使用了这一版本。

这意味着所有使用node-ipc的项目都可以让用户的屏幕显示“WITH-LOVE-FROM-AMERICA.txt”文件。幸运的是,此模块仅显示文本,不会擦除数据。据悉,RIAEvangelist最初开发这份恶意代码是为了识别用户的IP并仅当地址来自俄罗斯或白俄罗斯时,删除数据的。

此事一经发现,便在技术圈中引起了热议。

 

开源社区的信任再遭破坏

截至目前,RIAEvangelist把“投毒”的代码删除了。vue cli项目中的node-ipc版本也回滚到了安全的9.2.1版本。最早有问题的node-ipc10.1.1和node-ipc10.1.2都已经废弃。

除此之外,RIAEvangelist还在GitHub的相关issue讨论中回复到:

1.运行该代码实际上是不可能的,它不构成威胁,但它看起来确实很吓人。

2.我打算把这块不是战争的模块标记为抗议软件,只是为了明确说明它是这样的。

其中,RIAEvangelist维护着40多个其他npm包,下载量达数亿。

 

现实来看,开源生态耗费了无数开发者的时间与精力,才慢慢壮大起来。因自己的个人观点和做法,牵扯其背后的开源开发者们和普通用户,无疑之中严重破坏了开源生态的信任,RIAEvangelist所带来的影响也是无法估计的。

看了有关问题的讨论,RIAEvangelist试图在扭曲事实,还说API Key是无效的。但经另一位开源开发者MidSpike实测后,这个API Key是有效的。

 

 

脆弱的供应链,需要每一个社区成员守护

从彼时的Log4j2到现在的node-ipc,这不禁让人担心一个问题,那就是开源软件供应链安全问题,越是庞大的项目在供应链安全方面越是脆弱。

对此,有不少网友建议开发一种代码审查机制。如果审查机制建立,包含恶意代码的包将会进一步减少,同时开源社区的安全更有保障。除此以外,广大网民还需要有反恶意行为的意识,维护“绿色”开源。

开源社理事长庄表伟直接表示:我们需要建立一种开源世界的反分裂共识。

同时,开源安全扫描平台snyk中也给出了一些建议:“由于担心未来的代码更新可能会给用户带来风险,我们建议完全避免使用npm包。如果此npm包作为您正在构建的应用程序的一部分捆绑在您的项目中,那么我们建议您使用npm包管理器功能来完全覆盖被破坏的版本并将传递依赖关系固定为known good。”以此来解决用户的担忧。

这件事让多少用户痛恨RIAEvangelist,破坏了多少人所建立的心血。一代人应该有一代人的担当,广大用户应该奉献自己的力量,守护好这个社区。如果开源社区不加以整治,未来又会有多少个这样的“包”呢?开源社区的成员还会越来越多吗?对于这件事,你有什么看法吗?