月下载量千万的 npm 包被黑客篡改,Vue 开发者可能正在遭受攻击

31,513 阅读4分钟

今天早起看手机,结果发现我的微信群炸了,未读消息 999+,大家都在讨论 event-stream 事件。打开 twitter 也是被这个刷屏了。

于是翻看了一下 GitHub issue,大概知道了事情的原委。

用户 @FallingSnow 在 GitHub 上为 event-stream 仓库创建了一个 issue,标题为:"I don't know what to say.",翻译过来大概就是“我也是很无语了”。因为 event-stream 包突然多出了一个名为 flatmap-stream 的依赖项,而这个依赖项正在窃取用户的数字货币。

event-stream 被很多的前端流行框架和库使用,每月有几千万的下载量。在 Vue 的官方脚手架 vue-cli 中也使用了这个依赖,作为最流行的前端框架之一,这个影响还是挺大的。而 React 则躲过了以此影响。

flatmap-stream 中的恶意代码会扫描用户的 nodemodules 目录,因为所有从 npm 下载的模块都会放在此目录。如果发现了在 nodemodules 存在特定的模块,则将恶意代码注入进去,从而盗取用户的数字货币。

如果想查看自己的项目是否受到影响,可以运行:

  1. $ npm ls event-stream flatmap-stream

  2. ...

  3. flatmap-stream@0.1.1

  4. ...

如果在输出里面包含了 flatmap-stream 则说明你也可能被攻击。

如果使用 yarn 则可以运行:

  1. $ yarn why flatmap-stream

根据 issue 的描述,这次事件还非常具有戏剧性,因为攻击者(@right9ctrl)在大概 3 个月前明目张胆的添加了攻击代码,并提交到了 GitHub,随后发布到了 npm。于是 @FallingSnow 在 GitHub 上询问“为什么 @right9ctrl 有这个项目的访问权限呢?”

@dominictarr Why was @right9ctrl given access to this repo? He added flatmap-stream which is entirely (1 commit to the repo but has 3 versions, the latest one removes the injection, unmaintained, created 3 months ago) an injection targeting ps-tree.

不久这个仓库的所有者(@dominictarr)给出了一个让人哭笑不得的回复:

他发邮件给我,说他想维护这个模块,于是我把模块所有权移交给了他。我没有从这个模块得到任何回报,而且我已经好久不使用这个模块了,大概有好几年了吧。

而且:我已经没有发布这个模块的权限了。

作者已经把这个模块移交给了黑客。

  1. $ npm owner ls event-stream

  2. right9ctrl <right9ctrl@outlook.com>

从 GitHub 的提交记录也可以看到,作者(@dominictarr)最后一次提交代码是去年 10 月。而之后黑客 @right9ctrl 也一直在维护此模块。但是在 3 个月前,黑客在 GitHub 上新建了一个 flatmap-stream 仓库(内含恶意代码),并在这个项目中引用了自己的仓库。

直到几天前这个有漏洞的仓库才被发现,然后 npm 紧急将这个含有恶意代码的 flatmap-stream 模块删除了。

这段恶意代码目前还能在 GitHub 上看到,感兴趣的可以自己去分析。攻击者还是挺有心机的。

在评论区也出现了对 @dominictarr 的指责,轻易的将一个周下载量百万级别的模块移交给了陌生人去维护。但是熟悉 @dominictarr 的人都知道,虽然 @dominictarr 不如 tj 大神那么高产,但是 @dominictarr 也维护着 400 多个 npm 包,而维护这么多包无疑花费了很多的时间和精力。

虽然我们不知道黑客(@right9ctrl)发送的邮件是如何写的,但是无容置疑的是,这封邮件使其获得了 @dominictarr 的信任,再加上 @dominictarr 已经好久不使用这个包了,因此将所有权转移给了黑客(@right9ctrl)。

而这次漏洞事件,也让我们回过头来重新反省 node.js 社区。

最后再次提醒:如果你是 vue 开发者,请务必检查一下自己的项目。即使你不是 vue 开发者,最好也检查一下,因为很多流行模块比如 nodemon、npm-run-all、ps-tree 也都受到了影响。

继续阅读: