ื”ืชืงืคื” ืขืœ Node.js ื‘ืืžืฆืขื•ืช ืžื ื™ืคื•ืœืฆื™ื” ืฉืœ ืื‘ื•ืช ื˜ื™ืคื•ืก ืฉืœ ืื•ื‘ื™ื™ืงื˜ JavaScript

ื—ื•ืงืจื™ื ืžืžืจื›ื– ื”ืœืžื”ื•ืœืฅ ืœืื‘ื˜ื—ืช ืžื™ื“ืข (CISPA) ื•ื”ืžื›ื•ืŸ ื”ืžืœื›ื•ืชื™ ืœื˜ื›ื ื•ืœื•ื’ื™ื” (ืฉื‘ื“ื™ื”) ื ื™ืชื—ื• ืืช ื”ื™ืฉื™ืžื•ืช ืฉืœ ื˜ื›ื ื™ืงืช ื”ื–ื™ื”ื•ื ืฉืœ ืื‘ ื˜ื™ืคื•ืก JavaScript ืœื™ืฆื™ืจืช ื”ืชืงืคื•ืช ืขืœ ืคืœื˜ืคื•ืจืžืช Node.js ื•ื™ื™ืฉื•ืžื™ื ืคื•ืคื•ืœืจื™ื™ื ื”ืžื‘ื•ืกืกื™ื ืขืœื™ื”, ืžื” ืฉื”ื•ื‘ื™ืœ ืœื‘ื™ืฆื•ืข ืงื•ื“.

