高达800万次下载量的npm包被黑客篡改代码,你的设备或正成挖矿机
今天,不少开发者“原地爆炸”,因为一个广泛使用的 NPM 库 event-stream 突然被发现包含一个名为 flatmap-stream 的依赖项,而这个依赖项被植入了窃取比特币的后门,这意味着使用到该模块的开发者们,你们的设备或许早已在自己不知情的情况下变成了挖矿机。
1.我们是怎么一步一步掉坑的?
我们都知道,event-stream 是一个用于处理 Node.js 流数据的 JavaScript npm 包,它使得创建和使用流变得容易,正是因此,它也受到了广大开发者的欢迎,目前这个库每周有 200 万的下载量,被包括财富五百强在内的大小企业使用。
然而不怕神一般的对手,就怕“小猪佩奇”一样的队友。数月前,在 GitHub 上这个库的维护者@dominictarr 因为缺乏时间和兴趣无法继续维护这个库了,于是就将该库转让给了一个完全不认识却又想要维护的陌生人@right9ctrl ,接而不少开发者的噩梦就此开始了。
原作者@dominictarr:他发邮件给我,说他想维护这个模块,于是我把模块所有权移交给了他。我没有从这个模块得到任何回报,而且我已经好久不使用这个模块了,大概有好几年了吧。今年 9 月 8 日,新维护者@right9ctrl 开始了初步性的动作,首先释出了 event-stream 3.3.6 版本的更新,并在其中加入了一个全新的模块——flatmap-stream,彼时这个模块中并没有恶意功能。
9 月 16 日,@right9ctrl 重写了代码并删除了对 flatmap-stream 的依赖,之后又推出新版本,这意味着更新不会自动升级。
10 月 5 日,flatmap-stream 0.0.1 版本被一个名为“hugeglass”的用户推送到了 NPM。而这次释出的更新中该模块就被加入了窃取比特币钱包并转移出余额的功能。
因此,自 10 月 5 日以来,任何通过 event-stream 库并使用被植入恶意代码 flatmap-stream 的开发者都可能受到恶意脚本的攻击。而据统计,自 2018 年 9 月更新以来,恶意包已下载近 800 万次。且原作者也无奈地表示,自己也没有权限去修改。
2.专门针对比特币的后门
这一事件之所以会在两个半月之后被发现,还是因为 flatmap-stream 中的恶意代码使用了一个在 Node 10 中被弃用的 API。GitHub 上的用户 Jayden Seri 在运行 Node 代码时发现了该警告,并在其中一个包c(https://github.com/remy/nodemon/issues/1442)上提出了疑问,该包将 flatmap-stream 作为传递依赖关系引入。
后来,加州州立大学富勒顿分校的计算机科学专业学生 Ayrton Sparling(GitHub @FallingSnow)也同样发现了这一问题,他对 event-stream 模块添加了 flatmap-stream 作为依赖项,然后包含针对另一个包 ps-tree 的注入代码。
最终发现 [email protected] 版本中的恶意代码,显然是试图从 Dash Copay 比特币钱包中窃取比特币。flatmap-stream 这个模块在 GitHub 上托管,并通过 Node 包管理器(NPM)分发,而这个恶意代码也很难被发现,因为 flatmap-stream 模块已加密,如今它于本周一被 NPM 官方从列表中删除。
据外媒 The Register 报道,新的 NPM 发言人表示:“今天上午 9 点 18 分,子依赖 flatmap-stream 被删除,并且在今天上午 9:30,NPM Inc.接管了 event-stream 项目的控制权。“
而针对上文用户发现恶意代码试图从 Dash Copay 比特币钱包中窃取比特币一事,Copay 公司一开始否认了 Copay 开发的钱包应用在其代码中使用了 event-stream 依赖库,但是最后又承认它释出的应用包含了后门版本的 event-stream。该公司称使用 versions 5.0.2 到 5.1.0 的用户受到了后门影响。使用这些版本的用户应该假定他们的私钥已经被窃取了,需要尽可能快的升级到 5.2.0 版本。
3.面对后门版本,开发者们中招了怎么办?
目前对于开发者受到此漏洞的影响程度尚未可知,但是当前我们的首要任务还是检查自己是否使用了相关的恶意库,例如运行以下代码:
$ npm ls event-stream flatmap-stream ... [email protected] ...
如果在输出里面包含了 flatmap-stream 则说明你也可能被攻击。
倘若确认受到了影响,接下来你首先要做的是从应用程序中删除恶意软件包,可以通过恢复到 event-stream 版本 3.3.4 来执行此操作。
此外,如果你的应用程序使用恶意库并处理了比特币,请检查在过去 3 个月内的活动,以查看是否有任何已开采或转移的比特币没有进入自己的钱包。
如果你的应用程序没有窃取到比特币但特别敏感,建议你也要检查在过去 3 个月内的活动是否有任何可疑现象,特别是在网络上发送到非预期目的地的数据。因为黑客或许没有通过代码窃取到比特币,但也有可能是在监控你的应用程序。
与此同时,对于不少网友反映的前端主流框架 Vue 的 Vue-cli 中也使用了 event-stream 这个依赖问题,今天 Vue 作者尤雨溪(微博@尤小右)在微博回应表示:
关于 npm event-stream 包的安全问题,Vue CLI 对其依赖关系仅在用 UI 终止任务时存在,已创建项目通过纯 CLI 使用的不受影响。为彻底杜绝问题,建议重装全局的 @vue/cli。4.反思
在这一事件发生后,不少网友痛批原作者@dominictarr 亲手将项目交到了黑客手中,且还没有在社区中向大家告知有关 event-stream 项目所有权变更的通知。还有一部分网友表示,开源软件许可明确表示软件作者对软件不提供保证也不承担任何责任。但值得注意的是,在开源的世界中,在原作者缺乏时间或精力的情况下,转移所有权给他人也是一种相对普遍的做法。如果真的要问责,开发者要怪也只能怪自己信任代码,只能怪黑客骗取了所有人的新任。
对此,NPM 安全主管 Adam Baldwin 也回应称:“基于我们目前尚未完成的分析,早期迹象表明这是对比特币平台的极具针对性的攻击。”正是如此有针对性的攻击,Baldwin 预计其影响将是微乎其微的。
但是整体而言,近年来,像 NPM 和其他代码存储库(如 Python 的 PyPI 和 Ruby 的 RubyGems)由于其开放性可以为许多业余开发者和缺乏资金的创业者提供很大的帮助,但是也极为容易受到攻击。尽管不断增加自动漏洞扫描和报告机制等防御措施,但对于开源软件,开发者们仍可以自由发布未经修复的代码,风险不大可能消失。
当被问及将来如何避免这种情况时,Baldwin 承认,无法维护的代码和转移代码所有权都会带来潜在的问题。他认为 NPM 社区如果为了控制且识别恶意代码以致让其他人都不能发布代码,那么将损害社区发展。
“当前需要做的是让维护人员和社区共同迅速跟进。”Baldwin 如是说。
对此,你怎么看?是否有更好的建议?欢迎下方留言分享你的看法。
参考:
https://snyk.io/blog/malicious-code-found-in-npm-package-event-stream
https://medium.com/@cnorthwood/todays-javascript-trash-fire-and-pile-on-f3efcf8ac8c7
https://www.theregister.co.uk/2018/11/26/npm_repo_bitcoin_stealer/