Напад на Ноде.јс кроз манипулацију прототиповима ЈаваСцрипт објеката

Истраживачи из Хелмхолц центра за информациону безбедност (ЦИСПА) и Краљевског института за технологију (Шведска) анализирали су применљивост технике загађења прототипа ЈаваСцрипт за креирање напада на платформу Ноде.јс и популарне апликације засноване на њој, што је довело до извршења кода.

Метод загађивања прототипа користи функцију ЈаваСцрипт језика која вам омогућава да додате нова својства основном прототипу било ког објекта. Апликације могу да садрже блокове кода (гаџете) на чији рад утиче замењено својство; на пример, код може да садржи конструкцију као што је 'цонст цмд = оптионс.цмд || "/бин/сх"', чија ће логика бити промењена ако нападач успе да замени својство "цмд" у основном прототипу.

Успешан напад захтева да апликација може да користи екстерне податке за креирање новог својства у основном прототипу објекта и да извршавање наиђе на гаџет који зависи од измењеног својства. Промена прототипа се постиже обрадом својстава услуге „__прото__“ и „конструктор“ у Ноде.јс. Својство "__прото__" враћа прототип класе објекта, а својство "конструктор" враћа функцију која се користи за креирање објекта.

Ако код апликације садржи додељивање „обј[а][б] = вредност“ и вредности су постављене из спољних података, нападач може да постави „а“ на вредност „__прото__“ и постигне инсталацију сопственог својства са именом “б” и вредношћу “валуе” у основном прототипу објекта (обј.__прото__.б = валуе;), а својство постављено у прототипу биће видљиво у свим објектима. Слично томе, ако код садржи изразе као што су „обј[а][б][ц] = вредност”, постављањем „а” на вредност „конструктор” и „б” на „прототип” у свим постојећим објектима, можете дефинише ново својство са именом "ц" и вредношћу "вредност".

Пример промене прототипа: цонст о1 = {}; цонст о2 = нови објекат(); о1.__прото__.к = 42; // креирамо својство “к” у основном прототипу цонсоле.лог (о2.к); // приступ својству “к” из другог објекта // излаз ће бити 42, пошто је основни прототип промењен преко објекта о1, који се такође користи у објекту о2

Пример рањивог кода: функција ентриПоинт (арг1, арг2, арг3){ цонст обј = {}; цонст п = обј[арг1]; п[арг2] = арг3; ретурн п; }

Ако се аргументи функције ентриПоинт формирају од улазних података, онда нападач може проследити вредност „__прото__“ у арг1 и креирати својство са било којим именом у основном прототипу. Ако арг2 проследите вредност "тоСтринг", а арг3 вредност 1, можете дефинисати својство "тоСтринг" (Објецт.прототипе.тоСтринг=1) и срушити апликацију током позива функције тоСтринг().

Примери ситуација које би могле да доведу до извршења кода нападача укључују креирање својстава „маин“, „схелл“, „екпортс“, „цонтектЕктенсионс“ и „енв“. На пример, нападач може да креира „главно“ својство у основном прототипу објекта, уписујући у њега путању до своје скрипте (Објецт.прототипе.маин = „./../../пвнед.јс“) и ово својство ће бити позвано у време извршења у коду конструкције рекуире("ми-пацкаге"), ако укључени пакет не дефинише експлицитно својство "маин" у пацкаге.јсон (ако својство није дефинисано, добиће се из коренског прототипа). Својства “схелл”, “екпортс” и “енв” могу се заменити на сличан начин: нека роотПрото = Објецт.прототипе; роотПрото["екпортс"] = {".":"./цхангелог.јс"}; роотПрото["1"] = "/путања/до/нпм/сцриптс/"; // активира позив рекуире("./таргет.јс"); Објецт.прототипе.маин = "/патх/то/нпм/сцриптс/цхангелог.јс"; Објецт.прототипе.схелл = "чвор"; Објецт.прототипе.енв = {}; Објецт.прототипе.енв.НОДЕ_ОПТИОНС = "—инспецт-брк=0.0.0.0:1337"; // активира позив рекуире("битес");

Истраживачи су анализирали 10 НПМ пакета са највећим бројем зависности и открили да 1958 њих нема главно својство у пацкаге.јсон, 4420 користи релативне путање у својим захтевима, а 355 директно користи АПИ за замену команди.

Радни пример је експлоатација за напад на позадину Парсе сервера која замењује својство евалФунцтионс. Да би се поједноставила идентификација таквих рањивости, развијен је комплет алата који комбинује методе статичке и динамичке анализе. Током тестирања Ноде.јс, идентификовано је 11 гаџета који се могу користити за организовање напада који доводе до извршења нападачевог кода. Поред Парсе сервера, две рањивости које се могу искористити су такође идентификоване у НПМ ЦЛИ.

Извор: опеннет.ру

Додај коментар