Ataka prieš Node.js manipuliuojant „JavaScript“ objektų prototipais

Helmholtz informacijos saugos centro (CISPA) ir Karališkojo technologijos instituto (Švedija) tyrėjai išanalizavo JavaScript prototipo taršos technikos pritaikomumą kuriant Node.js platformos ir ja pagrįstų populiarių programų atakas, kurios veda prie kodo vykdymo.

Prototipo taršos metodas naudoja JavaScript kalbos funkciją, leidžiančią pridėti naujų savybių prie bet kurio objekto šakninio prototipo. Programose gali būti kodų blokų (įtaisų), kurių veikimui įtakos turi pakeista ypatybė; pavyzdžiui, kode gali būti tokia konstrukcija kaip 'const cmd = options.cmd || „/bin/sh““, kurios logika pasikeis, jei užpuolikui pavyks pakeisti „cmd“ ypatybę šakniniame prototipe.

Sėkmingai atakai reikia, kad programa galėtų naudoti išorinius duomenis, kad sukurtų naują objekto šakninio prototipo ypatybę, o vykdymas susidurtų su įtaisu, kuris priklauso nuo pakeistos nuosavybės. Prototipo pakeitimas atliekamas apdorojant „__proto__“ ir „konstruktorių“ paslaugų ypatybes Node.js. Ypatybė „__proto__“ grąžina objekto klasės prototipą, o savybė „konstruktorius“ – funkciją, naudotą objektui sukurti.

Jei programos kode yra priskyrimas „obj[a][b] = vertė“ ir reikšmės nustatytos iš išorinių duomenų, užpuolikas gali nustatyti „a“ į reikšmę „__proto__“ ir įdiegti savo nuosavybę. su pavadinimu „b“ ir reikšme „value“ objekto šakniniame prototipe (obj.__proto__.b = vertė;), o prototipe nustatyta savybė bus matoma visuose objektuose. Panašiai, jei kode yra tokių posakių kaip „obj[a][b][c] = vertė“, visuose esamuose objektuose nustatydami „a“ į „konstruktorius“ ir „b“ į „prototipas“, galite apibrėžkite naują ypatybę pavadinimu „c“ ir reikšme „value“.

Prototipo keitimo pavyzdys: const o1 = {}; const o2 = naujas objektas(); o1.__proto__.x = 42; // sukurti ypatybę „x“ šakniniame prototipe console.log (o2.x); // pasiekti ypatybę „x“ iš kito objekto // išvestis bus 42, nes šakninis prototipas buvo pakeistas per objektą o1, kuris taip pat naudojamas objekte o2

Pažeidžiamo kodo pavyzdys: function entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; grąžinti p; }

Jei enterPoint funkcijos argumentai sudaromi iš įvesties duomenų, užpuolikas gali perduoti reikšmę „__proto__“ į arg1 ir sukurti nuosavybę bet kokiu šakninio prototipo pavadinimu. Jei perduodate arg2 reikšmę „toString“, o arg3 – 1, galite apibrėžti ypatybę „toString“ (Object.prototype.toString=1) ir sugadinti programą skambinant į toString().

Situacijų, dėl kurių gali būti vykdomas užpuoliko kodas, pavyzdžiai apima ypatybių „pagrindinį“, „shell“, „exports“, „contextExtensions“ ir „env“ kūrimą. Pavyzdžiui, užpuolikas gali sukurti „pagrindinę“ nuosavybę objekto šakniniame prototipe, įrašydamas jame kelią į savo scenarijų (Object.prototype.main = „./../../pwned.js“) ir ši ypatybė bus iškviesta vykdymo metu konstrukcijos reikalauti („my-package“) kode, jei įtrauktas paketas aiškiai neapibrėžia „pagrindinės“ ypatybės pakete package.json (jei ypatybė neapibrėžta, jis bus gautas iš šaknies prototipo). „Shell“, „exports“ ir „env“ savybes galima pakeisti panašiai: tegul rootProto = Object.prototype; rootProto["eksportuoja"] = {".":"./changelog.js"}; rootProto["1"] = "/kelias/į/npm/skriptai/"; // suaktyvinti skambutį reikalauti("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "mazgas"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // suaktyvinti skambutį reikalauti("baitai");

Tyrėjai išanalizavo 10 1958 NPM paketų su didžiausiu priklausomybių skaičiumi ir nustatė, kad 4420 355 iš jų neturi pagrindinės nuosavybės pakete.json, XNUMX XNUMX naudoja santykinius kelius reikalavimo sakiniuose, o XNUMX tiesiogiai naudoja komandų pakeitimo API.

Tinkamas pavyzdys yra išnaudojimas, skirtas atakuoti Parse Server užpakalinę programą, kuri nepaiso evalFunctions nuosavybės. Siekiant supaprastinti tokių pažeidžiamumų nustatymą, buvo sukurtas įrankių rinkinys, kuriame derinami statiniai ir dinaminiai analizės metodai. Testuojant Node.js buvo identifikuota 11 programėlių, kurios gali būti naudojamos organizuojant atakas, kurios veda į užpuoliko kodo vykdymą. Be Parse Server, NPM CLI taip pat buvo aptiktos dvi išnaudojamos spragos.

Šaltinis: opennet.ru

Добавить комментарий