Я хочу, чтобы клиенты могли отправлять сценарии, которые будут выполняться на сервере. Сценарии будут рассмотрены администраторами до запуска, но я хочу предотвратить катастрофы, если эксплоит не будет обнаружен.Запуск кода клиента на Nodejs в песочнице
Клиент должен использовать только функции, определенные 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' – MayorMonty
Это очень сложная задача из-за характера JavaScript. Я считаю, что это можно сделать, но вы должны быть очень осторожны, чтобы избежать утечки объектов cross-VM, и я никогда не видел, чтобы кто-то еще реализовал это безопасно. Другие виды атак также по-прежнему возможны, как и потребление всей памяти. –