Node.js-i rünnakud JavaScripti objektide prototüüpide manipuleerimise kaudu

Helmholtz'i Informaatika Turbe Keskuse (CISPA) ja Rootsi Kuningliku Tehnika Instituudi teadlased analüüsisid JavaScripti objektide prototüübi ummistamise tehnika („prototype pollution“) rakendatavust Node.js platvormile ja selle põhjal loodud populaarsetele rakendustele suunatud rünnakute loomiseks, mis võivad viia koodi täitmiseni.

Prototüübi ummistamise meetod kasutab JavaScripti keele omadust, mis võimaldab lisada uusi omadusi igasuguste objektide juureprototüüpi. Rakendustes võib esineda koodilõike (gadžette), mille tööle lisatud omadus mõju avaldab; näiteks võib koodis esineda konstruktsioon nagu 'const cmd = options.cmd || "/bin/sh"', mille töölogika muutub, kui ründaja suudab lisada omaduse „cmd“ juureprototüüpi.

Rünnakuks on vajalik, et rakenduses saaksid välised andmed luua uusi omadusi objekti juureprototüübis ja et käitamise käigus kohtub gadget, mis sõltub muudetud omadusest. Prototüübi muutmine toimub Node.js-s, kasutades teenuseid omadusi «__proto__» ja «constructor». Omadus «__proto__» tagastab objekti klassi prototüübi, samas kui omadus «constructor» tagastab funktsiooni, mida kasutatakse objekti loomiseks.

Kui rakenduse koodis esineb määramine «obj[a][b] = value» ja väärtused on saadud välistest andmetest, siis saab ründaja määrata «a» väärtuseks «__proto__» ja seada oma omaduse nimega «b» ja väärtusega «value» objekti juureprototüübi (obj.__proto__.b = value;), ja nii määratud omadus prototüübis on nähtav kõigis objektides. Samuti, kui koodis esinevad avaldused kujul «obj[a][b][c] = value», määrates «a» väärtuseks «constructor» ja «b» väärtuseks «prototype», saab kõigis olemasolevates objektides määrata uue omaduse nimega «c» ja väärtusega «value».

Näide prototüübi muutmisest: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // loome juurpseudoprogrammi omaduse 'x' console.log(o2.x); // pääseme juurde omadusele 'x' teisest objekti kaudu // tulemuseks saame 42, kuna o1 kaudu muudeti juurpseudoprogrammi, mida kasutatakse ka objektis o2

Näide haavatavast koodist: function entryPoint(arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; return p; }

Kui funktsiooni entryPoint argumendid genereeritakse sisendandmetest, siis saab ründaja edastada arg1 väärtuseks '__proto__' ja luua juurpseudoprogrammi omaduse mis tahes nimega. Kui arg2 väärtuseks edastada 'toString' ja arg3 väärtuseks 1, saab määrata omaduse 'toString' (Object.prototype.toString=1) ja põhjustada rakenduse tõrke funktsiooni toString() kutsumisel.

Näiteks olukordade kohta, mis võivad viia ründaja koodi täitmiseni, toodi välja omaduste loomine nagu «main», «shell», «exports» ja «env». Näiteks võib ründaja luua objekti juurerakenduse prototüübis omaduse «main», kirjutades sinna oma skripti tee (Object.prototype.main = «./../../pwned.js») ja seda omadust kutsutakse esile, kui täiendatav pakett ei defineeri package.json failis selgelt omadust «main» (kui omadust pole määratud, saadakse see juurerakenduse prototüübist). Samamoodi võivad omadusi «shell», «exports» ja «env» asendada: let rootProto = Object.prototype; rootProto[«exports»] = {«.»:»./changelog.js»}; rootProto[«1»] = «/path/to/npm/scripts/»; // käivita kõne 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»; // käivita kõne require («bytes»);

Uurijad analüüsisid 10 000 NPM-paketti, millel on kõige rohkem sõltuvusi, ja leidsid, et 1958 neist ei omanud omadust main package.json-is, 4420 kasutas suhtelisi teid require väljendites, ning 355 kasutavad otse API-d käsu asendamiseks.

Töökorrastatuks näiteks võib tuua eksploidimise Parse Serveri tagaosa rünnakuks, mis ületab evalFunctions omaduse. Sarnaste haavatavuste tuvastamist lihtsustamiseks on välja töötatud tööriistakomplekt, mis ühendab staatilise ja dünaamilise analüüsi meetodeid. Node.js testimise käigus tuvastati 11 vidinat, mida saab kasutada rünnakute organiseerimiseks, mis põhjustavad ründaja koodi täitmist. Lisaks Parse Serverile tuvastati kaks ka aetatavat haavatavust ka NPM CLI-s.

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster