Как понять следующий код для выхода из песочницы vm2 в node.js - PullRequest
1 голос
/ 28 мая 2020
• 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?

1 Ответ

0 голосов
/ 08 июля 2020

Если вы прочитаете исправление https://github.com/patriksimek/vm2/commit/23576ad235b522d70f7acc2aae11ed36d3cf3aac, вы обнаружите, что Object.prototype не был должным образом контекстно .

Во втором фрагменте кода вы не ставьте под угрозу геттер / сеттер, чтобы внедрить функцию, которая будет запущена на хосте.

В основном, прокси был неполным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...