JavaScript рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдЪреНрдпрд╛ рд╣рд╛рддрд╛рд│рдгреАрджреНрд╡рд╛рд░реЗ Node.js рд╡рд░ рд╣рд▓реНрд▓рд╛

Helmholtz Centre for Information Security (CISPA) рдЖрдгрд┐ рд░реЙрдпрд▓ рдЗрдиреНрд╕реНрдЯрд┐рдЯреНрдпреВрдЯ рдСрдл рдЯреЗрдХреНрдиреЙрд▓реЙрдЬреА (рд╕реНрд╡реАрдбрди) рдЪреНрдпрд╛ рд╕рдВрд╢реЛрдзрдХрд╛рдВрдиреА Node.js рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд▓реЛрдХрдкреНрд░рд┐рдп рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╡рд░ рд╣рд▓реНрд▓реЗ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА JavaScript рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░рджреВрд╖рдг рддрдВрддреНрд░рд╛рдЪреНрдпрд╛ рдЙрдкрдпреБрдХреНрддрддреЗрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд▓реЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдХреЛрдбрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЭрд╛рд▓реА.

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░рджреБрд╖рдг рдкрджреНрдзрдд JavaScript рднрд╛рд╖реЗрдЪреЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рд╡рд╛рдкрд░рддреЗ рдЬреА рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рдореВрд│ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдордзреНрдпреЗ рдирд╡реАрди рдЧреБрдгрдзрд░реНрдо рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рдордзреНрдпреЗ рдХреЛрдб рдмреНрд▓реЙрдХреНрд╕ (рдЧреЕрдЭреЗрдЯреНрд╕) рдЕрд╕реВ рд╢рдХрддрд╛рдд рдЬреНрдпрд╛рдВрдЪреЗ рдСрдкрд░реЗрд╢рди рдмрджрд▓рд▓реЗрд▓реНрдпрд╛ рдорд╛рд▓рдорддреНрддреЗрдореБрд│реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдЭрд╛рд▓реЗ рдЖрд╣реЗ; рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреЛрдбрдордзреНрдпреЗ 'const cmd = options.cmd || рд╕рд╛рд░рдЦреА рд░рдЪрдирд╛ рдЕрд╕реВ рд╢рдХрддреЗ. "/bin/sh"', рдЬрд░ рдЖрдХреНрд░рдордгрдХрд░реНрддреНрдпрд╛рдиреЗ рд░реВрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдордзреНрдпреЗ "cmd" рдЧреБрдгрдзрд░реНрдо рдмрджрд▓рдгреНрдпрд╛рд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рддрд░ рддреНрдпрд╛рддреАрд▓ рддрд░реНрдХ рдмрджрд▓рд▓рд╛ рдЬрд╛рдИрд▓.

рдпрд╢рд╕реНрд╡реА рд╣рд▓реНрд▓реНрдпрд╛рд╕рд╛рдареА рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рд░реВрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдордзреНрдпреЗ рдирд╡реАрди рдЧреБрдгрдзрд░реНрдо рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд╛рд╣реНрдп рдбреЗрдЯрд╛ рд╡рд╛рдкрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдордзреНрдпреЗ рд╕реБрдзрд╛рд░рд┐рдд рдорд╛рд▓рдорддреНрддреЗрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЧреЕрдЭреЗрдЯрдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ. рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрджрд▓рдгреЗ Node.js рдордзреАрд▓ тАЬ__proto__тАЭ рдЖрдгрд┐ тАЬconstructorтАЭ рд╕реЗрд╡рд╛ рдЧреБрдгрдзрд░реНрдорд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реВрди рдкреВрд░реНрдг рдХреЗрд▓реЗ рдЬрд╛рддреЗ. "__рдкреНрд░реЛрдЯреЛ__" рдЧреБрдгрдзрд░реНрдо рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рд╡рд░реНрдЧрд╛рдЪрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рджреЗрддреЛ рдЖрдгрд┐ "рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░" рдЧреБрдгрдзрд░реНрдо рдСрдмреНрдЬреЗрдХреНрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдлрдВрдХреНрд╢рди рдкрд░рдд рдХрд░рддреЗ.

рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдбрдордзреНрдпреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ "obj[a][b] = value" рдЕрд╕рд▓реНрдпрд╛рд╕ рдЖрдгрд┐ рдореВрд▓реНрдпреЗ рдмрд╛рд╣реНрдп рдбреЗрдЯрд╛рд╡рд░реВрди рд╕реЗрдЯ рдХреЗрд▓реА рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдХреНрд░рдордгрдХрд░реНрддрд╛ "__proto__" рдореВрд▓реНрдпрд╛рд╡рд░ "a" рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдорд╛рд▓рдорддреНрддреЗрдЪреА рд╕реНрдерд╛рдкрдирд╛ рд╕рд╛рдзреНрдп рдХрд░реВ рд╢рдХрддреЛ рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рд░реВрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдордзреНрдпреЗ тАЬbтАЭ рдЖрдгрд┐ рд╡реНрд╣реЕрд▓реНрдпреВ тАЬvalueтАЭ рд╕рд╣ (obj.__proto__.b = value;), рдЖрдгрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдордзреНрдпреЗ рд╕реЗрдЯ рдХреЗрд▓реЗрд▓реА рдкреНрд░реЙрдкрд░реНрдЯреА рд╕рд░реНрд╡ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдордзреНрдпреЗ рджреГрд╢реНрдпрдорд╛рди рдЕрд╕реЗрд▓. рддреНрдпрд╛рдЪрдкреНрд░рдорд╛рдгреЗ, рдЬрд░ рдХреЛрдбрдордзреНрдпреЗ тАЬobj[a][b][c] = valueтАЭ рд╕рд╛рд░рдЦреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдЕрд╕рддреАрд▓ рддрд░, тАЬрдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░тАЭ рд╡реНрд╣реЕрд▓реНрдпреВрд╡рд░ тАЬaтАЭ рд╕реЗрдЯ рдХрд░реВрди рдЖрдгрд┐ тАЬbтАЭ рд▓рд╛ тАЬрдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдктАЭ рд╡рд░ рд╕реЗрдЯ рдХрд░реВрди, рддреБрдореНрд╣реА рд╕рд░реНрд╡ рд╡рд┐рджреНрдпрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдордзреНрдпреЗ "c" рдирд╛рд╡рд╛рд╕рд╣ рдЖрдгрд┐ "рдореВрд▓реНрдп" рдореВрд▓реНрдпрд╛рд╕рд╣ рдирд╡реАрди рдЧреБрдгрдзрд░реНрдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рд╛.

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрджрд▓рдгреНрдпрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг: const o1 = {}; const o2 = рдирд╡реАрди рдСрдмреНрдЬреЗрдХреНрдЯ(); o1.__proto__.x = 42; // рд░реВрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк console.log (o2.x) рдордзреНрдпреЗ рдЧреБрдгрдзрд░реНрдо тАЬxтАЭ рддрдпрд╛рд░ рдХрд░рд╛; // рджреБрд╕рд░реНтАНрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрдордзреВрди "x" рдНрдХреНрд╕реЗрд╕ рдкреНрд░реЙрдкрд░реНрдЯреА // рдЖрдЙрдЯрдкреБрдЯ 42 рдЕрд╕реЗрд▓, рдХрд╛рд░рдг рд░реВрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ o1 рджреНрд╡рд╛рд░реЗ рдмрджрд▓рд▓рд╛ рд╣реЛрддрд╛, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ o2 рдордзреНрдпреЗ рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ.

рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдбрдЪреЗ рдЙрджрд╛рд╣рд░рдг: рдлрдВрдХреНрд╢рди рдПрдВрдЯреНрд░реАрдкреЙрдЗрдВрдЯ (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; рдкрд░рдд p; }

рдЬрд░ рдПрдВрдЯреНрд░реАрдкреЙрдИрдВрдЯ рдлрдВрдХреНрд╢рди рдЖрд░реНрдЧреНрдпреБрдореЗрдВрдЯреНрд╕ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛рдордзреВрди рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЕрд╕рддреАрд▓, рддрд░ рдЖрдХреНрд░рдордгрдХрд░реНрддрд╛ "__рдкреНрд░реЛрдЯреЛ__" рдореВрд▓реНрдп arg1 рд▓рд╛ рдкрд╛рд╕ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рд░реВрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдордзреНрдпреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рдирд╛рд╡рд╛рд╕рд╣ рдЧреБрдгрдзрд░реНрдо рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ. рддреБрдореНрд╣реА "toString" рдореВрд▓реНрдп arg2 рдЖрдгрд┐ рдореВрд▓реНрдп 3 arg1 рдкрд╛рд╕ рдХреЗрд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА "toString" рдЧреБрдгрдзрд░реНрдо (Object.prototype.toString=1) рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ toString() рд╡рд░ рдХреЙрд▓ рдХрд░рддрд╛рдирд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреНрд░реЕрд╢ рдХрд░реВ рд╢рдХрддрд╛.

