Pag-atake sa Node.js pinaagi sa Manipulating JavaScript Object Prototypes

Ang mga tigdukiduki sa Helmholtz Center for Information Security (CISPA) ug sa Royal Institute of Technology (Sweden) nag-analisar sa pagkaaplikar sa JavaScript prototype object contamination technique (“prototype pollution”) aron makahimo og mga pag-atake sa Node.js nga plataporma ug popular nga mga aplikasyon base sa kini, nga mosangpot sa pagpatuman sa code.

Ang prototype polluting nga pamaagi naggamit ug feature sa JavaScript nga pinulongan nga nagtugot kanimo sa pagdugang og bag-ong mga kabtangan sa root prototype sa bisan unsang butang. Sa mga aplikasyon, mahimo nga adunay mga bloke sa code (mga gadget) kansang trabaho apektado sa usa ka gipuli nga kabtangan, pananglitan, sa code mahimong adunay usa ka pagtukod sama sa 'const cmd = options.cmd || "/bin/sh"', ang lohika niini mausab kung ang tig-atake makahimo sa pag-ilis sa "cmd" nga kabtangan sa root prototype.

Ang usa ka malampuson nga pag-atake nanginahanglan nga ang aplikasyon makagamit sa input gikan sa gawas aron makahimo usa ka bag-ong kabtangan sa prototype sa gamut sa butang, ug nga ang usa ka gadget nga nagdepende sa nabag-o nga kabtangan makit-an sa panahon sa pagpatuman. Ang pagbag-o sa prototype gihimo sa Node.js nga nagdumala sa "__proto__" ug "constructor" nga mga kabtangan sa utility. Ang "__proto__" nga kabtangan nagbalik sa klase nga prototype sa butang, ug ang "nagtutukod" nga kabtangan nagbalik sa function nga gigamit sa paghimo sa butang.

Kung ang code sa aplikasyon makit-an ang buluhaton nga "obj [a][b] = bili" ug ang mga kantidad gitakda gikan sa gawas nga datos, ang tig-atake mahimong magbutang "a" sa kantidad nga "__proto__" ug makab-ot ang setting sa iyang kabtangan nga adunay ang ngalan nga "b" ug ang bili nga "value" sa root prototype sa butang (obj.__proto__.b = value;), samtang ang property set sa prototype makita sa tanang butang. Sa susama, kung sa code adunay mga ekspresyon sama sa "obj[a][b][c] = value", pinaagi sa pagbutang sa "a" sa bili nga "constructor", ug "b" ngadto sa "prototype" sa tanang anaa nga mga butang, mahimo nimong ipasabut ang usa ka bag-ong kabtangan nga adunay ngalan nga "c" ug ang kantidad nga "bili".

Usa ka pananglitan sa pagbag-o sa prototype: const o1 = {}; const o2 = bag-ong butang(); o1.__proto__.x = 42; // paghimo sa "x" kabtangan sa gamut prototype console.log(o2.x); // i-refer ang property nga "x" gikan sa laing butang // makuha nato ang 42 sa output, tungod kay ang root prototype giusab pinaagi sa o1 nga butang, nga gigamit usab sa o2 nga butang

Mabulnerable nga code nga pananglitan: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; balik p; }

Kung ang mga argumento sa entryPoint function naporma gikan sa input data, nan ang tig-atake mahimong mopasa sa kantidad nga "__proto__" ngadto sa arg1 ug maghimo ug kabtangan nga adunay bisan unsang ngalan sa root prototype. Kung imong ipasa ang kantidad nga "toString" sa arg2 ug 3 sa arg1, mahimo nimong ipasabut ang kabtangan nga "toString" (Object.prototype.toString=1) ug hinungdan nga ma-crash ang aplikasyon kung ang toString() function gitawag.

Isip usa ka pananglitan sa mga sitwasyon nga mahimong mosangpot sa pagpatuman sa attacker code, ang paghimo sa "main", "shell", "exports", "contextExtensions" ug "env" nga mga kabtangan gihatag. Pananglitan, ang usa ka tig-atake makahimo og usa ka "main" nga kabtangan sa gamut nga prototype sa butang, pagsulat sa agianan sa iyang script ngadto niini (Object.prototype.main = "./../../pwned.js") ug kini nga kabtangan tawgon sa panahon sa pagpatuman sa code sa gikinahanglan("akong-package") nga pagtukod, kung ang gilakip nga pakete dili tin-aw nga naghubit sa kabtangan nga "main" sa package.json (kon ang kabtangan wala gihubit, kini makuha gikan sa root prototype). Sa susama, ang "shell", "exports" ug "env" nga mga kabtangan mahimong ilisan: let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // trigger call nagkinahanglan ("./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"; // trigger call nagkinahanglan ("bytes");

Gi-analisar sa mga tigdukiduki ang 10 ka NPM nga mga pakete nga adunay kadaghanan nga mga dependency ug nakit-an nga ang 1958 niini wala’y panguna nga kabtangan sa package.json, 4420 naggamit mga paryente nga agianan sa kinahanglan nga pahayag, ug ang 355 direkta nga naggamit sa command substitution API.

Ang usa ka nagtrabaho nga pananglitan usa ka pagpahimulos sa pag-atake sa backend sa Parse Server nga nag-override sa kabtangan sa evalFunctions. Aron mapasayon ​​ang pag-ila sa maong mga kahuyangan, usa ka toolkit ang gihimo nga naghiusa sa mga pamaagi sa static ug dinamikong pagtuki. Atol sa pagsulay sa Node.js, 11 ka gadgets ang giila nga magamit sa pag-organisar sa mga pag-atake nga mosangpot sa pagpatuman sa code sa tig-atake. Dugang sa Parse Server, duha ka mapahimuslanon nga mga kahuyangan ang giila usab sa NPM CLI.

Source: opennet.ru

Pagpalit kasaligan nga pag-host alang sa mga site nga adunay proteksyon sa DDoS, mga server sa VPS VDS 🔥 Pagpalit og kasaligang website hosting nga adunay proteksyon sa DDoS, VPS VDS servers | ProHoster