ืฉื™ื˜ืช ื”ืื‘-ื˜ื™ืคื•ืก ื”ืžื–ื”ื ืžืฉืชืžืฉืช ื‘ืชื›ื•ื ื” ืฉืœ ืฉืคืช JavaScript ื”ืžืืคืฉืจืช ืœื”ื•ืกื™ืฃ ืžืืคื™ื™ื ื™ื ื—ื“ืฉื™ื ืœืื‘-ื˜ื™ืคื•ืก ื”ืฉื•ืจืฉ ืฉืœ ื›ืœ ืื•ื‘ื™ื™ืงื˜. ื™ื™ืฉื•ืžื™ื ืขืฉื•ื™ื™ื ืœื”ื›ื™ืœ ื‘ืœื•ืงื™ ืงื•ื“ (ื’ืื“ื’'ื˜ื™ื) ืฉื”ืคืขื•ืœื” ืฉืœื”ื ืžื•ืฉืคืขืช ืžืžืืคื™ื™ืŸ ืžื•ื—ืœืฃ; ืœื“ื•ื’ืžื”, ื”ืงื•ื“ ืขืฉื•ื™ ืœื”ื›ื™ืœ ืžื‘ื ื” ื›ืžื• 'const cmd = options.cmd || "/bin/sh"', ืฉื”ืœื•ื’ื™ืงื” ืฉืœื• ืชืฉืชื ื” ืื ื”ืชื•ืงืฃ ื™ืฆืœื™ื— ืœื”ื—ืœื™ืฃ ืืช ื”ืžืืคื™ื™ืŸ "cmd" ื‘ืื‘-ื˜ื™ืคื•ืก ื”ืฉื•ืจืฉ.

ื”ืชืงืคื” ืžื•ืฆืœื—ืช ืžื—ื™ื™ื‘ืช ืฉื”ืืคืœื™ืงืฆื™ื” ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ื ืชื•ื ื™ื ื—ื™ืฆื•ื ื™ื™ื ื›ื“ื™ ืœื™ืฆื•ืจ ืžืืคื™ื™ืŸ ื—ื“ืฉ ื‘ืื‘-ื˜ื™ืคื•ืก ื”ืฉื•ืจืฉ ืฉืœ ื”ืื•ื‘ื™ื™ืงื˜, ื•ืฉื‘ื™ืฆื•ืข ื™ืชืงืœ ื‘ื’ืื“ื’'ื˜ ืฉืชืœื•ื™ ื‘ืžืืคื™ื™ืŸ ืฉื”ืฉืชื ื”. ืฉื™ื ื•ื™ ืื‘ ื”ื˜ื™ืคื•ืก ืžืชื‘ืฆืข ืขืœ ื™ื“ื™ ืขื™ื‘ื•ื“ ืžืืคื™ื™ื ื™ ื”ืฉื™ืจื•ืช "__proto__" ื•-"constructor" ื‘-Node.js. ื”ืžืืคื™ื™ืŸ "__proto__" ืžื—ื–ื™ืจ ืืช ืื‘ ื”ื˜ื™ืคื•ืก ืฉืœ ื”ืžื—ืœืงื” ืฉืœ ื”ืื•ื‘ื™ื™ืงื˜, ื•ื”ืžืืคื™ื™ืŸ "constructor" ืžื—ื–ื™ืจ ืืช ื”ืคื•ื ืงืฆื™ื” ืฉืฉื™ืžืฉื” ืœื™ืฆื™ืจืช ื”ืื•ื‘ื™ื™ืงื˜.

ืื ืงื•ื“ ื”ืืคืœื™ืงืฆื™ื” ืžื›ื™ืœ ืืช ื”ื”ืงืฆืื” "obj[a][b] = value" ื•ื”ืขืจื›ื™ื ื ืงื‘ืขื™ื ืžื ืชื•ื ื™ื ื—ื™ืฆื•ื ื™ื™ื, ืชื•ืงืฃ ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ "a" ืœืขืจืš "__proto__" ื•ืœื”ืฉื™ื’ ื”ืชืงื ื” ืฉืœ ื ื›ืก ืžืฉืœื• ืขื ื”ืฉื "b" ื•ื”ืขืจืš "value" ื‘ืื‘ ื”ื˜ื™ืคื•ืก ื”ื‘ืกื™ืกื™ ืฉืœ ื”ืื•ื‘ื™ื™ืงื˜ (obj.__proto__.b = value;), ื•ื”ืžืืคื™ื™ืŸ ืฉื ืงื‘ืข ื‘ืื‘ ื”ื˜ื™ืคื•ืก ื™ื”ื™ื” ื’ืœื•ื™ ื‘ื›ืœ ื”ืื•ื‘ื™ื™ืงื˜ื™ื. ื‘ืื•ืคืŸ ื“ื•ืžื”, ืื ื”ืงื•ื“ ืžื›ื™ืœ ื‘ื™ื˜ื•ื™ื™ื ื›ืžื• "obj[a][b][c] = value", ืขืœ ื™ื“ื™ ื”ื’ื“ืจืช "a" ืœืขืจืš "ื‘ื ืื™" ื•-"b" ืœ"ืื‘-ื˜ื™ืคื•ืก" ื‘ื›ืœ ื”ืื•ื‘ื™ื™ืงื˜ื™ื ื”ืงื™ื™ืžื™ื, ืืชื” ื™ื›ื•ืœ ื”ื’ื“ืจ ืžืืคื™ื™ืŸ ื—ื“ืฉ ืขื ื”ืฉื "c" ื•ื”ืขืจืš "value".

ื“ื•ื’ืžื” ืœืฉื™ื ื•ื™ ืื‘ ื”ื˜ื™ืคื•ืก: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // ืฆื•ืจ ืืช ื”ืžืืคื™ื™ืŸ "x" ื‘ืื‘-ื˜ื™ืคื•ืก ื”ืฉื•ืจืฉ console.log (o2.x); // ื’ื™ืฉื” ืœืžืืคื™ื™ืŸ "x" ืžืื•ื‘ื™ื™ืงื˜ ืื—ืจ // ื”ืคืœื˜ ื™ื”ื™ื” 42, ืžื›ื™ื•ื•ืŸ ืฉืื‘ ื”ื˜ื™ืคื•ืก ื”ืฉื•ืจืฉ ืฉื•ื ื” ื‘ืืžืฆืขื•ืช ืื•ื‘ื™ื™ืงื˜ o1, ื”ืžืฉืžืฉ ื’ื ื‘ืื•ื‘ื™ื™ืงื˜ o2

ื“ื•ื’ืžื” ืœืงื•ื“ ืคื’ื™ืข: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; ื”ื—ื–ืจ p; }

ืื ื”ืืจื’ื•ืžื ื˜ื™ื ืฉืœ ืคื•ื ืงืฆื™ื™ืช entryPoint ื ื•ืฆืจื™ื ืžื ืชื•ื ื™ ืงืœื˜, ืื– ืชื•ืงืฃ ื™ื›ื•ืœ ืœื”ืขื‘ื™ืจ ืืช ื”ืขืจืš "__proto__" ืœ-arg1 ื•ืœื™ืฆื•ืจ ืžืืคื™ื™ืŸ ืขื ื›ืœ ืฉื ื‘ืื‘-ื˜ื™ืคื•ืก ื”ืฉื•ืจืฉ. ืื ืชืขื‘ื™ืจ arg2 ืืช ื”ืขืจืš "toString" ื•-arg3 ืืช ื”ืขืจืš 1, ืชื•ื›ืœ ืœื”ื’ื“ื™ืจ ืืช ื”ืžืืคื™ื™ืŸ "toString" (Object.prototype.toString=1) ื•ืœืงืจื•ืก ืืช ื”ืืคืœื™ืงืฆื™ื” ื‘ืžื”ืœืš ื”ืงืจื™ืื” ืœ-toString().

