【发布时间】:2016-06-06 03:45:10
【问题描述】:
我希望客户端能够发送将在服务器上运行的脚本。管理员会在运行之前查看脚本,但如果没有发现漏洞,我想防止灾难发生。
客户端应该只能使用 API 定义的功能。我的策略是创建使用vm 来创建一个只能访问api 的新上下文。
var vm = require('vm');
var v = 0; //incremetable via API
var api = {
incr:function(){
v++;
}
}
var userCode =
`(function(api){
api.incr();
process.exit(); //ERROR: process is undefined
})`;
vm.runInNewContext(userCode)(api);
console.log(v);
理论上,它看起来不错。但是,事实证明您仍然可以通过
使服务器崩溃api.incr.constructor("return this")().process.exit(1)
如何在不损害服务器的情况下提供 API(也就是脚本更改主上下文的能力)?
浏览器中类似于iframe 的东西。
【问题讨论】:
-
将所有函数绑定到 var
api的 this 上 -
由于 JavaScript 的性质,这是一项非常复杂的任务。我相信这是可以做到的,但你必须非常小心,避免跨 VM 泄漏对象,而且我从未见过其他人安全地实现这一点。其他类型的攻击也是可能的,比如消耗所有内存。
标签: javascript node.js virtual-machine