Уязвимост в cdnjs, която позволява изпълнение на код на сървърите на Cloudflare

В предоставената от компанията Cloudflare мрежа за доставка на съдържание cdnjs, предназначена за ускоряване на доставката на JavaScript библиотеки, беше открита критична уязвимост, която позволява изпълнение на произволен код на сървърите на CDN. Опасността от проблема се усложнява от факта, че около 12.7% от всички сайтове в интернет използват услугата за зареждане на JavaScript библиотеки, а компрометирането на инфраструктурата позволява замяна на библиотеките, предоставяни от всеки от тези сайтове.

Сервисът cdnjs извършва зареждане на пакети от Git или репозиторий NPM, след което предоставя на всеки сайт безплатен достъп до мрежата за доставка на съдържание на Cloudflare за ускоряване на зареждането на JavaScript библиотеки. При изучаване на кода на компонентите cdnjs, публикувани в GitHub, беше установено, че за разопаковане на NPM пакети в архиви tgz се използва стандартният модул archive/tar на Go, който предоставя списък на файловете без нормализиране на пътищата. В случай, че скриптът разопакова съдържанието на базата на предоставения списък, наличието на файлове в архива с видове «../../../tmp/test» може да доведе до перезаписване на произволни файлове в системата, в зависимост от правата за достъп.

Беше предположено, че атакуващият може да подаде заявка за добавяне на своя библиотека в cdnjs и да зареди в репозитория NPM специално оформен архив, съдържащ файлове с символи «../» в пътя. На сървърите на cdnjs периодично се изпълнява операцията «autoupdate», по време на която обработващият модул зарежда нови версии на предложената библиотека и разопакова съдържанието. С помощта на файлове с пътища «../» атакуващият може да постигне перезаписване на файлове със скриптовете на услугата и изпълнение на своя код на сървър на който се извършва разопаковането.

В случай на зареждане на актуализации от Git беше установено, че обработващият модул, зареждащ актуализациите, не взема предвид символичните линкове при копиране на файлове от Git. Тази особеност позволяваше организиране на четенето на произволни файлове с сървър чрез добавяне на символични линкове в Git.

Експерименти с демонстрацията на хакване на cdnjs за получаване на награда в HackerOne бяха решени да започнат с проверки на хипотезата относно четенето на файлове. В Git хранилището на JavaScript библиотеката, предоставяна чрез CDN, беше добавена символична връзка test.js, указваща на файла /proc/self/maps. След публикуването на новата версия на библиотеката, обработчикът на актуализации обработи това хранилище и публикува посочения файл в cdnjs (test.js бе създадена като символична връзка и при запитване за този файл се връщаше съдържанието на /proc/self/maps).

Подставяйки символична връзка на файла /proc/self/environ, авторът на изследването забеляза, че вътре в предадените данни се съдържат стойности на променливите на средата GITHUB_REPO_API_KEY и WORKERS_KV_API_TOKEN. В първата променлива се съхраняваше ключ за API за достъп с права за писане в репозитория robocdnjs на GitHub. Във втората променлива се съхраняваше токен за хранилището KV в cdnjs. Използвайки получената информация, нападателят можеше да направи промени в cdnjs и напълно да компрометира инфраструктурата.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster