Serangan kana Node.js ngaliwatan manipulasi prototipe objék JavaScript

Panaliti ti Helmholtz Center for Information Security (CISPA) sareng Royal Institute of Technology (Swédia) nganalisis panerapan téknik polusi prototipe JavaScript pikeun nyiptakeun serangan dina platform Node.js sareng aplikasi populér dumasar kana éta, ngarah kana palaksanaan kode.

Metodeu polusi prototipe ngagunakeun fitur basa JavaScript anu ngamungkinkeun anjeun pikeun nambihan sipat anyar kana prototipe akar objék naon waé. Aplikasi tiasa ngandung blok kode (gadget) anu operasina dipangaruhan ku sipat anu diganti; contona, kode tiasa ngandung konstruk sapertos 'const cmd = options.cmd || "/ bin / sh"', logika anu bakal dirobih upami panyerang junun ngagentos sipat "cmd" dina prototipe akar.

A serangan suksés merlukeun aplikasi nu bisa ngagunakeun data éksternal pikeun nyieun hiji sipat anyar dina prototipe root obyék, sarta yén palaksanaan encounters gadget nu gumantung kana harta dirobah. Ngarobah prototipe dilakonan ku ngolah sipat layanan "__proto__" jeung "constructor" dina Node.js. Harta "__proto__" mulih prototipe kelas obyék, sarta sipat "konstruktor" mulih fungsi dipaké pikeun nyieun obyék.

Upami kodeu aplikasi ngandung tugas "obj[a][b] = nilai" sareng nilaina diatur tina data éksternal, panyerang tiasa nyetél "a" kana nilai "__proto__" sareng ngahontal pamasangan harta sorangan. kalawan nami "b" jeung nilai "nilai" dina prototipe root obyék (obj.__proto__.b = nilai;), jeung harta diatur dina prototipe bakal ditingali dina sakabéh objék. Nya kitu, lamun kode ngandung éksprési kawas "obj [a] [b] [c] = nilai", ku netepkeun "a" kana nilai "konstruktor", sarta "b" kana "prototipe" dina sakabéh objék aya, anjeun tiasa. nangtukeun sipat anyar kalawan ngaran "c" jeung nilai "nilai".

Conto ngarobah prototipe: const o1 = {}; const o2 = Objék anyar (); o1.__proto__.x = 42; // nyieun sipat "x" dina akar prototipe console.log (o2.x); // aksés sipat "x" ti objék séjén // output bakal 42, saprak prototipe root dirobah ngaliwatan obyék o1, ​​nu ogé dipaké dina objék o2

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

Upami argumen fungsi entryPoint kabentuk tina data input, maka panyerang tiasa ngalihkeun nilai "__proto__" ka arg1 sareng nyiptakeun harta anu nganggo nami naon waé dina prototipe akar. Lamun lulus arg2 nilai "toString" na arg3 nilai 1, Anjeun bisa nangtukeun sipat "toString" (Object.prototype.toString = 1) jeung ngadat aplikasi salila panggero ka toString ().

Conto kaayaan anu tiasa nyababkeun palaksanaan kode panyerang kalebet nyiptakeun sipat "utama", "cangkang", "ékspor", "contextExtensions" sareng "env". Salaku conto, panyerang tiasa nyiptakeun sipat "utama" dina prototipe akar hiji obyék, nyerat dina éta jalur ka naskahna (Object.prototype.main = "./../../pwned.js") sareng sipat ieu bakal disebut dina waktu palaksanaan dina kode tina nyusunna merlukeun ( "abdi-pakét"), lamun pakét kaasup teu eksplisit nangtukeun sipat "utama" dina package.json (lamun harta teu diartikeun. eta bakal dimeunangkeun tina prototipe root). The "cangkang", "ékspor" jeung "env" sipat bisa diganti sarupa: hayu rootProto = Object.prototype; rootProto["ékspor"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // pemicu panggero merlukeun ("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "titik"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // pemicu panggero merlukeun ( "bait");

Panaliti nganalisis 10 bungkusan NPM kalayan jumlah katergantungan anu paling ageung sareng mendakan yén 1958 di antarana henteu gaduh sipat utama dina package.json, 4420 nganggo jalur relatif dina pernyataan anu diperyogikeun, sareng 355 langsung nganggo API substitusi paréntah.

Conto anu tiasa dianggo nyaéta eksploitasi pikeun nyerang backend Parse Server anu nimpa harta evalFunctions. Pikeun nyederhanakeun idéntifikasi kerentanan sapertos kitu, toolkit parantos dikembangkeun anu ngagabungkeun metode analisa statik sareng dinamis. Nalika nguji Node.js, 11 gadget diidentifikasi anu tiasa dianggo pikeun ngatur serangan anu nyababkeun palaksanaan kode panyerang. Salian Parse Server, dua kerentanan anu tiasa dieksploitasi ogé diidentifikasi dina NPM CLI.

sumber: opennet.ru

Tambahkeun komentar