NodeJS VM2 沙盒绕过漏洞学习
前言
无。
环境搭建
下载安装NodeJS,新建一个目录并运行命令npm init后下载依赖:
1 |
|
npm提示说该版本的vm2存在高危安全漏洞,但是坚持安装。
vm2
NodeJS沙盒,vm沙盒的优化版本,简单用法如下:
1 |
|
运行一下,看到此时的this作用域为vm环境下的特殊作用域。
可以在本目录的node_modules文件夹下找到vm2的代码,比如main.js中可以找到VMScript的构造函数:
1 |
|
只是简单地把待运行代码保存起来。
也可以找到VM的构造函数:
1 |
|
根据参考文章,这里将一些沙盒中需要的对象放入host中,创建了沙盒作用域并调用vm的API将contextify.js封装成了一个匿名函数,contextify.js涉及到一些对象代理之类的东西。可以看到global下只挂载了VMError和Buffer两个对象:
1 |
|
readonly一直找到Contextify.object,可以看到Buffer实际上是一个代理对象Proxy:
1 |
|
该代理对象拦截了get、set、construct等等操作,所以这个Buffer对象虽然是从外面传入沙盒的,但是也无法访问其constructor等属性,从而保证了沙盒安全性。
CVE-2019-10761
基于调用栈过大爆栈捕获外部对象。
CVE-2021-23449
基于import未经沙箱,
trick
基于对象代理和异常捕获。
参考
NodeJS VM2 沙盒绕过漏洞学习
http://yoursite.com/2023/02/02/NodeJS-VM2-沙盒绕过漏洞学习/