Angrep på Node.js gjennom manipulering av JavaScript-objektprototyper

Forskere fra Helmholtz Center for Information Security (CISPA) og Royal Institute of Technology (Sverige) analyserte anvendeligheten av JavaScript-prototypen forurensningsteknikk for å lage angrep på Node.js-plattformen og populære applikasjoner basert på den, noe som førte til kodekjøring.

Prototype-forurensingsmetoden bruker en funksjon i JavaScript-språket som lar deg legge til nye egenskaper til rotprototypen til ethvert objekt. Applikasjoner kan inneholde kodeblokker (gadgets) hvis operasjon påvirkes av en erstattet egenskap, for eksempel kan koden inneholde en konstruksjon som 'const cmd = options.cmd || "/bin/sh"', hvis logikk vil bli endret hvis angriperen klarer å erstatte "cmd"-egenskapen i rotprototypen.

For å lykkes med å utføre et angrep, krever applikasjonen at eksterne data kan brukes til å lage en ny egenskap i rotprototypen til objektet, og at kjøringen møter en gadget som avhenger av den modifiserte egenskapen. Endring av prototypen oppnås ved å behandle "__proto__" og "constructor" tjenesteegenskapene i Node.js. "__proto__"-egenskapen returnerer prototypen til objektets klasse, og "constructor"-egenskapen returnerer funksjonen som ble brukt til å lage objektet.

Hvis applikasjonskoden inneholder tilordningen "obj[a][b] = verdi" og verdiene er satt fra eksterne data, kan en angriper sette "a" til verdien "__proto__" og oppnå installasjon av sin egen eiendom med navnet "b" og verdien "verdi" i rotprototypen til objektet (obj.__proto__.b = verdi;), og egenskapssettet i prototypen vil være synlig i alle objekter. Tilsvarende, hvis koden inneholder uttrykk som "obj[a][b][c] = verdi", ved å sette "a" til "konstruktør"-verdien og "b" til "prototype" i alle eksisterende objekter, kan du definer en ny egenskap med navnet "c" og verdien "verdi".

Et eksempel på endring av prototypen: const o1 = {}; const o2 = nytt objekt(); o1.__proto__.x = 42; // opprette egenskapen "x" i rotprototypen console.log (o2.x); // få tilgang til egenskapen "x" fra et annet objekt // utgangen vil være 42, siden rotprototypen ble endret gjennom objektet o1, som også brukes i objektet o2

Eksempel på sårbar kode: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; retur p; }

Hvis entryPoint-funksjonsargumentene er dannet fra inngangsdata, kan en angriper sende verdien "__proto__" til arg1 og lage en egenskap med et hvilket som helst navn i rotprototypen. Hvis du sender arg2 verdien "toString" og arg3 verdien 1, kan du definere "toString"-egenskapen (Object.prototype.toString=1) og krasje applikasjonen under kallet til toString().

Eksempler på situasjoner som kan føre til kjøring av angriperkode inkluderer opprettelsen av egenskapene "main", "shell", "exports", "contextExtensions" og "env". For eksempel kan en angriper opprette en "main"-egenskap i rotprototypen til et objekt, skrive banen til skriptet hans (Object.prototype.main = "./../../pwned.js") og denne egenskapen vil bli kalt på tidspunktet for utførelse i koden til konstruksjonen require("min-pakke"), hvis den inkluderte pakken ikke eksplisitt definerer "hoved"-egenskapen i package.json (hvis egenskapen ikke er definert, den vil bli hentet fra rotprototypen). Egenskapene "shell", "eksporter" og "env" kan erstattes på samme måte: la rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/bane/til/npm/skript/"; // 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"; // trigger call require("bytes");

Forskerne analyserte 10 1958 NPM-pakker med det største antallet avhengigheter og fant at 4420 355 av dem ikke har en hovedegenskap i package.json, XNUMX XNUMX bruker relative stier i sine require-setninger, og XNUMX bruker direkte kommandoerstatnings-API.

Et fungerende eksempel er en utnyttelse for å angripe Parse Server-backend som overstyrer evalFunctions-egenskapen. For å forenkle identifiseringen av slike sårbarheter er det utviklet et verktøysett som kombinerer statiske og dynamiske analysemetoder. Under testing av Node.js ble det identifisert 11 gadgets som kan brukes til å organisere angrep som fører til kjøring av angriperens kode. I tillegg til Parse Server ble det også identifisert to utnyttbare sårbarheter i NPM CLI.

Kilde: opennet.ru

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster