ua-parser-js漏洞引发的思考

原文:https://mp.weixin.qq.com/s?__...
微信公众号:毛毛虫的小小蜡笔

最近跟朋友闲聊,聊起之前出现的npm包漏洞,导致可以在终端上进行投毒攻击、挖矿以及窃取密码。
所以这里再次讲下相关问题。

ua-parse-js漏洞出现和解决

收到各个群的消息以及邮件通知

漏洞和问题,如下截图所示:
image.png

后面看到npm上也有说明,把有问题的版本以及打补丁的版本都列出来,一目了然。
如下截图所示:
ua-parser-js漏洞引发的思考_第1张图片

快速解决问题

首先需要知道自己的项目,是否有引用ua-parser-js包。

步骤:
1、查看项目的根目录下的package.json。
一眼看完,是没有引用的。

2、查看node_modules目录下的依赖包。
搜索了下,发现还真有。
如下截图所示:
ua-parser-js漏洞引发的思考_第2张图片

那是不是就慌了?
其实不用,不管是否有问题,都是要解决的。

虽然能搜到有引用,但还需要进一步看看是哪个包引用,怎么引用。

查看了代码的引用关系链,具体如下所示:
steam-http依赖ua-parser-js
node-libs-browser依赖steam-http
eslint-import-resolver-webpack依赖node-libs-browser
@vue/eslint-config-standard依赖eslint-import-resolver-webpack

也就是steam-http这个包依赖了ua-parser-js,但其版本不是有问题的版本。
而且是在devDependencies中引用的,那肯定不会在打包后的代码里面了。

3、通过npm list xxx查看
确实是没有安装ua-parse-js的。
如下截图所示:
image.png

stream-http的依赖跟上面搜索出来的差不多,也是没有引用ua-parser-js的。
如下截图所示:
ua-parser-js漏洞引发的思考_第3张图片

也可以通过npm list --all,查看项目下的所有包依赖情况。
拷贝到文本中,全局搜索后,是找不到ua-parse-js的。
如下截图所示:
ua-parser-js漏洞引发的思考_第4张图片

另外,也可以通过下面两种方法来查看

1、通过查看yarn.lock文件
也是没看到ua-parser-js的。

而且stream-http下也没有ua-parsre-js。
如下截图所示:
ua-parser-js漏洞引发的思考_第5张图片

2、通过grep命令来查看
grep -rnw . -e 'ua-parser-js' --include={yarn.lock,package-lock.json,package.json}

那这个steam-http为啥会引用ua-parser-js呢?

通过在stream-http代码搜索,发现ua-parser-js是在stream-http的test目录下的,node_modules目录下是没有的。
如下截图所示:
ua-parser-js漏洞引发的思考_第6张图片

这个test文件夹是依赖包做测试用的。不会被引入到依赖stream-http的项目中。

其他

版本号前面的^

虽然现在没引用ua-parse-js,但假设引用了,但引用的版本不是有问题的版本,而是^0.7.18版本,那会不会有问题呢?

还是有问题的,虽然当前的版本不受影响,但一旦升级,就会更新到0.7.29版本,而这个版本是有问题的,所以升级的时候要指定版本号。

但是npm官网已经去掉了有问题的版本,所以更新后只能到0.7.30版本,也就是不会升级到有问题的版本了。

ua-parser-js漏洞是如何执行恶意代码的?

是因为package.json里面的scripts字段。在npm install的时候,会执行一段payload。

npm install是有生命周期的。也执行的之前,会先执行什么,执行之后继续执行什么命令。
ua-parser-js漏洞引发的思考_第7张图片

对比下有问题的代码,就一清二楚了。
如下截图所示:
ua-parser-js漏洞引发的思考_第8张图片

最后

  • 公众号《毛毛虫的小小蜡笔》

有疑问和问题,请留言。

如果觉得文章还可以,请点赞或收藏,谢谢。

你可能感兴趣的:(npm)