В мрежата за доставка на съдържание cdnjs, предлагана от Cloudflare, беше открита критична уязвимост, която позволява изпълнение на произволен код на сървърите на 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-репозитория на предоставяната чрез CDN JavaScript библиотека беше добавена символична връзка 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
