1. 背景
- 2021年7月21日,国外
ReversingLab
实验室在Hackernews
上发表了一篇名为《Groundhog day: NPM package caught stealing browser passwords》的文章,其内容为发现一个nodejs的恶意包有窃取安装用户电脑上chrome密码的行为。
2. nodejs包的各版本文件分析
- 该实验室所采取的分析手段:对npm包进行大范围扫描分析,使用了机器学习算法来检测了嵌入式恶意软件的风险,发现了一条名为
Win32.Infostealer.Heuristics
的标记,扫描出来一个Windows可执行文件。
- 通过静态分析后发现,该文件在nodejs_net_server的多个版本出现。
- 该实验室的系统有一条规则:“由单个字母和扩展名组成的文件触发额外的检查“。
- 该exe文件直接包含在包中,名称为
a.exe
,路径为package/lib/a.exe
- 这次发现的这个
a.exe
是一个名为ChromePass的工具,用来恢复存储在chrome中的密码。
单独这个软件只是一个恢复密码的工具,但是可能会被恶意使用。这个软件有图形界面,也可以用命令行运行
- 该包已经发布12个月,从2019年2月发布,总共被下载了1283次。
- 初始的版本nodejs_net_server-1.0.0中测试发包过程,在 1.0.1版本中定义了一个远程shell的服务。在lib/test.js中,定义了socket服务
- 在后续的1.1.1 和1.1.2 版本中这个脚本被修改为运行teamviewer。
- 作者在测试的时候不小心将自己的chrome passord 给泄漏出来了,在分析这个包的时候,这个用户名密码依然可以登录到这个作者网站的后台中去(已通知作者更改)
- 该txt中共泄漏282个作者计算机上的Chrome密码:
- 其中包含国内开发者常用的各类网站,包括CSDN、Oracle、华为云、阿里云、腾讯云、百度、GitHub、gitee、微信开发平台、自建Jenkin服务等的账号密码。
- 由于开发者的身份,作者参与开发的一些正在运行的网站用户密码也遭到泄漏。
- 还有一些其他作者常用网站的密码也遭到泄漏,例如开放在公网的公司oa系统(包含大量作者个人信息,真实姓名、身份证号等)
- 凡是没有开启强认证的网站,均可凭借用户名密码直接登陆。
![](421628167969_.pic.jpg)
![](401628167903_.pic.jpg)
![](391628167859_.pic.jpg)
package.json中的bin字段
- 在package.json文件中定义了一个bin字段,该字段的主要作用是将可执行文件链接到环境变量中,可以方便的在npm执行脚本时,直接使用定义的名字作为命令。
- 如果是全局安装,npm将会使用符号链接把这些文件链接到
/usr/local/bin/
- 如果是本地安装,会链接到
./node_modules/.bin/
- 例如 这个项目如果使用了
-g
全局安装的话, 就可以直接在命令行下运行jstest,就会直接使用node来运行这个项目./bin/jstest
下的js脚本文件。
- 如果在一个环境中同时安装了两个包都定义了相同的
bin字段命令
,那么后安装的包会将前一个包中设置的符号链接给覆盖。这也变相的达到了一个劫持的目的。正好node中就有一个名为jstest
的包(最后一次更新在7年前)也同样定义了一个jstest
字段。
3. 攻击手段分析
- 通过分析该包中的代码,我们可以知道,代码中的功能可以开启一个socket套字节,完成ip端口的配置、开启windows 服务、对文件的操作、文件上传、shell命令执行等
- 然后再依靠包含在包内的ffmpeg可执行文件,可以实现屏幕和摄像头的录制。
- 除此之外,在历史各个版本中,虽然有下载chromepass这个可执行程序的代码,但是并没有代码执行密码窃取的操作代码,作者误操作上传的密码txt也是自己在本地执行得到的。
- 综上,按照目前发布的版本来说,该包还没有完整的攻击手段和流程,只是有一些敏感的对计算机远程控制的功能和运行程序的功能。
4. 分析结论
- 如果作为一个恶意包来说,这个包还未完全开发完成,许多功能都未完善,包中许多运行路径都是作者本地计算机中的绝对路径,换一台计算机完全运行不了。
- 至于bin字段中的jstest劫持。只有在同时安装了
jstest
包和nodejs_net_server
包在同一个node_modules
中又或者同时进行了全局安装,才有被劫持的可能。
- 作者在开发的过程中泄漏了很多个人信息。包括电脑路径、大量password、电话、姓名、以及个人网站的地址。通过这些信息我联系到了作者本人,并进行了确定,npmjs账号未被盗取,所有版本是自己发布,个人测试使用。并无恶意用途。而且从现有发布的版本来看,并无成熟的攻击行为。作者自己也在readme中说明了测试的意图
- 经作者解释,
jstest
字段的命名完全是巧合,也未曾想到会覆盖其他包的执行命令,从而引发恶意行为。
5. 检测和分析的方法
- 针对这样的包,我们如何规定恶意行为去检测很重要,像类似的开启本地服务、文件操作,socket操作都是很多node包中必备的功能,我想我们真的需要检测的是 一个包是否有利用这些功能进行了恶意操作。
- 该实验室的这次发现也是从包中包含了a.exe这个Chromepass可执行文件监测到的。文中提到了他们所使用的一种新方法为可解释机器学习模型检测恶意软件,看了文章我理解为对可执行文件的静态分析,只不过引入了机器学习的方法,将 从恶意样本库中匹配程序特征的 这一过程进行了优化。