ืืืงืจืื ืืืจืื ืืืืืืืฅ ืืืืืืช ืืืืข (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