Attaccà Node.js attraversu a manipulazione di prototipi d'ughjettu JavaScript

I ricercatori di u Helmholtz Center for Information Security (CISPA) è l'Istitutu Reale di Tecnulugia (Svezia) anu analizatu l'applicabilità di a tecnica di contaminazione di prototipu JavaScript per creà attacchi à a piattaforma Node.js è l'applicazioni populari basate nantu à questu, chì portanu à l'esekzione di codice.

U metudu di contaminazione di u prototipu usa una funzione di a lingua JavaScript chì permette di aghjunghje novi proprietà à u prototipu radicali di qualsiasi ughjettu. L'applicazioni ponu cuntene blocchi di codice (gadgets) chì l'operazione hè affettata da una pruprietà sustituita; per esempiu, u codice pò cuntene una custruzzione cum'è "const cmd = options.cmd || "/bin/sh"', a logica di quale serà cambiata se l'attaccante riesce à rimpiazzà a pruprietà "cmd" in u prototipu radicale.

Un attaccu successu esige chì l'applicazione pò utilizà dati esterni per creà una nova pruprietà in u prototipu radicale di l'ughjettu, è chì l'esekzione scontra un gadget chì dipende da a pruprietà mudificata. U cambiamentu di u prototipu hè rializatu da processendu e proprietà di serviziu "__proto__" è "costruttore" in Node.js. A pruprietà "__proto__" torna u prototipu di a classa di l'ughjettu, è a pruprietà "costruttore" torna a funzione utilizata per creà l'ughjettu.

Se u codice di l'applicazione cuntene l'assignazione "obj[a][b] = valore" è i valori sò stabiliti da dati esterni, un attaccu pò stabilisce "a" à u valore "__proto__" è uttene a stallazione di a so propria pruprietà. cù u nome "b" è u valore "valore" in u prototipu radicali di l'ughjettu (obj.__proto__.b = valore;), è a pruprietà stabilita in u prototipu serà visibile in tutti l'uggetti. In listessu modu, se u codice cuntene espressioni cum'è "obj[a][b][c] = valore", affinchendu "a" à u valore "costruttore", è "b" à "prototipu" in tutti l'uggetti esistenti, pudete definisce una nova pruprietà cù u nome "c" è u valore "valore".

Esempiu di cambià u prototipu: const o1 = {}; const o2 = new Object (); o1.__proto__.x = 42; // crea a pruprietà "x" in u prototipu root console.log (o2.x); // accede à a pruprietà "x" da un altru ughjettu // l'output serà 42, postu chì u prototipu root hè statu cambiatu per l'ughjettu o1, chì hè ancu usatu in l'ughjettu o2

Esempiu di codice vulnerabile: funzione entryPoint (arg1, arg2, arg3) { const obj = {}; const p = obj[arg1]; p[arg2] = arg3; ritornu p; }

Se l'argumenti di a funzione entryPoint sò furmati da i dati di input, allora un attaccu pò passà u valore "__proto__" à arg1 è creà una pruprietà cù qualsiasi nome in u prototipu radicale. Se passa arg2 u valore "toString" è arg3 u valore 1, pudete definisce a pruprietà "toString" (Object.prototype.toString=1) è crash l'applicazione durante a chjama à toString().

Esempii di situazioni chì puderanu guidà à l'esekzione di codice attaccante includenu a creazione di e proprietà "principale", "shell", "exports", "contextExtensions" è "env". Per esempiu, un attaccu pò creà una pruprietà "principale" in u prototipu radicali di un ughjettu, scrivendu in questu u percorsu à u so script (Object.prototype.main = "./../../pwned.js") è sta pruprietà serà chjamata à u mumentu di l'esekzione in u codice di a custruzzione richiede ("my-package"), se u pacchettu inclusu ùn definisce micca esplicitamente a pruprietà "principale" in package.json (se a pruprietà ùn hè micca definita, serà ottenutu da u prototipu radicali). E pruprietà "shell", "exports" è "env" ponu esse sustituitu in modu simile: let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // 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");

I circadori anu analizatu 10 1958 pacchetti NPM cù u più grande numaru di dependenzii è truvaru chì 4420 355 d'elli ùn anu micca una pruprietà principale in package.json, XNUMX XNUMX utilizanu percorsi relative in i so dichjarazioni richieste, è XNUMX utilizanu direttamente l'API di sustituzzioni di cumandamenti.

Un esempiu di travagliu hè un sfruttamentu per attaccà u backend Parse Server chì annulla a pruprietà evalFunctions. Per simplificà l'identificazione di tali vulnerabilità, hè statu sviluppatu un toolkit chì combina metudi di analisi statica è dinamica. Durante a prova di Node.js, 11 gadgets sò stati identificati chì ponu esse utilizati per urganizà attacchi chì portanu à l'esekzione di u codice di l'attaccante. In più di Parse Server, duie vulnerabili sfruttabili sò state identificate ancu in l'NPM CLI.

Source: opennet.ru

Add a comment