W jądrze Linux zidentyfikowano podatność, podobnie jak w przypadku podatności Copy Fail, Dirty Frag i Fragnesia, która pozwala na uzyskanie uprawnień roota przez nieuprzywilejowanego użytkownika poprzez nadpisanie danych w pamięci podręcznej stron. Nadało jej kodową nazwę DirtyDecrypt (problem ten jest również znany jako DirtyCBC). Dostępny jest prototyp eksploitacji.
Numer CVE nie został wspomniany w notatce do eksploitacji, jedynie wskazano, że badacze zidentyfikowali problem 9 maja, po czym poinformowali o tym twórców jądra, którzy odpowiedzieli, że ich odkrycie powiela inny raport o już naprawionej podatności. Ponieważ łatka z poprawką została już włączona do jądra, badacze postanowili opublikować stworzony przez siebie eksploit. Judząc po opisie wewnątrz eksploitacji, korzysta ona z podatności CVE-2026-31635, której poprawka została przyjęta do jądra w kwietniu i została uwzględniona w wersji 7.0.0 oraz w wydaniu 6.18.23, które zostało utworzone 18 kwietnia. Problem występuje od wersji jądra 6.16.
Podobnie jak w przypadku serii podatności Dirty Frag, nowa podatność występuje w sterowniku RxRPC, który zaimplementowano dla rodziny gniazd AF_RXRPC oraz w protokole RPC o tej samej nazwie, działającym na UDP. Problem został spowodowany błędem w weryfikacji rozmiaru danych w funkcji rxgk_verify_response() — zamiast sprawdzenia „if (auth_len > len)”, w kodzie zapisano „if (auth_len < len)”, co prowadziło do przekazywania w funkcji rxgk_decrypt_skb() danych o rozmiarze większym niż dopuszczalny. Podczas wykonywania funkcji rxgk_decrypt_skb() deszyfrowanie danych odbywało się poprzez bezpośrednie zmiany w pamięci podręcznej stron, aby wyeliminować zbędne buforowanie. Z powodu niewłaściwej weryfikacji rozmiaru istniała możliwość nadpisania danych w pamięci podręcznej stron w wybranym przesunięciu.
Eksploatacja podatności polega na odczytaniu pliku programu z flagą suid root (aby osiedlił się w pamięci podręcznej stron) i zastąpieniu w pamięci podręcznej części kodu programu kodem do uruchomienia /usr/bin/sh. Następne uruchomienie programu doprowadzi do załadowania do pamięci nieoryginalnego pliku wykonywalnego z nośnika, ale zmienionej kopii z pamięci podręcznej. W przypadku programów suid w eksploitacji przewidziano możliwość użycia „/usr/bin/su”, „/bin/su”, „/usr/bin/mount”, „/usr/bin/passwd” oraz „/usr/bin/chsh”.
Aby wykorzystać lukę w zabezpieczeniach, przy kompilacji jądra musi być aktywna opcja CONFIG_RXGK, a do autoloadu dostępny musi być moduł jądra rxrpc.ko (w niektórych systemach nie jest on kompilowany). Status usunięcia luk w zabezpieczeniach w dystrybucjach można ocenić na następujących stronach: Debian, Ubuntu, SUSE/openSUSE, RHEL, Arch, Fedora. Jako sposób ochrony można zablokować załadowanie modułu jądra rxrpc:
sh -c "printf 'install rxrpc /bin/false\n' > /etc/modprobe.d/dirtydecrypt.conf; rmmod rxrpc 2>/dev/null; true"
Dodatkowo warto zauważyć publikację w liście dyskusyjnej deweloperów jądra Linux poprawek, które całkowicie wyłączają w API kryptograficznym (AF_ALG) optymalizacje, które wykorzystują bezpośrednie odwołania do pamięci podręcznej przy dekodowaniu z użyciem algorytmów „skcipher” i „aead”. Optymalizacje te eliminują niepotrzebne buforowanie danych, ale stwarzają ryzyko wystąpienia poważnych luk. Zakłada się, że ich wyłączenie spowoduje jedynie niewielki spadek wydajności z powodu dodatkowej operacji kopiowania do osobnego bufora. Poprawki zostały przyjęte przez firmę odpowiedzialną za subsystem API kryptograficzne i włączone do gałęzi „cryptodev”, w której rozwijane są możliwości dla włączenia do głównego obiegu przyszłych wydań jądra Linux.
Źródło: opennet.ru
