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
