Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Podatność RCE w popularnej usłudze zarządzania wersją git – Gogs
Z naszego pentesterskiego doświadczenia wynika, że jedną z często hostowanych usług w organizacjach są systemy zarządzania wersją. Prymat wiodą tutaj rozwiązania oparte o git’a, w szczególności GitLab (o którym pisaliśmy niejednokrotnie). Każdemu zdarzają się wpadki – nasze doświadczenia z GitLabem są w dużej mierze pozytywne. Program BugBounty jest dobrze prowadzony a responsywność i podejście do zgłaszanych błędów stoi na wysokim poziomie. Jednak GitLab, nawet w najprostszej konfiguracji to całkiem potężne narzędzie, dlatego powstają lżejsze alternatywy. Jedną z nich jest Gogs.
TLDR:
- Podatność dotyczy wersji 0.13.0 i pozwala na zdalne wykonanie kodu (CVE-2024-44625)
- Wykorzystanie luki jest możliwe na domyślnej instalacji Gogsa
- Jedynym wymaganiem jest posiadanie konta z uprawnieniami do wypchnięcia plików do zdalnego repozytorium i edycji zawartości
- Podatność została zgłoszona 10 sierpnia, a autor zgłoszenia zdecydował się opublikować raport po 90 dniach wraz z działającym PoCem.
Użytkownik fysac, opublikował na swoim blogu ciekawy wpis dotyczący podatności o identyfikatorze CVE-2024-44625, którą odkrył w rzeczonym projekcie.
Zidentyfikowany błąd to path traversal wynikający ze śledzenia dowiązań symbolicznych (czyli standardowa podatność przy symlinkach…). Edytowane pliki są otwierane bez flagi O_NOFOLLOW, która spowodowałaby niepowodzenie przy otwieraniu pliku w momencie gdy ścieżka docelowa jest dowiązaniem symbolicznym (błąd z kodem ELOOP). Co prawda kod funkcji zdaje się próbować filtrować taki przypadek, jednak jest ścieżka (w momencie gdy newTreePath nie istnieje jeszcze w repozytorium – linia 179-182 podlinkowanego kodu), która pozwala na ominięcie tego sprawdzenia i stworzenie dowolnego pliku w systemie. Jak z tego zrobić RCE? Ano bardzo prosto. Git wspiera tzw. hooki czyli skrypty skojarzone z repozytorium, które istnieją sobie w katalogu hooks na serwerze (<gogs-repositories-path>/<user>/<repository>.git/hooks/) i mogą być uruchomione (to po prostu skrypty) w momencie wypchnięcia kodu do do zdalnego repozytorium (możliwe jest też wykorzystywanie hooków na maszynie developerskiej, np. do uruchomienia kodu poszukującego tokenów i innych sekretów, które nie powinny wyciec). Tworząc symlink do takiego skryptu (korzystając z przedstawionego wcześniej traversala) oraz nadpisując jego zawartość komendą, można doprowadzić do zdalnego wykonania na serwerze.
To bardzo groźna sytuacja, ponieważ może narazić serwer Git’a na wyciek kodu (własności intelektualnej) czy doprowadzić do jego niedostępności (DoS). Ponieważ luka nie została jeszcze naprawiona (obecne wydanie z głównej gałęzi jest z 25.02.2023), to autor znaleziska zaleca wyłączenie publicznego dostępu do instancji oraz zablokowanie niezaufanych użytkowników. Dla obecnych developerów należy wymusić 2FA. Alternatywnie zmigrować na konkurencyjne rozwiązania, ponieważ Gogs ma całkiem sporo otwartych raportów dot. bezpieczeństwa.