рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЯрд╛рдЗрдо рдЖрдЙрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
const {VM} = require('vm2');
new VM({timeout:1}).run(`
function main(){
while(1){}
}
new Proxy({}, {
getPrototypeOf(t){
global.main();
}
})`);
рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред NodeJS рдПрдХрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЬрдмрдХрд┐(1){} рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдЪреЗрдХрд░ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рди рд╣реЛ рдЬрд╛рдП(1){}ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рд╕реНрдкрд╛рдЗрдбрд░рдиреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВ тАж
рдпрд╣ Decontextify.value
рдХреЗ рд╕рд╛рде рдЕрддрд┐рдерд┐ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ instanceOf
ред Node.js vm
рдореЙрдбреНрдпреВрд▓ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдкреНрд░рддрд┐рд░рдХреНрд╖рд┐рдд рд╣реИред рдПрдХ рдЧрд░реАрдм рдЖрджрдореА рдХрд╛ рдкреИрдЪ рдкрд┐рдЫрд▓реЗ рджрд░рд╡рд╛рдЬреЗ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Proxy
рддрд╛рдХрд┐ рд╣рдо рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЖрджрд░реНрд╢ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХрднреА рднреА рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдлрдВрдХреНрд╢рди рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВред рдЕрддрд┐рдерд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд░ рдФрд░ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд┐рдо рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рд▓реЛрдЧреЛрдВ рдХреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрдЪреНрдЪреЗ рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд░рд▓реЗрд╕ рдЪрд╛рдЗрд▓реНрдб-рдкреНрд░реЛрд╕реЗрд╕ рдФрд░ рдореИрд╕реЗрдЬ-рдкрд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕реЗрдЯрдЕрдк рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк while(1){}
рд╣рдорд▓реЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдпрд╣рд╛рдБ рд╣реИ ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ
рдУрдПрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ред рдЕрдиреНрдпрдерд╛ рдХрдИ рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЬреЛ рдмрд╣реБрдд рд╣реИрдВ
рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рддред
рдЕрдиреНрдпрдерд╛ рдРрд╕реЗ рдХрдИ рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЬреЛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред
рдЬреЛ рд▓реЛрдЧ? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ NodeJS рдореЗрдВ VM2 рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ
рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдиреБрд░рдХреНрд╖рдХ рдиреЗ рдЕрдВрдХ #80 рдореЗрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛:
https://github.com/laverdet/isolated-vm
рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЦреБрдж рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИред
рдореИрдВ рдХреЗрд╡рд▓ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рдЗрд╕реЗ рдореБрдЦреНрдп V8 рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рд┐рдВрдЧрд▓ рдереНрд░реЗрдбреЗрдб рд╣реИред
V8 рдЗрдВрдЬрди рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдЖрдпрд╛рдд рдореЙрдбреНрдпреВрд▓ рдХреА рдХрдореА рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ HTTP рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореБрдЭреЗ vm2 + child_process рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдпреЛрдЬрди рд▓рдЧрддрд╛ рд╣реИред
рдЕрд░реЗ,
рдореИрдВрдиреЗ рдФрд░ @рд╣рд░реЗрд▓рдореЛ рдиреЗ while(1) {}
рд╕реЗ рдкреНрд░рддрд┐рд░рдХреНрд╖рд┐рдд рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рддрд┐рдпрд╛рди-рдорд╛ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рдиреЛрдб.рдЬреЗрдПрд╕ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: https://www.npmjs.com/package/isolated-runtime рдФрд░ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ :)
рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рднреАрддрд░ рд╕рд┐рд░реНрдл Proxy
рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рд╣реИ рдирд╛?
const vm = new VM({
sandbox: {
Proxy: undefined
},
timeout: 100
});
Promise рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдХрднреА рд╕рдорд╛рдкреНрдд рди рд╣реЛ:
"use strict";
const {VM} = require('vm2');
const untrusted = '(' + function(){
Promise.resolve().then(a=>{
while(1){}
});
}+')()';
try{
console.log(new VM({timeout:10}).run(untrusted));
}catch(x){
console.log(x);
}
рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ .рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдЯрд╛рд╕реНрдХ рдХрддрд╛рд░ рдореЗрдВ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд░реЗрдЧрд╛ред
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ Promise.then рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ Promise рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
const {VM} = require('vm2');
const script = '(' + function() {
(async function x(){
await {then: y=>y()};
while(1){}
})();
}+')()';
new VM({timeout:10}).run(script);
рддреЛ рд╕рд┐рд░реНрдл рдкреНрд░реЙрдорд┐рд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред
рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред
рдЬрдмрдХрд┐ рдпрд╣ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИ, рд╣рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП README рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рднреЗрджреНрдпрддрд╛ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рджреЗрддреА рд╣реИред
рд░реАрдбрдореА https://github.com/patriksimek/vm2/commit/77f5265ab53b87864a312156ee62b1082787e9b0#diff -04c6e90faac2675aa89e2176d2eec7d8 рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдХреЗрд╡рд▓ рдЙрд╕ рдЗрдЪреНрдЫрд┐рдд рд╕рдордп рд╕реАрдорд╛ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рдиреА рдЪрд╛рд╣рд┐рдПред
рд╢рд╛рдпрдж рдпрд╣ рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ рдореБрджреНрджрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди NodeVM "рдЯрд╛рдЗрдордЖрдЙрдЯ" рдХрд╛ рд╕рдорд░реНрдерди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?
@crowder NodeVM рдореЗрдВ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ, рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдФрд░ рд╕реЗрдЯрдЗрдореАрдбрд┐рдПрдЯ рдореМрдЬреВрдж рд╣реИ, рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдХрд╛рд░рдг рднреА рд╣реЛрдВ, рд▓реЗрдХрд┐рди рдореИрдВ NodeVM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛, рдХреЗрд╡рд▓ VMред
@XmiliaH рдХрдо рд╕реЗ рдХрдо рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЕрдирдВрдд рд▓реВрдк рд╕реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?
рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЬрдмрдХрд┐ (рд╕рддреНрдп) + рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдВрдпреЛрдЬрди рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЧрд▓рддреА рд╕реЗ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╕рд╛рдзрд╛рд░рдг рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЕрдирдВрдд рд▓реВрдк рдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ NodeVM рдХреЛ рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣реЛрд╕реНрдЯ рдореЙрдбреНрдпреВрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреЗ рд╕рдордп рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ NodeVM рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗрд╡рд▓ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдбрд┐рдВрдЧ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛, рди рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкрд░ред
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
function doWithTimeout(fn, timeout) {
let ctx = CACHE.timeoutContext;
let script = CACHE.timeoutScript;
if (!ctx) {
CACHE.timeoutContext = ctx = vm.createContext();
CACHE.timeoutScript = script = new vm.Script('fn()', {
filename: 'timeout_bridge.js',
displayErrors: false
});
}
ctx.fn = fn;
try {
return script.runInContext(ctx, {
displayErrors: false,
timeout
});
} finally {
ctx.fn = null;
}
}
рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ @XmiliaH рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг vm рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рди рдХрд┐ vm2 рдХрд╛
vm2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рднреА рдЗрд╕реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
@szydan рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб