Badacze z firmy Xint zidentyfikowali w jądrze Linux podatność (CVE-2026-31431), która umożliwia nieprivilegowanemu użytkownikowi uzyskanie uprawnień root w systemie. Problemowi nadano nazwę kodową Copy Fail. Dostępny jest prototyp exploita. Możliwość wykorzystania podatności została zademonstrowana w Ubuntu 24.04 LTS, Amazon Linux 2023, RHEL 10.1 i SUSE 16, ale zauważono, że pakiety jądra z innych dystrybucji, w tym Debian, Arch, Fedora, Rocky i Alma, również są narażone na problem, chociaż nie były testowane osobno.
Podatność została spowodowana błędem logicznym w API crypto (AF_ALG) jądra Linux, który wystąpił podczas wprowadzania w 2017 roku optymalizacji eliminującej zbędne buforowanie poprzez wykonywanie operacji szyfrowania blokowego AEAD (Authenticated Encryption with Associated Data) w miejscu (in-place). Problem powstał z powodu nieprzemyślanego użycia funkcji splice(), która przekazuje dane między deskryptorami plików a kanałami (pipe) bez kopiowania, przekazując odniesienia do elementów w pamięci podręcznej. Po wprowadzeniu tej optymalizacji, podczas przesyłania pliku do gniazda AF_ALG do odszyfrowania, do struktury scatterlist zapisywano nie referencję do osobnego bufora, ale bezpośrednią referencję do elementów pamięci podręcznej jądra z danymi pliku.
W dalszym procesie odszyfrowania AEAD mieszano powiązane referencyjnie dane tagu uwierzytelniającego („authentication tag”) z kopiowanymi do bufora RX dodatkowymi danymi uwierzytelniającymi (AAD, Associated Authenticated Data) oraz szyfrogramem, a offset do operacji zapisu w tagu uwierzytelniającym obliczano w odniesieniu do skopiowanych danych bez odpowiednich kontroli, co umożliwiało nadpisywanie dowolnych obszarów w pamięci podręcznej.
Podatność umożliwia przy każdym żądaniu nadpisanie 4 bajtów w wybranym offsetcie, co pozwala atakującemu na zmianę zawartości dowolnego pliku w systemie, dostępnego do odczytu, poprzez wysyłanie serii żądań i wcześniejsze umieszczanie go w pamięci podręcznej. Ponieważ przy wszelkich operacjach odczytu z plików zawartość jest najpierw zwracana z pamięci podręcznej, po wymianie informacji w pamięci podręcznej, jądro lub proces podczas odczytywania danych z pliku uzyska nie rzeczywiste, ale zmienione dane, co może być użyte do wstrzyknięcia kodu do wykonywalnych plików or do ładowanych bibliotek współdzielonych.
Aby wykonać kod z uprawnieniami root, wystarczy zmodyfikować pamięć podręczną stron dla dowolnego pliku wykonywalnego z flagą suid root.
W proponowanym exploicie odczytywany jest plik wykonywalny /usr/bin/su i modyfikowana jest zawartość tego pliku załadowana do pamięci podręcznej, aby wstawić do niego własny kod. Przy kolejnym uruchomieniu narzędzia «su» do pamięci zostanie załadowana nieoryginalna kopia tej aplikacji z pamięci masowej, lecz zmodyfikowana wersja z pamięci podręcznej.
Eksploit jest uniwersalny, nie wymaga przystosowania do dystrybucji ani wersji jądra i może być używany z dowolnymi dystrybucjami. Ponieważ przy użyciu izolacji kontenerowej dla wszystkich kontenerów używana jest wspólna pamięć podręczna, luki można wykorzystać, aby uzyskać dostęp do środowiska hosta z kontenera (zobowiązano się później opublikować exploit do obejścia izolacji w Kubernetes).
Luka została wykryta przy użyciu AI po około godzinie eksperymentów z analizą kodu podsystemu kryptograficznego jądra. Problem pojawia się począwszy od jądra Linux 4.14, wydanego w 2017 roku, i został usunięty w jądrach 6.18.22, 6.19.12 i 7.0. Status usuwania luk w dystrybucjach można ocenić na danych stronach: Debian, Ubuntu, SUSE/openSUSE, RHEL, Gentoo, Arch,
Fedora, ROSA.
Jako obejście ochrony można wyłączyć moduł jądra algif_aead, który jest używany w OpenSSL przy wyraźnym włączeniu silnika afalg oraz w niektórych aplikacjach (można sprawdzić obecność takich uruchomionych aplikacji poleceniem «lsof | grep AF_ALG»):
echo «install algif_aead /bin/false» > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead
Źródło: opennet.ru
