Fanafihana amin'ny Node.js amin'ny alΓ lan'ny fanodikodinana ny prototypes object JavaScript

Ireo mpikaroka avy amin'ny Helmholtz Center for Information Security (CISPA) sy ny Royal Institute of Technology (Sweden) dia nandinika ny fampiharana ny teknikan'ny fandotoana prototype JavaScript mba hamoronana fanafihana amin'ny sehatra Node.js sy ny fampiharana malaza mifototra amin'izany, izay mitarika amin'ny famonoana kaody.

Ny fomba fandotoana prototype dia mampiasa endri-javatra amin'ny fiteny JavaScript izay ahafahanao manampy fananana vaovao amin'ny prototype fototry ny zavatra rehetra. Ny fampiharana dia mety misy blocs code (gadgets) izay misy fiantraikany amin'ny fananana nosoloina ny asany; ohatra, ny code dia mety misy fananganana toy ny 'const cmd = options.cmd || "/bin/sh"', ny lojika dia hovana raha toa ka mahavita manolo ny fananana "cmd" ao amin'ny prototype fakany ilay mpanafika.

Ny fanafihana mahomby dia mitaky ny ahafahan'ny fampiharana mampiasa angona ivelany mba hamoronana fananana vaovao ao amin'ny prototype fakan'ilay zavatra, ary io famonoana io dia mifanena amin'ny gadget izay miankina amin'ny fananana novana. Ny fanovana ny prototype dia vita amin'ny alΓ lan'ny fanodinana ny fananana serivisy "__proto__" sy "mpanorina" ao amin'ny Node.js. Ny fananana "__proto__" dia mamerina ny prototype amin'ny kilasin'ny zavatra, ary ny fananana "mpanorina" dia mamerina ny fiasa ampiasaina hamoronana ilay zavatra.

Raha toa ny kaody fampiharana misy ny fanendrena "obj[a][b] = sanda" ary ny soatoavina dia napetraka avy amin'ny angona ivelany, ny mpanafika dia afaka mametraka "a" amin'ny sanda "__proto__" ary mahatratra ny fametrahana ny fananany manokana. miaraka amin'ny anarana hoe "b" sy ny sanda "value" ao amin'ny prototype fototry ny zavatra (obj.__proto__.b = sanda;), ary ny fananana napetraka ao amin'ny prototype dia ho hita amin'ny zavatra rehetra. Toy izany koa, raha misy teny hoe "obj[a][b][c] = sanda" ny fehezan-dalΓ na, amin'ny fametrahana ny "a" amin'ny sanda "mpanorina", ary ny "b" amin'ny "prototype" amin'ny zavatra efa misy rehetra dia azonao atao. mamaritra fananana vaovao miaraka amin'ny anarana "c" sy ny sanda "value".

Ohatra amin'ny fanovana ny prototype: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // mamorona fananana "x" ao amin'ny root prototype console.log (o2.x); // fidirana amin'ny fananana "x" avy amin'ny zavatra hafa // ny vokatra dia ho 42, satria niova ny prototype fototra tamin'ny alΓ lan'ny object o1, izay ampiasaina amin'ny object o2 ihany koa.

Ohatra amin'ny code vulnerable: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; miverina p; }

Raha miforona avy amin'ny angon-drakitra fampidirana ny tohan-kevitry ny asa entryPoint, dia afaka mandefa ny sanda "__proto__" amin'ny arg1 ny mpanafika ary mamorona fananana misy anarana ao amin'ny prototype faka. Raha mandalo arg2 ny sanda "toString" ary arg3 ny sanda 1, dia azonao atao ny mamaritra ny fananana "toString" (Object.prototype.toString=1) ary midona amin'ny fampiharana mandritra ny antso mankany amin'ny toString().

Ohatra amin'ny toe-javatra mety hitarika amin'ny famonoana kaody mpanafika dia ny famoronana ny fananana "main", "shell", "exports", "contextExtensions" ary "env". Ohatra, ny mpanafika dia afaka mamorona fananana "main" ao amin'ny prototype fototry ny zavatra iray, manoratra ao ny lalana mankany amin'ny script (Object.prototype.main = "./../../pwned.js") ary Ity fananana ity dia hantsoina amin'ny fotoana famonoana ao amin'ny code of the construct require("my-package"), raha toa ka tsy mamaritra mazava tsara ny fananana "main" ao amin'ny package.json ny fonosana tafiditra (raha tsy voafaritra ny fananana, azo avy amin'ny prototype fakany izany). Ny fananana "shell", "exports" ary "env" dia azo soloina mitovy: avelao rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // trigger call 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"; // trigger call require("bytes");

Ny mpikaroka dia nandinika fonosana NPM 10 miaraka amin'ny isan'ny fiankinan-doha be indrindra ary hita fa ny 1958 amin'izy ireo dia tsy manana fananana lehibe ao amin'ny package.json, 4420 no mampiasa lalana mifandraika amin'ny fanambarana takian'izy ireo, ary 355 no mampiasa mivantana ny baiko fanoloana API.

Ohatra iray miasa ny fanararaotana amin'ny fanafihana ny parse Server backend izay manafoana ny fananana evalFunctions. Mba hanatsorana ny famantarana ireo vulnerabilities ireo, dia novolavolaina ny kitapom-pitaovana izay manambatra ny fomba famakafakana static sy mavitrika. Nandritra ny fitsapana ny Node.js, gadget 11 no fantatra fa azo ampiasaina handaminana fanafihana izay mitarika amin'ny famonoana ny kaody mpanafika. Ho fanampin'ny Parse Server, dia hita ao amin'ny NPM CLI koa ny vulnerability roa azo trandrahana.

Source: opennet.ru

Add a comment