Luka w cdnjs, która umożliwiła wykonanie kodu na serwerach Cloudflare

W sieci dostarczania treści cdnjs firmy Cloudflare zidentyfikowano krytyczną lukę, która ma przyspieszyć dostarczanie bibliotek JavaScript, umożliwiając wykonanie dowolnego kodu na serwerach CDN. Niebezpieczeństwo problemu zwiększa fakt, że około 12.7% wszystkich witryn w Internecie korzysta z usługi pobierania bibliotek JavaScript, a naruszenie infrastruktury umożliwia zastąpienie bibliotek udostępnianych przez którąkolwiek z tych witryn.

Usługa cdnjs pobiera pakiety z repozytorium Git lub NPM, po czym umożliwia dowolnej witrynie bezpłatne korzystanie z sieci dostarczania treści Cloudflare w celu przyspieszenia ładowania bibliotek JavaScript. Studiując kod komponentów cdnjs opublikowany na GitHubie, okazało się, że do rozpakowywania pakietów NPM w archiwach tgz używany jest standardowy moduł Archive/tar w języku Go, który generuje listę plików w niezmienionej postaci, bez normalizacji ścieżek . W przypadku gdy skrypt rozpakowuje zawartość w oparciu o podaną listę, obecność w archiwum plików typu „../../../../../../../tmp/test” może prowadzić do nadpisania dowolnych plików w systemie, o ile pozwalają na to prawa dostępu.

Zaproponowano, aby osoba atakująca mogła złożyć wniosek o dodanie swojej biblioteki do cdnjs i załadować specjalnie zaprojektowane archiwum zawierające pliki ze znakami „../” w ścieżce do repozytorium NPM. Na serwerach cdnjs okresowo wykonywana jest operacja „autoupdate”, podczas której moduł obsługi pobiera nowe wersje proponowanej biblioteki i rozpakowuje zawartość. Wykorzystując pliki o ścieżkach „../”, osoba atakująca może nadpisać pliki ze skryptami serwisowymi i wykonać ich kod na serwerze, na którym dokonano rozpakowania.

W przypadku pobierania aktualizacji z Git odkryto, że moduł obsługi pobierający aktualizacje nie brał pod uwagę dowiązań symbolicznych podczas kopiowania plików z Git. Ta funkcja umożliwiła uporządkowanie odczytu dowolnych plików z serwera poprzez dodanie dowiązań symbolicznych do Git.

Zdecydowano się rozpocząć eksperymenty z demonstracją hackowania cdnj, aby otrzymać nagrodę na HackerOne poprzez przetestowanie hipotezy dotyczącej odczytu plików. Do repozytorium Git biblioteki JavaScript udostępnianej poprzez CDN dodano dowiązanie symboliczne test.js, wskazujące na plik /proc/self/maps. Po opublikowaniu nowej wersji biblioteki moduł obsługi aktualizacji przetworzył to repozytorium i opublikował określony plik w cdnjs (test.js został utworzony jako dowiązanie symboliczne i gdy zażądano tego pliku, zwracana była zawartość /proc/self/maps ).

Podstawiając symboliczne dowiązanie do pliku /proc/self/environ, autor badania zauważył, że podane dane zawierały wartości zmiennych środowiskowych GITHUB_REPO_API_KEY oraz WORKERS_KV_API_TOKEN. Pierwsza zmienna przechowywała klucz API umożliwiający zapis w repozytorium robocdnjs w GitHub. Druga zmienna przechowuje token w pamięci KV w cdnjs. Korzystając z otrzymanych informacji, osoba atakująca może wprowadzić zmiany w cdnjs i całkowicie naruszyć bezpieczeństwo infrastruktury.

Źródło: opennet.ru

Dodaj komentarz