Atako al Node.js per manipulado de JavaScript-objektprototipoj

Esploristoj de la Helmholtz Centro por Informa Sekureco (CISPA) kaj la Reĝa Instituto pri Teknologio (Svedio) analizis la aplikeblecon de la JavaScript-prototipa poluadotekniko por krei atakojn sur la platformo Node.js kaj popularajn aplikojn bazitajn sur ĝi, kondukante al koda ekzekuto.

La prototipa polua metodo uzas funkcion de la JavaScript-lingvo, kiu ebligas al vi aldoni novajn ecojn al la radika prototipo de iu ajn objekto. Aplikoj povas enhavi kodblokojn (gadgets) kies operacio estas tuŝita de anstataŭita propraĵo; ekzemple, la kodo povas enhavi konstruaĵon kiel 'const cmd = options.cmd || "/bin/sh"', kies logiko estos ŝanĝita se la atakanto sukcesos anstataŭigi la posedaĵon "cmd" en la radika prototipo.

Sukcesa atako postulas, ke la aplikaĵo povas uzi eksterajn datumojn por krei novan posedaĵon en la radikprototipo de la objekto, kaj tiu ekzekuto renkontas aparaton kiu dependas de la modifita posedaĵo. Ŝanĝi la prototipon estas plenumita per prilaborado de la "__proto__" kaj "konstruisto" servopropraĵoj en Node.js. La posedaĵo "__proto__" resendas la prototipon de la klaso de la objekto, kaj la posedaĵo "konstruisto" resendas la funkcion uzatan por krei la objekton.

Se la aplika kodo enhavas la taskon "obj[a][b] = valoro" kaj la valoroj estas fiksitaj el eksteraj datumoj, atakanto povas agordi "a" al la valoro "__proto__" kaj atingi la instaladon de sia propra posedaĵo. kun la nomo "b" kaj la valoro "valoro" en la radika prototipo de la objekto (obj.__proto__.b = valoro;), kaj la posedaĵo fiksita en la prototipo estos videbla en ĉiuj objektoj. Simile, se la kodo enhavas esprimojn kiel "obj[a][b][c] = valoro", agordante "a" al la "konstruisto" valoro, kaj "b" al "prototipo" en ĉiuj ekzistantaj objektoj, vi povas difinu novan posedaĵon kun la nomo "c" kaj la valoro "valoro".

Ekzemplo de ŝanĝado de la prototipo: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // kreu posedaĵon “x” en la radika prototipo console.log (o2.x); // alirposedaĵo “x” de alia objekto // la eligo estos 42, ĉar la radika prototipo estis ŝanĝita per objekto o1, kiu ankaŭ estas uzata en objekto o2

Ekzemplo de vundebla kodo: funkcio entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; reveni p; }

Se la entryPoint-funkciaj argumentoj estas formitaj de eniga datumoj, tiam atakanto povas pasi la valoron "__proto__" al arg1 kaj krei posedaĵon kun iu ajn nomo en la radika prototipo. Se vi transdonas al arg2 la valoron "toString" kaj arg3 la valoron 1, vi povas difini la posedaĵon "toString" (Object.prototype.toString=1) kaj kraŝi la aplikaĵon dum la voko al toString().

Ekzemploj de situacioj kiuj povus kaŭzi atakan kodon ekzekuto inkludas la kreadon de la "ĉefa", "ŝelo", "eksportoj", "contextExtensions" kaj "env" trajtoj. Ekzemple, atakanto povas krei "ĉefan" posedaĵon en la radika prototipo de objekto, skribante en ĝi la vojon al sia skripto (Object.prototype.main = "./../../pwned.js") kaj ĉi tiu posedaĵo estos nomita en la momento de ekzekuto en la kodo de la konstruaĵo require ("mia-pako"), se la inkluzivita pako ne eksplicite difinas la "ĉefan" posedaĵon en package.json (se la posedaĵo ne estas difinita, ĝi estos akirita de la radika prototipo). La ecoj "ŝelo", "eksportoj" kaj "env" povas esti anstataŭigitaj simile: let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // ellasilvoko postulas (""./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "nodo"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // ellasilo voko require("bajtoj");

La esploristoj analizis 10 NPM-pakaĵojn kun la plej granda nombro da dependecoj kaj trovis, ke 1958 el ili ne havas ĉefan posedaĵon en package.json, 4420 uzas relativajn vojojn en siaj postulas deklarojn, kaj 355 rekte uzas la komandan anstataŭan API.

Laborekzemplo estas ekspluato por ataki la Parse Server backend kiu superregas la evalFunctions posedaĵo. Por simpligi la identigon de tiaj vundeblecoj, ilaro estis evoluigita kiu kombinas senmovajn kaj dinamikajn analizmetodojn. Dum testado de Node.js, 11 aparatoj estis identigitaj, kiuj povas esti uzataj por organizi atakojn, kiuj kondukas al la ekzekuto de la kodo de la atakanto. Aldone al Parse Server, du ekspluateblaj vundeblecoj ankaŭ estis identigitaj en la NPM CLI.

fonto: opennet.ru

Aldoni komenton