Node.js erasotzea JavaScript Objektu Prototipoak Manipulatuz

Helmholtz Center for Information Security (CISPA) eta Royal Institute of Technology (Suedia) ikertzaileek JavaScript prototipoaren kutsadura teknikaren aplikagarritasuna aztertu dute Node.js plataforman eta bertan oinarritutako aplikazio ezagunen aurkako erasoak sortzeko, kodea exekutatzeko.

Prototipo kutsatzeko metodoak edozein objekturen erro-prototipoari propietate berriak gehitzeko aukera ematen duen JavaScript hizkuntzaren ezaugarri bat erabiltzen du. Aplikazioek kode-blokeak (gadget-ak) izan ditzakete eta horien funtzionamendua ordezkaturiko propietate batek eragiten du; adibidez, kodeak 'const cmd = options.cmd || bezalako eraikuntza bat izan dezake. "/bin/sh"', zeinaren logika aldatuko da erasotzaileak root prototipoan "cmd" propietatea ordezkatzea lortzen badu.

Eraso arrakastatsu batek eskatzen du aplikazioak kanpoko datuak erabil ditzakeela objektuaren erro-prototipoan propietate berri bat sortzeko, eta exekuzioak aldatutako propietatearen araberako gadget batekin topo egitea. Prototipoa aldatzea Node.js-en "__proto__" eta "constructor" zerbitzuen propietateak prozesatzen dira. "__proto__" propietateak objektuaren klasearen prototipoa itzultzen du, eta "konstruktore" propietateak objektua sortzeko erabilitako funtzioa itzultzen du.

Aplikazio-kodeak "obj[a][b] = balioa" esleipena badu eta balioak kanpoko datuetatik ezartzen badira, erasotzaileak "a" ezar dezake "__proto__" balioa eta bere jabetzaren instalazioa lor dezake. "b" izenarekin eta "balioa" balioarekin objektuaren erro-prototipoan (obj.__proto__.b = balioa;), eta prototipoan ezarritako propietatea objektu guztietan ikusgai egongo da. Era berean, kodeak "obj[a][b][c] = balioa" bezalako esamoldeak baditu, "a" "eraikitzailea" balioa ezarriz eta "b" "prototipoa" lehendik dauden objektu guztietan, dezakezu definitu propietate berri bat "c" izenarekin eta "balioa" balioarekin.

Prototipoa aldatzeko adibidea: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // β€œx” propietatea sortu root prototipoan console.log (o2.x); // atzitu β€œx” propietatea beste objektu batetik // irteera 42 izango da, erro-prototipoa o1 objektuaren bidez aldatu baita, o2 objektuan ere erabiltzen dena

Kode zaurgarriaren adibidea: entryPoint funtzioa (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; itzuli p; }

EntryPoint funtzioaren argumentuak sarrerako datuetatik eratzen badira, erasotzaileak "__proto__" balioa pasa diezaioke arg1-ri eta erroko prototipoan edozein izen duen propietate bat sor dezake. Arg2 "toString" balioa eta arg3 balioa 1 pasatzen badituzu, "toString" propietatea defini dezakezu (Object.prototype.toString=1) eta aplikazioa huts egin dezakezu toString(-ra) deian.

Erasotzaileen kodea exekutatzeko ekar dezaketen egoeren adibideak "principal", "shell", "exports", "contextExtensions" eta "env" propietateak sortzea dira. Adibidez, erasotzaileak propietate "nagusi" bat sor dezake objektu baten erro-prototipoan, bertan bere scripterako bidea idatziz (Object.prototype.main = "./../../pwned.js") eta propietate hau require ("nire paketea") konstrukzioaren kodean exekutatzen den unean deituko da, sartutako paketeak "nagusia" propietatea esplizituki definitzen ez badu package.json-en (propietatea definituta ez badago, erro-prototipotik lortuko da). "shell", "exports" eta "env" propietateak antzera ordezka daitezke: let 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 = "nodoa"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "β€”inspect-brk=0.0.0.0:1337"; // trigger call require ("bytes");

Ikertzaileek mendekotasun kopuru handiena duten 10 NPM pakete aztertu zituzten eta haietako 1958k ez dutela propietate nagusirik package.json-en, 4420k bide erlatiboak erabiltzen dituzte beren require adierazpenetan eta 355ek zuzenean komandoak ordezkatzeko APIa erabiltzen dute.

Lan-adibide bat evalFunctions propietatea gainidazten duen Parse Server backend-a erasotzeko ustiapena da. Ahulezien identifikazioa errazteko, analisi-metodo estatikoak eta dinamikoak uztartzen dituen tresna-kutxa bat garatu da. Node.js-en probetan, erasotzailearen kodea exekutatzen duten erasoak antolatzeko erabil daitezkeen 11 gadget identifikatu ziren. Parse Server-az gain, bi ahultasun ustiagarri ere identifikatu ziren NPM CLI-n.

Iturria: opennet.ru

Gehitu iruzkin berria