JavaScript Obyekt Prototiplərini Manipulyasiya etməklə Node.js-ə hücum

Helmholtz İnformasiya Təhlükəsizliyi Mərkəzinin (CISPA) və Kral Texnologiya İnstitutunun (İsveç) tədqiqatçıları Node.js platformasına və onun əsasında populyar tətbiqlərə hücum yaratmaq üçün JavaScript prototipinin çirklənmə texnikasının tətbiqi imkanlarını təhlil edərək, kodun icrasına gətirib çıxarıblar.

Prototipin çirkləndirilməsi metodu JavaScript dilinin istənilən obyektin kök prototipinə yeni xassələri əlavə etməyə imkan verən xüsusiyyətindən istifadə edir. Tətbiqlərdə işinə əvəz edilmiş xüsusiyyət təsir edən kod blokları (qadcetlər) ola bilər; məsələn, kodda 'const cmd = options.cmd || kimi konstruksiya ola bilər. Təcavüzkar kök prototipində “cmd” xassəsini əvəz edə bilsə, məntiqi dəyişdiriləcək "/bin/sh"'.

Uğurlu hücum, tətbiqin obyektin kök prototipində yeni xüsusiyyət yaratmaq üçün xarici məlumatlardan istifadə edə bilməsini və icranın dəyişdirilmiş xüsusiyyətdən asılı olan qadcetlə qarşılaşmasını tələb edir. Prototipin dəyişdirilməsi Node.js-də “__proto__” və “konstruktor” xidmət xassələrinin işlənilməsi ilə həyata keçirilir. "__proto__" xassəsi obyektin sinifinin prototipini, "konstruktor" xüsusiyyəti isə obyekti yaratmaq üçün istifadə olunan funksiyanı qaytarır.

Tətbiq kodunda “obj[a][b] = dəyər” təyinatı varsa və dəyərlər xarici məlumatlardan təyin edilirsə, təcavüzkar “a” dəyərini “__proto__” dəyərinə təyin edə və öz mülkiyyətinin quraşdırılmasına nail ola bilər. obyektin kök prototipində “b” adı və dəyəri “dəyər” ilə (obj.__proto__.b = dəyər;) və prototipdə təyin edilmiş xassə bütün obyektlərdə görünəcək. Eynilə, əgər kodda “obj[a][b][c] = dəyər kimi ifadələr varsa, bütün mövcud obyektlərdə “a”nı “konstruktor” dəyərinə, “b” isə “prototip”ə təyin etməklə, siz bunu edə bilərsiniz. "c" adı və "dəyər" dəyəri ilə yeni bir xassə təyin edin.

Prototipin dəyişdirilməsi nümunəsi: const o1 = {}; const o2 = yeni Obyekt(); o1.__proto__.x = 42; // console.log (o2.x) kök prototipində “x” xassəsini yaradın; // başqa obyektdən “x” xassəsinə daxil olmaq // çıxış 42 olacaq, çünki kök prototipi o1 obyektində də istifadə olunan o2 obyekti vasitəsilə dəyişdirilib.

Zəif kod nümunəsi: entryPoint funksiyası (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; qayıt p; }

Əgər entryPoint funksiyasının arqumentləri daxil edilən məlumatlardan formalaşırsa, o zaman təcavüzkar “__proto__” dəyərini arg1-ə ötürə və kök prototipində istənilən adla xassə yarada bilər. arg2 dəyərini "toString" və arg3 dəyərini 1 keçirsəniz, "toString" xassəsini təyin edə bilərsiniz (Object.prototype.toString=1) və toString() çağırışı zamanı tətbiqi qəzaya uğrada bilərsiniz.

Təcavüzkar kodunun icrasına səbəb ola biləcək vəziyyətlərə misal olaraq "əsas", "qabıq", "ixraclar", "contextExtensions" və "env" xassələrinin yaradılması daxildir. Məsələn, təcavüzkar obyektin kök prototipində “əsas” xassə yarada, orada öz skriptinin yolunu yaza bilər (Object.prototype.main = “./../../pwned.js”) və bu xassə icra zamanı tələb konstruksiyasının kodunda ("mənim-paketim") çağırılacaq, əgər daxil edilmiş paket package.json-da "əsas" xassəni açıq şəkildə müəyyən etmirsə (xüsusiyyət müəyyən edilməyibsə, kök prototipindən əldə ediləcək). “Shell”, “exports” və “env” xassələri oxşar şəkildə əvəz edilə bilər: let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // tətik çağırışı tələb edir("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "qovşaq"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // tətik çağırışı tələb edir("bayt");

Tədqiqatçılar ən çox asılılığa malik 10 1958 NPM paketini təhlil edərək müəyyən ediblər ki, onlardan 4420 355-i package.json-da əsas xüsusiyyətə malik deyil, XNUMX XNUMX-si tələb ifadələrində nisbi yollardan, XNUMX-i isə birbaşa əmr əvəzetmə API-dən istifadə edir.

İşləyən nümunə, evalFunctions xassəsini ləğv edən Parse Server backendinə hücum üçün istismardır. Bu cür zəifliklərin müəyyənləşdirilməsini sadələşdirmək üçün statik və dinamik analiz üsullarını birləşdirən alətlər dəsti hazırlanmışdır. Node.js-in sınaqları zamanı təcavüzkarın kodunun icrasına səbəb olan hücumların təşkili üçün istifadə oluna bilən 11 qadcet müəyyən edilib. Parse Server ilə yanaşı, NPM CLI-də istifadə edilə bilən iki boşluq da müəyyən edilmişdir.

Mənbə: opennet.ru

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