Serangan ing Node.js liwat manipulasi prototipe obyek JavaScript

Peneliti saka Helmholtz Center for Information Security (CISPA) lan Royal Institute of Technology (Swedia) nganalisa aplikasi teknik polusi prototipe JavaScript kanggo nggawe serangan ing platform Node.js lan aplikasi populer adhedhasar iku, anjog kanggo eksekusi kode.

Cara polusi prototipe nggunakake fitur basa JavaScript sing ngidini sampeyan nambahake properti anyar menyang prototipe ROOT obyek apa wae. Aplikasi bisa ngemot blok kode (gadget) sing operasi kena pengaruh properti sing diganti, contone, kode kasebut bisa ngemot konstruksi kaya 'const cmd = options.cmd || "/ bin / sh"', logika sing bakal diganti yen panyerang bisa ngganti properti "cmd" ing prototipe root.

A serangan sukses mbutuhake aplikasi bisa nggunakake data external kanggo nggawe property anyar ing prototipe ROOT obyek, lan eksekusi ketemu gadget sing gumantung ing properti dipunΓ©wahi. Ngganti prototipe ditindakake kanthi ngolah properti layanan "__proto__" lan "konstruktor" ing Node.js. Properti "__proto__" ngasilake prototipe kelas obyek, lan properti "konstruktor" ngasilake fungsi sing digunakake kanggo nggawe obyek kasebut.

Yen kode aplikasi ngemot tugas "obj [a] [b] = nilai" lan nilai disetel saka data eksternal, panyerang bisa nyetel "a" menyang nilai "__proto__" lan entuk instalasi properti dhewe. karo jeneng "b" lan nilai "nilai" ing prototipe ROOT obyek (obj.__proto__.b = Nilai;), lan property nyetel ing prototipe bakal katon ing kabeh obyek. Kajaba iku, yen kode ngemot ekspresi kaya "obj [a] [b] [c] = nilai", kanthi nyetel "a" menyang nilai "konstruktor", lan "b" dadi "prototipe" ing kabeh obyek sing ana, sampeyan bisa nemtokake properti anyar kanthi jeneng "c" lan nilai "nilai".

Tuladha pangowahan prototipe: const o1 = {}; const o2 = Obyek anyar (); o1.__proto__.x = 42; // nggawe properti "x" ing root prototype console.log (o2.x); // ngakses properti "x" saka obyek liya // output bakal dadi 42, amarga prototipe ROOT diganti liwat obyek o1, ​​sing uga digunakake ing obyek o2

Tuladha kode rentan: fungsi entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; bali p; }

Yen argumen fungsi entryPoint dibentuk saka data input, banjur panyerang bisa ngirim nilai "__proto__" menyang arg1 lan nggawe properti kanthi jeneng apa wae ing prototipe root. Yen sampeyan pass arg2 Nilai "toString" lan arg3 Nilai 1, sampeyan bisa netepake "toString" property (Object.prototype.toString = 1) lan nabrak aplikasi sak telpon kanggo toString ().

Conto kahanan sing bisa nyebabake eksekusi kode penyerang kalebu nggawe properti "utama", "cangkang", "ekspor", "contextExtensions" lan "env". Contone, panyerang bisa nggawe properti "utama" ing prototipe ROOT obyek, nulis ing path menyang script (Object.prototype.main = "./../../pwned.js") lan sifat iki bakal disebut ing wektu eksekusi ing kode mbangun mbutuhake ("My-paket"), yen paket klebu ora tegas netepake "utama" property ing package.json (yen property ora ditetepake, lan ora ditetepake ing paket. bakal dipikolehi saka prototipe root). Properti "cangkang", "ekspor" lan "env" bisa uga diganti: supaya rootProto = Object.prototype; rootProto["ekspor"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // pemicu telpon mbutuhake ("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "simpul"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "β€”inspect-brk=0.0.0.0:1337"; // pemicu telpon mbutuhake ("bita");

Peneliti nganalisis 10 paket NPM kanthi jumlah dependensi paling gedhe lan nemokake yen 1958 ora duwe properti utama ing package.json, 4420 nggunakake jalur relatif ing pernyataan sing dibutuhake, lan 355 langsung nggunakake API substitusi perintah.

Conto sing bisa digunakake yaiku eksploitasi kanggo nyerang backend Parse Server sing ngatasi properti evalFunctions. Kanggo nyederhanakake identifikasi kerentanan kasebut, toolkit wis dikembangake sing nggabungake metode analisis statis lan dinamis. Sajrone nguji Node.js, 11 gadget diidentifikasi sing bisa digunakake kanggo ngatur serangan sing nyebabake eksekusi kode panyerang. Saliyane Parse Server, loro kerentanan sing bisa dimanfaatake uga diidentifikasi ing NPM CLI.

Source: opennet.ru

Add a comment