Firma Qualys wykryła dwie podatności (CVE-2021-44731, CVE-2021-44730) w narzędziu snap-confine, dostarczanym z flagą SUID root, które jest wywoływane przez proces snapd w celu stworzenia środowiska wykonawczego dla aplikacji dostarczanych w samodzielnych pakietach w formacie snap. Podatności te pozwalają lokalnemu użytkownikowi bez uprawnień na wykonanie kodu z prawami root w systemie. Problemy zostały usunięte w dzisiejszej aktualizacji pakietów snapd dla Ubuntu 21.10, 20.04 i 18.04.
Pierwsza podatność (CVE-2021-44730) pozwala na przeprowadzenie ataku poprzez manipulację twardymi linkami, jednak wymaga wyłączenia systemowej ochrony twardych linków (ustawienia sysctl fs.protected_hardlinks na 0). Problem spowodowany jest nieprawidłową weryfikacją lokalizacji plików wykonywalnych pomocniczych programów snap-update-ns i snap-discard-ns, uruchamianych z prawami root. Ścieżka do tych plików była obliczana w funkcji sc_open_snapd_tool() na podstawie własnej ścieżki z /proc/self/exe, co pozwala na stworzenie twardego linku do snap-confine w swoim katalogu i umieszczenie w tym katalogu swoich wersji narzędzi snap-update-ns i snap-discard-ns. Po uruchomieniu przez twardy link snap-confine z prawami root uruchomi ono pliki snap-update-ns i snap-discard-ns umieszczone przez atakującego z bieżącego katalogu.
Druga podatność spowodowana jest warunkiem wyścigu i może być wykorzystywana w domyślnej konfiguracji Ubuntu Desktop. Aby exploit działał poprawnie na Ubuntu Server, konieczne jest wybranie podczas instalacji jednego z pakietów z sekcji „Featured Server Snaps”. Warunek wyścigu ujawnia się w funkcji setup_private_mount(), wywoływanej w trakcie przygotowywania przestrzeni nazw punktów montowania dla pakietu snap. Funkcja ta tworzy tymczasowy katalog „/tmp/snap.$SNAP_NAME/tmp” lub wykorzystuje już istniejący do bind-montowania w niego katalogów dla pakietu w formacie snap.
Ponieważ nazwa tymczasowego katalogu jest przewidywalna, napastnik może podmienić jego zawartość na symboliczny link w momencie po sprawdzeniu właściciela, ale przed wywołaniem systemowego polecenia mount. Na przykład, można utworzyć w katalogu /tmp/snap.lxd symboliczny link „/tmp/snap.lxd/tmp”, wskazujący na dowolny katalog, a wywołanie mount() podąży za symbolicznym linkiem i zamontuje katalog w przestrzeni nazw snap. W podobny sposób można zamontować swoją zawartość w /var/lib i przez zastąpienie /var/lib/snapd/mount/snap.snap-store.user-fstab zorganizować montowanie własnego katalogu /etc w przestrzeni nazw pakietu snap, aby załadować swoją bibliotekę z prawami root poprzez zastąpienie /etc/ld.so.preload.
Zauważono, że stworzenie exploit'a okazało się nietrywialnym zadaniem, ponieważ narzędzie snap-confine zostało napisane w języku Go z użyciem technik bezpiecznego programowania, ma ochronę opartą na profilach AppArmor, filtruje wywołania systemowe na podstawie mechanizmu seccomp oraz stosuje przestrzeń nazw do izolacji montowania. Niemniej jednak, badaczom udało się przygotować działający exploit do uzyskania praw root w systemie. Kod exploit'a zostanie opublikowany za kilka tygodni, po tym jak użytkownicy zainstalują dostarczone aktualizacje.
Źródło: opennet.ru
