Sulmi ndaj Node.js përmes manipulimit të prototipeve të objekteve JavaScript

KĂ«rkuesit e QendrĂ«s Helmholtz pĂ«r SigurinĂ« e Informacionit (CISPA) dhe Institutit Mbretnor tĂ« TeknologjisĂ« (Suedi) analizuan aplikueshmĂ«rinĂ« e teknikĂ«s sĂ« ndotjes sĂ« prototipit tĂ« objekteve JavaScript (‘prototype pollution’) pĂ«r tĂ« krijuar sulme ndaj platformĂ«s Node.js dhe aplikacioneve tĂ« njohura qĂ« bazohet nĂ« tĂ«, tĂ« cilat çojnĂ« nĂ« ekzekutimin e kodit.

Metoda e ndotjes sĂ« prototipit pĂ«rdor njĂ« veçori tĂ« gjuhĂ«s JavaScript qĂ« lejon shtimin e pronarĂ«ve tĂ« rinj nĂ« prototipin rrĂ«njĂ«sor tĂ« çdo objekti. NĂ« aplikacione mund tĂ« ekzistojnĂ« blloqe kodi (gadgets), tĂ« cilat ndikohen nga prona e vendosur, pĂ«r shembull, nĂ« kod mund tĂ« ketĂ« njĂ« strukturĂ« si ‘const cmd = options.cmd || "/bin/sh"‘, logjika e tĂ« cilĂ«s do tĂ« ndryshojĂ« nĂ«se sulmuesi arrin tĂ« vendosĂ« pronĂ«n ‘cmd’ nĂ« prototipin rrĂ«njĂ«sor.

PĂ«r tĂ« realizuar me sukses njĂ« sulm, Ă«shtĂ« e nevojshme qĂ« nĂ« aplikacion tĂ« dhĂ«nat e pĂ«rshtatura nga jashtĂ« tĂ« mund tĂ« pĂ«rdoren pĂ«r tĂ« krijuar njĂ« pronĂ« tĂ« re nĂ« prototipin rrĂ«njĂ«sor tĂ« objektit, si dhe qĂ« gjatĂ« ekzekutimit tĂ« ekzistojĂ« njĂ« gadget i varur nga prona e modifikuar. Ndryshimi i prototipit realizohet falĂ« pĂ«rpunimit nĂ« Node.js tĂ« pronave tĂ« shĂ«rbimit ‘__proto__’ dhe ‘constructor’. Prona ‘__proto__’ kthen prototipin e klasĂ«s sĂ« objektit, ndĂ«rsa prona ‘constructor’ kthen funksionin e pĂ«rdorur pĂ«r tĂ« krijuar objektin.

NĂ«se nĂ« kodin e aplikacionit ndodh njĂ« kalim ‘obj[a][b] = value’ dhe vlerat vendosen nga tĂ« dhĂ«na tĂ« jashtme, sulmuesi mund ta vendosĂ« ‘a’ nĂ« vlerĂ«n ‘__proto__’ dhe tĂ« arrijĂ« tĂ« vendosĂ« pronĂ«n e tij me emrin ‘b’ dhe vlerĂ«n ‘value’ nĂ« prototipin rrĂ«njĂ«sor tĂ« objektit (obj.__proto__.b = value;), duke bĂ«rĂ« qĂ« prona e vendosur nĂ« prototip tĂ« jetĂ« e dukshme nĂ« tĂ« gjitha objektet. Po ashtu, nĂ«se nĂ« kod ndodhin shprehje si ‘obj[a][b][c] = value’, duke vendosur ‘a’ nĂ« vlerĂ«n ‘constructor’, dhe ‘b’ nĂ« ‘prototype’, nĂ« tĂ« gjitha objektet ekzistuese mund tĂ« pĂ«rcaktohet njĂ« pronĂ« e re me emrin ‘c’ dhe vlerĂ«n ‘value’.

Shembulli i ndryshimit tĂ« prototipit: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // krijojmĂ« nĂ« prototipin rrĂ«njĂ«sor pronĂ«n ‘x’ console.log(o2.x); // qasemi nĂ« pronĂ«n ‘x’ nga objekti tjetĂ«r // rezultati do tĂ« jetĂ« 42, sepse pĂ«rmes objektit o1 Ă«shtĂ« ndryshuar prototipi rrĂ«njĂ«sor, qĂ« pĂ«rdoret gjithashtu nĂ« objektin o2.

Shembulli i kodit të cenuar: function entryPoint(arg1, arg2, arg3) { const obj = {}; const p = obj[arg1]; p[arg2] = arg3; return p; }

NĂ«se argumentet e funksionit entryPoint formohen nga tĂ« dhĂ«nat hyrĂ«se, atĂ«herĂ« sulmuesi mund tĂ« dĂ«rgojĂ« nĂ« arg1 vlerĂ«n «__proto__» dhe tĂ« krijojĂ« njĂ« pronĂ« me emrin e dĂ«shiruar nĂ« prototipin e rrĂ«njĂ«s. NĂ«se dĂ«rgon nĂ« arg2 vlerĂ«n «toString», dhe nĂ« arg3 — 1, mund tĂ« pĂ«rcaktojĂ« pronĂ«n «toString» (Object.prototype.toString=1) dhe tĂ« shkaktojĂ« dĂ«shtimin e aplikacionit gjatĂ« thirrjes sĂ« funksionit toString().

Si njĂ« shembull situatash qĂ« mund tĂ« sjellin ekzekutimin e kodit tĂ« sulmuesit, pĂ«rmendet krijimi i pronave «main», «shell», «exports», «contextExtensions» dhe «env». PĂ«r shembull, sulmuesi mund tĂ« krijojĂ« nĂ« prototipin e rrĂ«njĂ«s tĂ« objektit pronĂ«n «main», duke shkruar nĂ« tĂ« rrugĂ«n pĂ«r skriptin e tij (Object.prototype.main = «.\/..\/..\/pwned.js») dhe kjo pronĂ« do tĂ« thirret gjatĂ« ekzekutimit nĂ« kodin e konstrukcionit require(«my-package»), nĂ«se paketa e lidhur nuk pĂ«rcakton nĂ« package.json pronĂ«n «main» (nĂ«se prona nuk Ă«shtĂ« e pĂ«rcaktuar, ajo do tĂ« merret nga prototipi i rrĂ«njĂ«s). Po ashtu mund tĂ« futen pronat «shell», «exports» dhe «env»: let rootProto = Object.prototype; rootProto[«exports»] = {«.»:».\/changelog.js»}; rootProto[«1»] = «\/path\/to\/npm\/scripts\/»; \\ thirrje e aktivizuar 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»; \\ thirrje e aktivizuar require («bytes»);

Hulumtuesit analizuan 10 mijë paketa NPM që kanë numrin më të madh të varësive dhe zbuluan se 1958 nga ato nuk kanë pronën main në package.json, 4420 përdorin rrugë relative në shprehjen require, dhe 355 e përdorin drejtpërdrejt API për të futur komanda.

Si një shembull funksonues mund të përmendim një eksploit për të sulmuar backend-in e Parse Server, që rimëkëmb pronën evalFunctions. Për të thjeshtuar identifikimin e këtij lloj dobësie, është zhvilluar një set instrumentesh që kombinon metodat e analizës statike dhe dinamike. Gjatë testimit të Node.js janë zbuluar 11 gadjet, të cilat mund të përdoren për organizimin e sulmeve që të çojnë në ekzekutimin e kodit të sulmuesit. Përveç Parse Server, dy dobësi të exploituara janë zbuluar gjithashtu në NPM CLI.

Burimi: opennet.ru

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster