JavaScript нысанының прототиптерін манипуляциялау арқылы Node.js сайтына шабуыл

Гельмгольц ақпараттық қауіпсіздік орталығының (CISPA) және Корольдік технологиялық институтының (Швеция) зерттеушілері Node.js платформасына және оның негізіндегі танымал қолданбаларға шабуыл жасау үшін JavaScript прототипінің ластану техникасының қолданылуын талдап, кодты орындауға әкелді.

Прототипті ластау әдісі кез келген нысанның түбірлік прототипіне жаңа сипаттарды қосуға мүмкіндік беретін JavaScript тілінің мүмкіндігін пайдаланады. Қолданбаларда жұмысына ауыстырылған сипат әсер ететін код блоктары (гаджеттер) болуы мүмкін; мысалы, кодта 'const cmd = options.cmd || сияқты құрылым болуы мүмкін. «/bin/sh»', егер шабуылдаушы түбірлік прототипте «cmd» сипатын алмастыра алса, оның логикасы өзгереді.

Сәтті шабуыл қолданбаның нысанның түбірлік прототипінде жаңа сипатты жасау үшін сыртқы деректерді пайдалана алуын және орындалу өзгертілген сипатқа тәуелді гаджетпен кездесуін талап етеді. Прототипті өзгерту Node.js ішіндегі “__proto__” және “конструктор” қызмет сипаттарын өңдеу арқылы орындалады. "__proto__" сипаты объект класының прототипін қайтарады, ал "конструктор" сипаты нысанды жасау үшін пайдаланылатын функцияны қайтарады.

Қолданба кодында «obj[a][b] = мән» тағайындауы болса және мәндер сыртқы деректерден орнатылса, шабуылдаушы «a» мәнін «__proto__» мәніне орнатып, өзінің меншікті орнатуына қол жеткізе алады. нысанның түбір прототипіндегі «b» атауымен және «мән» мәнімен (obj.__proto__.b = мән;) және прототипте орнатылған сипат барлық нысандарда көрінетін болады. Сол сияқты, егер кодта «obj[a][b][c] = мән» сияқты өрнектер болса, барлық бар нысандарда «a» мәнін «конструктор» мәніне және «b» мәнін «прототипке» орнату арқылы «c» атымен және «мән» мәнімен жаңа сипатты анықтаңыз.

Прототипті өзгерту мысалы: const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // console.log (o2.x) түбірлік прототипінде “x” сипатын жасаңыз; // басқа нысаннан “x” сипатына қол жеткізу // шығу 42 болады, себебі түбірлік прототип o1 нысаны арқылы өзгертілді, ол o2 нысанында да қолданылады

Әлсіз кодтың мысалы: entryPoint функциясы (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; қайтару p; }

Егер entryPoint функциясының аргументтері кіріс деректерінен құрылса, онда шабуылдаушы arg1 мәніне “__proto__” мәнін бере алады және түбірлік прототипте кез келген атаумен сипатты жасай алады. arg2 мәнін "toString" және arg3 мәні 1 мәнін өткізсеңіз, "toString" сипатын (Object.prototype.toString=1) анықтауға және toString() шақыру кезінде қолданбаны бұзуға болады.

Зиянкестердің кодын орындауға әкелетін жағдайлардың мысалдарына «негізгі», «қабық», «экспорттар», «контексткеңейтімдер» және «env» сипаттарын жасау жатады. Мысалы, шабуылдаушы нысанның түбірлік прототипінде «негізгі» сипатты жасай алады, оған өз сценарийіне жолды жаза алады (Object.prototype.main = «./../../pwned.js») және бұл сипат талап ("my-package") конструкциясының кодында орындалу кезінде шақырылады, егер енгізілген бума package.json ішіндегі "негізгі" сипатты нақты анықтамаса (егер сипат анықталмаса, ол түбірлік прототиптен алынады). “Shell”, “exports” және “env” сипаттарын бірдей ауыстыруға болады: let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // триггер шақыру талап етеді("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "түйін"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // триггер шақыру талап етеді("байт");

Зерттеушілер тәуелділіктердің ең көп саны бар 10 1958 NPM пакетін талдап, олардың 4420-інің package.json ішінде негізгі қасиеті жоқ екенін, 355-сы талап мәлімдемелерінде салыстырмалы жолдарды, ал XNUMX-і пәрменді ауыстыру API-ін тікелей пайдаланатынын анықтады.

Жұмыс мысалы - evalFunctions сипатын қайта анықтайтын талдау серверінің серверіне шабуылға арналған эксплойт. Осындай осалдықтарды анықтауды жеңілдету үшін статикалық және динамикалық талдау әдістерін біріктіретін құралдар жинағы әзірленді. Node.js тестілеу барысында шабуылдаушы кодының орындалуына әкелетін шабуылдарды ұйымдастыру үшін пайдалануға болатын 11 гаджет анықталды. Талдау серверіне қоса, NPM CLI жүйесінде екі пайдаланатын осалдықтар анықталды.

Ақпарат көзі: opennet.ru

пікір қалдыру