Node.js'i ründamine JavaScripti objektide prototüüpidega manipuleerimise kaudu

Helmholtzi infoturbekeskuse (CISPA) ja Kuningliku Tehnoloogiainstituudi (Rootsi) teadlased analüüsisid JavaScripti prototüübi saastetehnika rakendatavust Node.js platvormi ja sellel põhinevate populaarsete rakenduste vastu rünnakute loomiseks, mis viivad koodi täitmiseni.

Prototüübi saastemeetod kasutab JavaScripti keele funktsiooni, mis võimaldab lisada uusi omadusi mis tahes objekti juurprototüübile. Rakendused võivad sisaldada koodiplokke (vidinaid), mille tööd mõjutab asendatud omadus; näiteks võib kood sisaldada konstruktsiooni nagu 'const cmd = options.cmd || "/bin/sh"', mille loogikat muudetakse, kui ründajal õnnestub juurprototüübi atribuut "cmd" asendada.

Edukas rünnak eeldab, et rakendus saab kasutada välisandmeid, et luua objekti juurprototüübis uus atribuut, ja et käivitamine puutub kokku vidinaga, mis sõltub muudetud atribuudist. Prototüübi muutmine saavutatakse teenuse „__proto__” ja „constructor” atribuutide töötlemisega Node.js-s. Atribuut "__proto__" tagastab objekti klassi prototüübi ja atribuut "konstruktor" objekti loomiseks kasutatud funktsiooni.

Kui rakenduse kood sisaldab määrangut "obj[a][b] = väärtus" ja väärtused on seatud välisandmetest, saab ründaja määrata "a" väärtusele "__proto__" ja saavutada oma atribuudi installimise. nimega “b” ja väärtusega “value” objekti juurprototüübis (obj.__proto__.b = väärtus;) ning prototüübis määratud omadus on nähtav kõikides objektides. Samamoodi, kui kood sisaldab väljendeid nagu "obj[a][b][c] = väärtus", saate kõigis olemasolevates objektides määrata "a" väärtuseks "konstruktor" ja "b" väärtuseks "prototüüp". defineerige uus omadus nimega "c" ja väärtusega "value".

Prototüübi muutmise näide: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // loo atribuut “x” juurprototüübis console.log (o2.x); // juurdepääsu omadus "x" teiselt objektilt // väljundiks on 42, kuna juurprototüüpi muudeti läbi objekti o1, mida kasutatakse ka objektis o2

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

Kui funktsiooni enterPoint argumendid moodustatakse sisendandmetest, saab ründaja edastada väärtuse “__proto__” väärtusele arg1 ja luua juurprototüübis mis tahes nimega atribuudi. Kui edastate arg2 väärtuse "toString" ja arg3 väärtuse 1, saate määratleda atribuudi "toString" (Object.prototype.toString=1) ja rakenduse toString() väljakutse ajal krahhi teha.

Näited olukordadest, mis võivad viia ründaja koodi täitmiseni, hõlmavad atribuutide "main", "shell", "exports", "contextExtensions" ja "env" loomist. Näiteks saab ründaja luua objekti juurprototüübis atribuudi "peamine", kirjutades sellesse oma skripti tee (Object.prototype.main = "./../../pwned.js") ja seda atribuuti kutsutakse käivitamise ajal konstruktsiooni nõuavad ("my-pakett") koodis, kui kaasatud pakett ei määratle failis package.json selgelt atribuuti "peamine" (kui atribuut pole määratletud, see saadakse juurprototüübist). Atribuudid "shell", "exports" ja "env" saab asendada sarnaselt: let rootProto = Object.prototype; rootProto["ekspordid"] = {".":"./changelog.js"}; rootProto["1"] = "/tee/npm/skriptid/"; // käivitab kõne nõue("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "sõlm"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // käivitab kõne nõuda("baiti");

Uurijad analüüsisid 10 1958 suurima sõltuvusega NPM-paketti ja leidsid, et 4420-l neist ei ole failis package.json põhiatribuuti, 355 kasutab oma nõutavates lausetes suhtelisi teid ja XNUMX kasutavad otse käsu asendamise API-d.

Toimiv näide on Parse Serveri taustaprogrammi ründamise ärakasutamine, mis alistab atribuudi evalFunctions. Selliste haavatavuste tuvastamise lihtsustamiseks on välja töötatud tööriistakomplekt, mis ühendab staatilisi ja dünaamilisi analüüsimeetodeid. Node.js testimise käigus tuvastati 11 vidinat, mille abil saab korraldada rünnakuid, mis viivad ründaja koodi täitmiseni. Lisaks Parse Serverile tuvastati NPM CLI-s ka kaks ärakasutatavat turvaauku.

Allikas: opennet.ru

Lisa kommentaar