Attack op Node.js duerch Manipulatioun vu JavaScript Objekt Prototypen

Fuerscher vum Helmholtz Center fir Informatiounssécherheet (CISPA) an dem Royal Institute of Technology (Schweden) analyséiert d'Uwendbarkeet vun der JavaScript Prototyp Verschmotzungstechnik fir Attacken op der Node.js Plattform a populäre Applikatiounen op der Basis ze kreéieren, wat zu Code Ausféierung féiert.

D'Prototyp Verschmotzungsmethod benotzt eng Feature vun der JavaScript Sprooch, déi Iech erlaabt nei Eegeschafte fir de Root Prototyp vun all Objet ze addéieren. Uwendungen kënnen Codeblocken (Gadgeten) enthalen, deenen hir Operatioun vun enger ersater Immobilie beaflosst gëtt; zum Beispill kann de Code e Konstrukt enthalen wéi 'const cmd = options.cmd || "/bin/sh"', d'Logik vun där wäert geännert ginn wann den Ugräifer et fäerdeg bréngt d'"cmd" Eegeschafte am Root Prototyp z'ersetzen.

En erfollegräichen Attack erfuerdert datt d'Applikatioun extern Daten benotze kann fir eng nei Propriétéit am Root-Prototyp vum Objet ze kreéieren, an datt d'Ausféierung e Gadget begéint, deen vun der modifizéierter Immobilie hänkt. D'Ännerung vum Prototyp gëtt duerch d'Veraarbechtung vun den "__proto__" an "constructor" Serviceeigenschaften am Node.js erreecht. D'Eegeschaft "__proto__" gëtt de Prototyp vun der Klass vum Objet zréck, an d'Eegeschafte "constructor" gëtt d'Funktioun zréck, déi benotzt gëtt fir den Objet ze kreéieren.

Wann den Applikatiounscode d'Aufgab "obj[a][b] = Wäert" enthält an d'Wäerter aus externen Donnéeën gesat ginn, kann en Ugräifer "a" op de Wäert "__proto__" setzen an d'Installatioun vun hirem eegene Besëtz erreechen mam Numm "b" an de Wäert "Wäert" an der Wuerzel Prototyp vum Objet (obj.__proto__.b = Wäert;), an der Propriétéit Formatioun am Prototyp gëtt an all Objete siichtbar. Ähnlech, wann de Code Ausdréck wéi "obj[a][b][c] = Wäert enthält, andeems Dir "a" op de "Konstruktor" Wäert setzt, an "b" op "Prototyp" an all existent Objekter, kënnt Dir definéiert eng nei Propriétéit mam Numm "c" an de Wäert "Wäert".

Beispill fir de Prototyp z'änneren: const o1 = {}; const o2 = neien Objet(); o1.__proto__.x = 42; // erstellen Propriétéit "x" am root Prototyp console.log (o2.x); // Zougrëff op d'Eegeschaft "x" vun engem aneren Objet // d'Ausgab wäert 42 sinn, well de Root-Prototyp duerch Objekt o1 geännert gouf, deen och am Objekt o2 benotzt gëtt

Beispill vu vulnérable Code: Funktioun entryPoint (arg1, arg2, arg3) { const obj = {}; const p = obj[arg1]; p[arg2] = arg3; zréck p; }

Wann d'Argumenter vun der EntryPoint Funktioun aus Inputdaten geformt ginn, da kann en Ugräifer de Wäert "__proto__" op arg1 passéieren an eng Immobilie mat all Numm am Root-Prototyp erstellen. Wann Dir laanscht arg2 de Wäert "toString" an arg3 de Wäert 1, Dir kënnt de "toString" Propriétéit definéieren (Object.prototype.toString = 1) an Crash der Applikatioun während dem Opruff toString ().

Beispiller vu Situatiounen, déi zur Ausféierung vum Ugräifercode féieren kënnen, enthalen d'Schafe vun den "Main", "Shell", "Exports", "ContextExtensions" an "env" Eegeschaften. Zum Beispill kann en Ugräifer eng "Haapt" Eegeschafte am Root Prototyp vun engem Objet erstellen, de Wee op säi Skript schreiwen (Object.prototype.main = "./../../pwned.js") an Dës Immobilie gëtt am Moment vun der Ausféierung am Code vum Konstrukt erfuerdert ("mäi Pak") genannt, wann de abegraff Package net explizit d'"Haapt" Eegeschafte am package.json definéiert (wann d'Propriétéit net definéiert ass, et gëtt vum Root Prototyp kritt). D'"Shell", "Export" an "env" Eegeschafte kënnen ähnlech ersat ginn: loosst rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // Ausléiser 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"; // Ausléiser Uruff erfuerdert ("Bytes");

D'Fuerscher analyséiert 10 NPM Packagen mat der gréisst Zuel vun Ofhängegkeeten a fonnt dass 1958 vun hinnen net eng Haaptrei Propriétéit an package.json hunn, 4420 benotzen relativ Weeër an hir verlaangen Aussoen, an 355 benotzen direkt de Kommando Substitutioun API.

E funktionéiert Beispill ass en Ausbeutung fir de Parse Server Backend z'attackéieren deen d'evalFunctions Eegeschafte iwwerschreift. Fir d'Identifikatioun vun esou Schwachstelle ze vereinfachen, gouf e Toolkit entwéckelt, deen statesch an dynamesch Analysemethoden kombinéiert. Beim Testen vun Node.js goufen 11 Gadgeten identifizéiert, déi benotzt kënne ginn fir Attacken ze organiséieren, déi zu der Ausféierung vum Code vum Ugräifer féieren. Zousätzlech zum Parse Server goufen och zwee exploitable Schwachstelle am NPM CLI identifizéiert.

Source: opennet.ru

Setzt e Commentaire