Impetum in Node.js per manipulationem JavaScript obiecto prototypo

Investigatores ab Helmholtz Centrum pro Notitia Securitatis (CISPA) et Institutum Regium Technologiae (Sueciae) enucleaverunt applicabilitatem prototypi pollutionis JavaScript ars ad impetus creandi in suggestu Node.js et applicationes populares in eo fundatae, ad supplicium ducens ad codicem.

Prototypus methodi polluendi utitur notam JavaScript linguarum quae novas proprietates radici prototypo alicuius obiecti addere sinit. Applicationes continere possunt codicem stipites (gadgets) quorum operatio substituta proprietatis afficitur, exempli gratia, codicem continere potest constructio sicut 'const cmd = optiones.cmd || '/bin/sh', cuius logica mutabitur si oppugnator possessionem in radice prototypo "cmd" substituere procurat.

Prosperitas impetus postulat ut applicatio notitiarum externarum uti possit ad novam proprietatem in radice obiecti prototypo creandam, et quod exsecutio incidit in gadeum quod a proprietate mutationis pendet. Prototypum mutans efficitur processus "__proto__" et "constructor" servitii proprietatum in Node.js. Proprietas "__proto__" prototypum refert ordinis obiecti, et proprietas "constructor" reddit usum ad rem creandam.

Si codice applicationis assignationem "ob[a][b] = valorem" contineat et valores ab extraneis datas positi sunt, oppugnator "a" valorem "__proto__" constituere potest et institutionem rerum suarum consequi. nomine "b" et valor "pretii" in radice prototypo obiecti (obj. __ proto__.b = valor;), et proprietas in prototypo posita in omnibus obiectis apparebit. Similiter, si signum expressiones sicut "obj[a][b][c] = valorem" contineat, ponendo valorem "a" ad "constructorem", et "b" ad "prototypum" in rebus omnibus exsistentibus, potes. novam proprietatem nomine "c" et valore "valoris" definire.

Exemplum mutandi prototypum: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // proprietas creare "x" in radice prototypo console.log (o2.x); accessus proprietatis "x" ab alio obiecto output erit 42, cum radix prototypum per obiectum o1 mutatum sit, quod etiam in obiecto o2 adhibetur.

Exemplum de codice vulnerable: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; remittere p; }

Si viscus functionis argumenta ex input data formantur, oppugnator tunc valorem "__proto__" transire potest ad arg1 et proprietatem cuiuslibet nominis in radice prototypo creare. Si arg2 transis valorem "toString" et arg3 valorem 1, definire potes proprietatem "toString" (Object.prototype.toString=1) et fragore applicationis inter vocationem ad toString().

Exempla condicionum quae ad oppugnatorem codicis exsecutionem adducere possent, includunt creationem "main", "crusta", "exportationes", "contextus extensiones" et "env" proprietates. Exempli gratia, oppugnator proprietas "praecipua" in radice prototypo rei creare potest, in ea scribens viam suae scriptionis (Object. prototyp.main = "./../../pwned.js") et haec proprietas tempore executionis in codice constructi requiretur ("my-sarcina"), si sarcina inclusa expresse "main" possessionem in package.json (si res non definita sit, non definit". ex radice prototypo obtinebitur). Proprietates "crusta", exportationes et "env" similiter substitui possunt: ​​sit rootProto = Object. Prototypus; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/iter/ad/npm/scripts/"; // trigger call require("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "node"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "β€”inspect-brk=0.0.0.0:1337"; // felis vocationem require("bytes");

Inquisitores 10 NPM fasciculos cum maxima dependentiarum numero enuclearunt, et invenerunt 1958 ex eis non habere proprietatem principalem in sarcina.json, 4420 in viis relativis in suis declarationibus requirentibus, et 355 directo mandato substitutionis utuntur API.

Exemplum operans est facinus ad oppugnandum Parse Servo backend qui aestimationes possessionum vincit. Ad simpliciorem identitatem talium vulnerabilium, instrumentum enucleatum est ut modos analysin static et dynamicas componat. Per probationem Node.js, 11 gadgets notae sunt quae adhiberi possunt ad ordinandos impetus qui ducunt ad exsecutionem codicis oppugnatoris. Praeter Parse Servo, duo passibilia vulnerabilia in NPM CLI notata sunt.

Source: opennet.ru