ื“ื•ื’ืžืื•ืช ืœืžืฆื‘ื™ื ืฉืขืœื•ืœื™ื ืœื”ื•ื‘ื™ืœ ืœื‘ื™ืฆื•ืข ืงื•ื“ ืชื•ืงืฃ ื›ื•ืœืœื•ืช ื™ืฆื™ืจืช ื”ืžืืคื™ื™ื ื™ื "main", "shell", "exports", "contextExtensions" ื•-"env". ืœื“ื•ื’ืžื”, ืชื•ืงืฃ ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืžืืคื™ื™ืŸ "ืจืืฉื™" ื‘ืื‘-ื˜ื™ืคื•ืก ื”ื‘ืกื™ืก ืฉืœ ืื•ื‘ื™ื™ืงื˜, ืœื›ืชื•ื‘ ื‘ื• ืืช ื”ื ืชื™ื‘ ืœืกืงืจื™ืคื˜ ืฉืœื• (Object.prototype.main = "./../../pwned.js") ื• ืžืืคื™ื™ืŸ ื–ื” ื™ื™ืงืจื ื‘ื–ืžืŸ ื”ื‘ื™ืฆื•ืข ื‘ืงื•ื“ ืฉืœ ื”-construct require("my-package"), ืื ื”ื—ื‘ื™ืœื” ื”ื›ืœื•ืœื” ืœื ืžื’ื“ื™ืจื” ื‘ืžืคื•ืจืฉ ืืช ื”ืžืืคื™ื™ืŸ "main" ื‘-package.json (ืื ื”ืžืืคื™ื™ืŸ ืื™ื ื• ืžื•ื’ื“ืจ, ื–ื” ื™ืชืงื‘ืœ ืžืื‘ ื”ื˜ื™ืคื•ืก ื”ืฉื•ืจืฉ). ื ื™ืชืŸ ืœื”ื—ืœื™ืฃ ืืช ื”ืžืืคื™ื™ื ื™ื "ืžืขื˜ืคืช", "ื™ื™ืฆื•ื" ื•-"env" ื‘ืื•ืคืŸ ื“ื•ืžื”: ืชืŸ rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // ืœื”ืคืขื™ืœ ืงืจื™ืืช require("./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"; // ื˜ืจื™ื’ืจ call require("bytes");

ื”ื—ื•ืงืจื™ื ื ื™ืชื—ื• 10 ื—ื‘ื™ืœื•ืช NPM ืขื ื”ืžืกืคืจ ื”ื’ื“ื•ืœ ื‘ื™ื•ืชืจ ืฉืœ ืชืœื•ืช ื•ืžืฆืื• ืฉืœ-1958 ืžื”ืŸ ืื™ืŸ ืžืืคื™ื™ืŸ ืจืืฉื™ ื‘-package.json, 4420 ืžืฉืชืžืฉื™ื ื‘ื ืชื™ื‘ื™ื ื™ื—ืกื™ื™ื ื‘ื”ืฆื”ืจื•ืช ื”ื“ืจื•ืฉ ืฉืœื”ื, ื•-355 ืžืฉืชืžืฉื™ื ื™ืฉื™ืจื•ืช ื‘-API ืœื”ื—ืœืคืช ื”ืคืงื•ื“ื”.

ื“ื•ื’ืžื” ืขื•ื‘ื“ืช ื”ื™ื ื ื™ืฆื•ืœ ืœืชืงื™ืคืช ื”-Parse Server ื”ืขื•ืงืฃ ืืช ื”ืžืืคื™ื™ืŸ evalFunctions. ื›ื“ื™ ืœืคืฉื˜ ืืช ื”ื–ื™ื”ื•ื™ ืฉืœ ืคื’ื™ืขื•ื™ื•ืช ื›ืืœื”, ืคื•ืชื—ื” ืขืจื›ืช ื›ืœื™ื ื”ืžืฉืœื‘ืช ืฉื™ื˜ื•ืช ื ื™ืชื•ื— ืกื˜ื˜ื™ื•ืช ื•ื“ื™ื ืžื™ื•ืช. ื‘ืžื”ืœืš ื‘ื“ื™ืงืช Node.js, ื–ื•ื”ื• 11 ื’ืื“ื’'ื˜ื™ื ืฉื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื”ื ื›ื“ื™ ืœืืจื’ืŸ ื”ืชืงืคื•ืช ืฉืžื•ื‘ื™ืœื•ืช ืœื‘ื™ืฆื•ืข ื”ืงื•ื“ ืฉืœ ื”ืชื•ืงืฃ. ื‘ื ื•ืกืฃ ืœ-Parse Server, ื–ื•ื”ื• ื’ื ืฉืชื™ ื ืงื•ื“ื•ืช ืชื•ืจืคื” ืฉื ื™ืชื ื•ืช ืœื ื™ืฆื•ืœ ื‘-NPM CLI.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”