Shambulio la Node.js kupitia upotoshaji wa mifano ya kitu cha JavaScript

Watafiti kutoka Kituo cha Helmholtz cha Usalama wa Taarifa (CISPA) na Taasisi ya Teknolojia ya Kifalme (Sweden) walichanganua utumikaji wa mbinu ya uchafuzi wa mfano wa JavaScript ili kuunda mashambulizi kwenye jukwaa la Node.js na programu maarufu kulingana na hilo, na kusababisha utekelezaji wa kanuni.

Mbinu ya kuchafua mfano hutumia kipengele cha lugha ya JavaScript ambacho hukuruhusu kuongeza sifa mpya kwenye muundo msingi wa kitu chochote. Programu zinaweza kuwa na vizuizi vya msimbo (vidude) ambavyo utendakazi wake unaathiriwa na sifa iliyobadilishwa; kwa mfano, msimbo unaweza kuwa na muundo kama 'const cmd = options.cmd || "/bin/sh"', mantiki ambayo itabadilishwa ikiwa mvamizi ataweza kubadilisha sifa ya "cmd" katika mfano wa mizizi.

Shambulio lililofaulu linahitaji kwamba programu inaweza kutumia data ya nje kuunda sifa mpya katika muundo msingi wa kitu, na kwamba utekelezaji unakumbana na kifaa ambacho kinategemea sifa iliyorekebishwa. Kubadilisha mfano kunakamilishwa kwa kuchakata sifa za huduma za "__proto__" na "mjenzi" katika Node.js. Sifa ya "__proto__" inarejesha mfano wa darasa la kitu, na sifa ya "mjenzi" inarudisha kazi iliyotumiwa kuunda kitu.

Ikiwa msimbo wa programu una kazi ya "obj[a][b] = thamani" na thamani zimewekwa kutoka kwa data ya nje, mshambuliaji anaweza kuweka "a" kwa thamani "__proto__" na kufanikisha usakinishaji wa mali yake mwenyewe. yenye jina "b" na thamani "thamani" katika mfano wa mzizi wa kitu (obj.__proto__.b = thamani;), na sifa iliyowekwa katika mfano itaonekana katika vitu vyote. Vile vile, ikiwa msimbo una maneno kama "obj[a][b][c] = thamani", kwa kuweka "a" kwa thamani ya "mjenzi", na "b" kwa "prototype" katika vitu vyote vilivyopo, unaweza fafanua mali mpya kwa jina "c" na thamani "thamani".

Mfano wa kubadilisha mfano: const o1 = {}; const o2 = Kitu kipya(); o1.__proto__.x = 42; // unda mali "x" katika console.log ya mfano wa mizizi (o2.x); // ufikiaji wa mali "x" kutoka kwa kitu kingine // matokeo yatakuwa 42, kwani mfano wa mizizi ulibadilishwa kupitia kitu o1, ambacho pia hutumiwa katika kitu o2.

Mfano wa msimbo ulio katika mazingira magumu: entryPoint ya chaguo la kukokotoa (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; kurudi p; }

Ikiwa hoja za chaguo za kukokotoa za entryPoint zimeundwa kutoka kwa data ya ingizo, basi mvamizi anaweza kupitisha thamani "__proto__" kwa arg1 na kuunda sifa iliyo na jina lolote katika prototype ya mzizi. Ukipitisha arg2 thamani "toString" na arg3 thamani ya 1, unaweza kufafanua sifa ya "toString" (Object.prototype.toString=1) na kuvunja programu wakati wa kupiga simu kwa toString().

Mifano ya hali zinazoweza kusababisha utekelezaji wa msimbo wa mshambulizi ni pamoja na kuunda sifa za "kuu", "shell", "usafirishaji", "contextExtensions" na "env". Kwa mfano, mshambulizi anaweza kuunda sifa "kuu" katika mfano wa mzizi wa kitu, akiandika ndani yake njia ya hati yake (Object.prototype.main = "./../../pwned.js") na mali hii itaitwa wakati wa utekelezaji katika kanuni ya ujenzi need("my-package"), ikiwa kifurushi kilichojumuishwa hakifafanui kwa uwazi mali "kuu" katika package.json (ikiwa mali haijafafanuliwa, itapatikana kutoka kwa mfano wa mizizi). Sifa za "ganda", "uza nje" na "env" zinaweza kubadilishwa vile vile: let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // trigger call needs("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "nodi"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "-inspect-brk=0.0.0.0:1337"; // trigger call need("bytes");

Watafiti walichambua vifurushi 10 vya NPM vilivyo na idadi kubwa zaidi ya utegemezi na wakagundua kuwa 1958 kati yao hawana mali kuu katika package.json, 4420 hutumia njia za jamaa katika taarifa zao zinazohitaji, na 355 hutumia API ya ubadilishaji wa amri moja kwa moja.

Mfano kazi ni unyonyaji wa kushambulia mazingira ya nyuma ya Seva ya Parse ambayo hubatilisha sifa ya evalFunctions. Ili kurahisisha utambuzi wa udhaifu huo, seti ya zana imeundwa ambayo inachanganya mbinu tuli na za uchanganuzi zinazobadilika. Wakati wa majaribio ya Node.js, vifaa 11 vilitambuliwa ambavyo vinaweza kutumika kupanga mashambulizi ambayo yanasababisha utekelezwaji wa msimbo wa mshambulizi. Mbali na Parse Server, udhaifu mbili zinazoweza kutekelezwa pia zilitambuliwa katika NPM CLI.

Chanzo: opennet.ru

Kuongeza maoni