рдЖрдХреНрд░рдордгрдХрд░реНрддрд╛ рдХреЛрдбрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╣реЛрдК рд╢рдХрддреЗ рдЕрд╢рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ "рдореБрдЦреНрдп", "рд╢реЗрд▓", "рдирд┐рд░реНрдпрд╛рдд", "рд╕рдВрджрд░реНрднрд╡рд┐рд╕реНрддрд╛рд░" рдЖрдгрд┐ "рдПрдирд╡реНрд╣реА" рдЧреБрдгрдзрд░реНрдорд╛рдВрдЪреА рдирд┐рд░реНрдорд┐рддреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдХреНрд░рдордгрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рд░реВрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдордзреНрдпреЗ "рдореБрдЦреНрдп" рдЧреБрдгрдзрд░реНрдо рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ, рддреНрдпрд╛рдд рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪрд╛ рдорд╛рд░реНрдЧ рд▓рд┐рд╣реВ рд╢рдХрддреЛ (Object.prototype.main = тАЬ./../../pwned.jsтАЭ) рдЖрдгрд┐ рдЬрд░ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдкреЕрдХреЗрдЬ рдкреЕрдХреЗрдЬ.json рдордзреАрд▓ "рдореБрдЦреНрдп" рдЧреБрдгрдзрд░реНрдо рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдд рдирд╕реЗрд▓ (рдЬрд░ рдорд╛рд▓рдорддреНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реА рдирд╕реЗрд▓, рддреЗ рд░реВрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдордзреВрди рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓). тАЬрд╢реЗрд▓тАЭ, тАЬрдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕тАЭ рдЖрдгрд┐ тАЬрдПрдирд╡реНрд╣реАтАЭ рдЧреБрдгрдзрд░реНрдо рдЕрд╢рд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рдмрджрд▓рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд: рд░реВрдЯрдкреНрд░реЛрдЯреЛ = рдСрдмреНрдЬреЗрдХреНрдЯ.рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рджреНрдпрд╛; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // рдЯреНрд░рд┐рдЧрд░ рдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХ (."/target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "рдиреЛрдб"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "-inspect-brk=0.0.0.0:1337"; // рдЯреНрд░рд┐рдЧрд░ рдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХ ("рдмрд╛рдЗрдЯреНрд╕");

рд╕рдВрд╢реЛрдзрдХрд╛рдВрдиреА рд╕рд░реНрд╡рд╛рдзрд┐рдХ рдЕрд╡рд▓рдВрдмрдирд╛рдВрд╕рд╣ 10 NPM рдкреЕрдХреЗрдЬрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд▓реЗ рдЖрдгрд┐ рдЕрд╕реЗ рдЖрдврд│рд▓реЗ рдХреА рддреНрдпрд╛рдкреИрдХреА 1958 рдЪреА рдкреЕрдХреЗрдЬ.json рдордзреНрдпреЗ рдореБрдЦреНрдп рдорд╛рд▓рдорддреНрддрд╛ рдирд╛рд╣реА, 4420 рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд╛рдирд╛рдВрдордзреНрдпреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдорд╛рд░реНрдЧ рд╡рд╛рдкрд░рддрд╛рдд рдЖрдгрд┐ 355 рдереЗрдЯ рдХрдорд╛рдВрдб рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди API рд╡рд╛рдкрд░рддрд╛рдд.

рдХрд╛рд░реНрдпрд░рдд рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгрдЬреЗ рдкрд╛рд░реНрд╕ рд╕рд░реНрд╡реНрд╣рд░ рдмреЕрдХрдПрдВрдбрд╡рд░ рд╣рд▓реНрд▓рд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╢реЛрд╖рдг рдЬреЗ evalFunctions рдЧреБрдгрдзрд░реНрдо рдЕрдзрд┐рд▓рд┐рдЦрд┐рдд рдХрд░рддреЗ. рдЕрд╢рд╛ рднреЗрджреНрдпрддрд╛ рдУрд│рдЦрдгреЗ рд╕реЛрдкреЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдПрдХ рдЯреВрд▓рдХрд┐рдЯ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ рдЬреЗ рд╕реНрдерд┐рд░ рдЖрдгрд┐ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрджреНрдзрддреА рдПрдХрддреНрд░ рдХрд░рддреЗ. Node.js рдЪреНрдпрд╛ рдЪрд╛рдЪрдгреА рджрд░рдореНрдпрд╛рди, 11 рдЧреЕрдЭреЗрдЯ рдУрд│рдЦрд▓реЗ рдЧреЗрд▓реЗ рдЬреЗ рд╣рд▓реНрд▓реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд рдЬреНрдпрд╛рдореБрд│реЗ рдЖрдХреНрд░рдордгрдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдХреЛрдбрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╣реЛрддреЗ. рдкрд╛рд░реНрд╕ рд╕рд░реНрд╡реНрд╣рд░ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рджреЛрди рд╢реЛрд╖рдХ рдЕрд╕реБрд░рдХреНрд╖рд╛ рджреЗрдЦреАрд▓ NPM CLI рдордзреНрдпреЗ рдУрд│рдЦрд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛.

рд╕реНрддреНрд░реЛрдд: opennet.ru

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