Atak sou Node.js atravè manipilasyon pwototip objè JavaScript

Chèchè nan Sant Helmholtz pou Sekirite Enfòmasyon (CISPA) ak Enstiti Royal Teknoloji (Syèd) analize aplikab teknik polisyon pwototip JavaScript pou kreye atak sou platfòm Node.js ak aplikasyon popilè ki baze sou li, ki mennen ale nan ekzekisyon kòd.

Pwototip metòd polisyon an sèvi ak yon karakteristik nan lang JavaScript ki pèmèt ou ajoute nouvo pwopriyete nan pwototip rasin nenpòt objè. Aplikasyon yo ka genyen blòk kòd (gadgets) ki gen operasyon ki afekte pa yon pwopriyete ranplase; pa egzanp, kòd la ka genyen yon konstriksyon tankou 'const cmd = options.cmd || "/bin/sh"', lojik ki pral chanje si atakè a jere ranplase pwopriyete "cmd" nan pwototip rasin lan.

Yon atak siksè mande pou aplikasyon an ka itilize done ekstèn pou kreye yon nouvo pwopriyete nan pwototip rasin objè a, e ke ekzekisyon rankontre yon Gadgets ki depann sou pwopriyete a modifye. Chanje pwototip la akonpli lè w trete pwopriyete sèvis "__proto__" ak "konstriktè" nan Node.js. Pwopriyete "__proto__" la retounen pwototip klas objè a, epi pwopriyete "constructeur" la retounen fonksyon yo itilize pou kreye objè a.

Si kòd aplikasyon an gen plasman "obj[a][b] = valè" epi valè yo mete nan done ekstèn, yon atakè ka mete "a" nan valè "__proto__" epi reyalize enstalasyon pwòp pwopriyete yo. ak non "b" ak valè "valè" nan pwototip rasin objè a (obj.__proto__.b = valè;), ak pwopriyete a mete nan pwototip la pral vizib nan tout objè yo. Menm jan an tou, si kòd la gen ekspresyon tankou "obj[a][b][c] = valè", lè w mete "a" nan valè "konstriktè", ak "b" nan "pwototip" nan tout objè ki egziste deja, ou ka defini yon nouvo pwopriyete ak non "c" ak valè "valè".

Egzanp pou chanje pwototip la: const o1 = {}; const o2 = nouvo Objè (); o1.__proto__.x = 42; // kreye pwopriyete "x" nan pwototip rasin console.log (o2.x); // aksè pwopriyete "x" nan yon lòt objè // pwodiksyon an pral 42, depi pwototip rasin lan te chanje atravè objè o1, ki itilize tou nan objè o2

Egzanp kòd vilnerab: fonksyon entryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; retounen p; }

Si agiman fonksyon entryPoint yo fòme nan done antre, Lè sa a, yon atakè ka pase valè "__proto__" nan arg1 epi kreye yon pwopriyete ki gen nenpòt non nan pwototip rasin lan. Si ou pase arg2 valè "toString" ak arg3 valè 1, ou ka defini pwopriyete "toString" (Object.prototype.toString=1) epi fè aksidan aplikasyon an pandan apèl toString().

Men kèk egzanp sitiyasyon ki ka mennen nan ekzekisyon kòd atakan yo enkli kreyasyon pwopriyete "prensipal", "koki", "ekspòtasyon", "contextExtensions" ak "env". Pou egzanp, yon atakè ka kreye yon pwopriyete "prensipal" nan pwototip rasin yon objè, ekri nan li chemen an nan script li a (Object.prototype.main = "./../../pwned.js") ak Pwopriyete sa a pral rele nan moman egzekisyon an nan kòd la nan konstriksyon an require ("my-package"), si pake ki enkli pa klèman defini pwopriyete "prensipal" nan package.json (si pwopriyete a pa defini, li pral jwenn nan pwototip rasin lan). Pwopriyete "koki", "ekspòtasyon" ak "env" yo ka ranplase menm jan an: kite rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/chemen/a/npm/scripts/"; // deklanche apèl require("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "nòd"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—enspekte-brk=0.0.0.0:1337"; // deklanche apèl mande ("bytes");

Chèchè yo te analize 10 pakè NPM ak pi gwo kantite depandans epi yo te jwenn ke 1958 nan yo pa gen yon pwopriyete prensipal nan package.json, 4420 sèvi ak chemen relatif nan deklarasyon yo mande yo, ak 355 dirèkteman itilize API a sibstitisyon kòmand.

Yon egzanp k ap travay se yon eksplwate pou atake backend Parse Server ki pase sou pwopriyete evalFunctions la. Pou senplifye idantifikasyon vilnerabilite sa yo, yo te devlope yon bwat zouti ki konbine metòd analiz estatik ak dinamik. Pandan tès Node.js, yo te idantifye 11 gadjèt ki ka itilize pou òganize atak ki mennen nan ekzekisyon kòd atakè a. Anplis Parse Server, yo te idantifye de frajilite ki kapab eksplwate nan NPM CLI.

Sous: opennet.ru

Add nouvo kòmantè