Napad na Node.js kroz manipulaciju prototipovima JavaScript objekata

Istraživači iz Helmholtz centra za informacijsku sigurnost (CISPA) i Kraljevskog instituta za tehnologiju (Švedska) analizirali su primjenjivost tehnike zagađivanja prototipa JavaScript za kreiranje napada na Node.js platformu i popularne aplikacije zasnovane na njoj, što dovodi do izvršenja koda.

Metoda zagađivanja prototipa koristi funkciju JavaScript jezika koja vam omogućava da dodate nova svojstva osnovnom prototipu bilo kojeg objekta. Aplikacije mogu sadržavati blokove koda (gadgete) na čiji rad utječe zamijenjeno svojstvo; na primjer, kod može sadržavati konstrukciju poput 'const cmd = options.cmd || "/bin/sh"', čija će logika biti promijenjena ako napadač uspije zamijeniti svojstvo "cmd" u korijenskom prototipu.

Uspješan napad zahtijeva da aplikacija može koristiti vanjske podatke za kreiranje novog svojstva u korijenskom prototipu objekta i da izvršavanje naiđe na gadžet koji ovisi o modificiranom svojstvu. Promjena prototipa se postiže obradom svojstava usluge “__proto__” i “konstruktor” u Node.js. Svojstvo "__proto__" vraća prototip klase objekta, a svojstvo "konstruktor" vraća funkciju korištenu za kreiranje objekta.

Ako kod aplikacije sadrži dodjelu “obj[a][b] = vrijednost” i vrijednosti su postavljene iz vanjskih podataka, napadač može postaviti “a” na vrijednost “__proto__” i postići instalaciju vlastitog svojstva sa imenom “b” i vrijednošću “value” u korijenskom prototipu objekta (obj.__proto__.b = value;), a svojstvo postavljeno u prototipu će biti vidljivo u svim objektima. Slično tome, ako kod sadrži izraze poput “obj[a][b][c] = vrijednost”, postavljanjem “a” na vrijednost “konstruktor” i “b” na “prototip” u svim postojećim objektima, možete definirajte novo svojstvo s imenom "c" i vrijednošću "value".

Primjer promjene prototipa: const o1 = {}; const o2 = novi objekat(); o1.__proto__.x = 42; // kreiranje svojstva “x” u korijenskom prototipu console.log (o2.x); // pristup svojstvu “x” iz drugog objekta // izlaz će biti 42, budući da je korijenski prototip promijenjen preko objekta o1, koji se također koristi u objektu o2

Primjer ranjivog koda: funkcija entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; return p; }

Ako se argumenti funkcije entryPoint formiraju iz ulaznih podataka, tada napadač može proslijediti vrijednost “__proto__” u arg1 i kreirati svojstvo s bilo kojim imenom u korijenskom prototipu. Ako proslijedite arg2 vrijednost "toString" i arg3 vrijednost 1, možete definirati svojstvo "toString" (Object.prototype.toString=1) i srušiti aplikaciju tokom poziva toString().

Primjeri situacija koje bi mogle dovesti do izvršenja koda napadača uključuju kreiranje svojstava "main", "shell", "exports", "contextExtensions" i "env". Na primjer, napadač može kreirati “glavno” svojstvo u korijenskom prototipu objekta, upisujući u njega putanju do svoje skripte (Object.prototype.main = “./../../pwned.js”) i ovo svojstvo će biti pozvano u vrijeme izvršenja u kodu konstrukcije require("my-package"), ako uključeni paket ne definira eksplicitno svojstvo "main" u package.json (ako svojstvo nije definirano, dobiće se iz korijenskog prototipa). Svojstva “shell”, “exports” i “env” mogu se zamijeniti na sličan način: neka rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // okidač poziva require("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "čvor"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // aktiviranje poziva require("bytes");

Istraživači su analizirali 10 NPM paketa sa najvećim brojem zavisnosti i otkrili da 1958 njih nema glavno svojstvo u package.json, 4420 koristi relativne putanje u svojim naredbama require, a 355 direktno koristi API za zamenu komandi.

Radni primjer je eksploatacija za napad na pozadinu Parse Servera koja nadjačava svojstvo evalFunctions. Da bi se pojednostavila identifikacija takvih ranjivosti, razvijen je komplet alata koji kombinuje metode statičke i dinamičke analize. Tokom testiranja Node.js-a, identifikovano je 11 gadžeta koji se mogu koristiti za organizovanje napada koji dovode do izvršenja napadačevog koda. Pored Parse servera, dve ranjivosti koje se mogu iskoristiti su takođe identifikovane u NPM CLI.

izvor: opennet.ru

Dodajte komentar