Uzbrukums Node.js, manipulējot ar JavaScript objektu prototipiem

Pētnieki no Helmholca Informācijas drošības centra (CISPA) un Karaliskā Tehnoloģiju institūta (Zviedrija) analizēja JavaScript prototipa piesārņojuma tehnikas pielietojamību, lai radītu uzbrukumus platformai Node.js un uz tās balstītām populārām lietojumprogrammām, kas noveda pie koda izpildes.

Prototipa piesārņošanas metode izmanto JavaScript valodas līdzekli, kas ļauj jebkura objekta saknes prototipam pievienot jaunus rekvizītus. Lietojumprogrammās var būt kodu bloki (sīkrīki), kuru darbību ietekmē aizvietots rekvizīts; piemēram, kodā var būt ietverta tāda konstrukcija kā 'const cmd = options.cmd || "/bin/sh"', kuras loģika tiks mainīta, ja uzbrucējam izdosies aizstāt rekvizītu “cmd” saknes prototipā.

Veiksmīgam uzbrukumam ir nepieciešams, lai lietojumprogramma varētu izmantot ārējos datus, lai objekta saknes prototipā izveidotu jaunu rekvizītu, un izpildei jāsastopas ar sīkrīku, kas ir atkarīgs no modificētā īpašuma. Prototipa maiņa tiek veikta, apstrādājot pakalpojuma rekvizītus “__proto__” un “constructor” pakalpojumā Node.js. Rekvizīts "__proto__" atgriež objekta klases prototipu, un rekvizīts "constructor" atgriež funkciju, kas izmantota objekta izveidošanai.

Ja lietojumprogrammas kodā ir piešķīrums “obj[a][b] = vērtība” un vērtības ir iestatītas no ārējiem datiem, uzbrucējs var iestatīt “a” uz vērtību “__proto__” un panākt sava īpašuma instalēšanu. ar nosaukumu “b” un vērtību “value” objekta saknes prototipā (obj.__proto__.b = vērtība;), un prototipā iestatītā īpašība būs redzama visos objektos. Līdzīgi, ja kods satur tādas izteiksmes kā “obj[a][b][c] = vērtība”, visos esošajos objektos iestatot “a” uz “konstruktora” vērtību un “b” uz “prototipu”, varat definējiet jaunu rekvizītu ar nosaukumu "c" un vērtību "value".

Prototipa maiņas piemērs: const o1 = {}; const o2 = jauns objekts(); o1.__proto__.x = 42; // izveidot rekvizītu “x” saknes prototipā console.log (o2.x); // piekļuves rekvizīts “x” no cita objekta // izvade būs 42, jo saknes prototips tika mainīts caur objektu o1, kas tiek izmantots arī objektā o2

Ievainojamā koda piemērs: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; atgriezties p; }

Ja enterPoint funkcijas argumenti tiek veidoti no ievades datiem, tad uzbrucējs var nodot vērtību “__proto__” arg1 un izveidot rekvizītu ar jebkuru nosaukumu saknes prototipā. Ja nododat arg2 vērtību "toString" un arg3 vērtību 1, varat definēt rekvizītu "toString" (Object.prototype.toString=1) un avarēt lietojumprogrammu toString() izsaukuma laikā.

Situāciju piemēri, kas var izraisīt uzbrucēja koda izpildi, ir rekvizītu “galvenais”, “apvalks”, “eksports”, “contextExtensions” un “env” izveide. Piemēram, uzbrucējs var izveidot “galveno” rekvizītu objekta saknes prototipā, ierakstot tajā ceļu uz savu skriptu (Object.prototype.main = “./../../pwned.js”) un šis rekvizīts tiks izsaukts izpildes laikā konstrukcijas prasīt ("my-package") kodā, ja iekļautā pakotne failā package.json nepārprotami nedefinē "galveno" rekvizītu (ja rekvizīts nav definēts, tas tiks iegūts no saknes prototipa). Rekvizītus “shell”, “exports” un “env” var aizstāt līdzīgi: let rootProto = Object.prototype; rootProto["eksports"] = {".":"./changelog.js"}; rootProto["1"] = "/ceļš/uz/npm/skripti/"; // aktivizēt izsaukumu pieprasīt("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "mezgls"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // aktivizēt izsaukumu pieprasīt("baiti");

Pētnieki analizēja 10 1958 NPM pakotņu ar vislielāko atkarību skaitu un atklāja, ka 4420 no tām failā package.json nav galvenā rekvizīta, 355 izmanto relatīvos ceļus savos prasību paziņojumos un XNUMX tieši izmanto komandu aizstāšanas API.

Darbīgs piemērs ir uzbrukums Parse Server aizmugursistēmai, kas ignorē rekvizītu evalFunctions. Lai vienkāršotu šādu ievainojamību identificēšanu, ir izstrādāts rīku komplekts, kas apvieno statiskās un dinamiskās analīzes metodes. Node.js testēšanas laikā tika identificēti 11 sīkrīki, kurus var izmantot, lai organizētu uzbrukumus, kas noved pie uzbrucēja koda izpildes. Papildus Parse Server NPM CLI tika identificētas arī divas izmantojamas ievainojamības.

Avots: opennet.ru

Pievieno komentāru