Napad na Node.js kroz manipulaciju prototipova JavaScript objekata

Istraživači Helmholtz Centra za informacijsku sigurnost (CISPA) i Kraljevskog instituta za tehnologiju (Švedska) analizirali su primjenjivost tehnike onečišćenja prototipa JavaScripta za stvaranje napada na Node.js platformu i popularne aplikacije temeljene na njoj, što dovodi do izvršenja koda.

Metoda zagađivanja prototipa koristi značajku JavaScript jezika koja vam omogućuje dodavanje novih svojstava korijenskom 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 se logika promijeniti ako napadač uspije zamijeniti svojstvo “cmd” u korijenskom prototipu.

Uspješan napad zahtijeva da aplikacija može koristiti vanjske podatke za stvaranje novog svojstva u korijenskom prototipu objekta, a to izvođenje nailazi na gadget koji ovisi o izmijenjenom svojstvu. Promjena prototipa postiže se obradom svojstava servisa “__proto__” i “constructor” u Node.js. Svojstvo "__proto__" vraća prototip klase objekta, a svojstvo "constructor" vraća funkciju korištenu za stvaranje objekta.

Ako aplikacijski kod 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 s imenom “b” i vrijednošću “value” u korijenskom prototipu objekta (obj.__proto__.b = vrijednost;), a svojstvo postavljeno u prototipu bit će vidljivo u svim objektima. Slično tome, ako kod sadrži izraze poput “obj[a][b][c] = vrijednost”, postavljanjem “a” na vrijednost “konstruktora”, a “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 Objekt(); o1.__proto__.x = 42; // kreiraj svojstvo “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 kroz objekt 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; povratak p; }

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

Primjeri situacija koje bi mogle dovesti do izvršavanja koda napadača uključuju stvaranje svojstava "main", "shell", "exports", "contextExtensions" i "env". Na primjer, napadač može stvoriti “glavno” svojstvo u korijenskom prototipu objekta, upisujući u njega stazu do svoje skripte (Object.prototype.main = “./../../pwned.js”) i ovo će svojstvo biti pozvano u vrijeme izvođenja u kodu konstrukcije require("my-package"), ako uključeni paket eksplicitno ne definira svojstvo "main" u package.json (ako svojstvo nije definirano, dobit ć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"] = "/put/do/npm/skripti/"; // 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"; // pokreni poziv require("bytes");

Istraživači su analizirali 10 NPM paketa s najvećim brojem ovisnosti i otkrili da njih 1958 nema glavno svojstvo u package.json, 4420 koristi relativne putove u svojim zahtjevima, a 355 izravno koristi API za zamjenu naredbi.

Radni primjer je eksploatacija za napad na pozadinu poslužitelja za analizu koja nadjačava svojstvo evalFunctions. Kako bi se pojednostavila identifikacija takvih ranjivosti, razvijen je skup alata koji kombinira metode statičke i dinamičke analize. Tijekom testiranja Node.js identificirano je 11 gadgeta koji se mogu koristiti za organiziranje napada koji dovode do izvršenja napadačevog koda. Uz Parse Server, dvije ranjivosti koje se mogu iskoristiti također su identificirane u NPM CLI-ju.

Izvor: opennet.ru

Dodajte komentar