Firma Canonical opublikowała wstępne wyniki niezależnego audytu bezpieczeństwa narzędzia uutils coreutils (Rust Coreutils), napisanego w języku Rust i częściowo wykorzystywanego w Ubuntu zamiast pakietu GNU Coreutils. Audyt został przeprowadzony przez firmę Zellic, która ma doświadczenie w analizie podatności w projektach napisanych w języku Rust. W trakcie kontroli zidentyfikowano 113 problemów z bezpieczeństwem.
Obecnie dostępny jest już raport (PDF, 156 stron) z wynikami pierwszego etapu audytu, obejmującego najważniejsze narzędzia z zestawu uutils. Pierwszy etap, który trwał od grudnia 2025 do stycznia 2026 roku, wykazał 73 podatności, z czego 7 oznaczono jako krytyczne, 11 – niebezpieczne, 29 – średniego ryzyka i 26 – niegroźne.
Drugi etap audytu został przeprowadzony od lutego do marca i obejmował mniej istotne narzędzia, które nie zostały sprawdzone w pierwszym etapie. W drugim etapie znaleziono 40 podatności, których niebezpieczeństwo na razie nie zostało określone (raport planuje się opublikować później). Informacje o wszystkich zidentyfikowanych problemach już przekazano deweloperom uutils, a większa część podatności została rozwiązana w wersjach uutils 0.5-0.8 bez dodatkowego rozgłosu i bez oznaczenia połączenia wprowadzanych poprawek z usunięciem podatności.
Pakiet rust-coreutils został domyślnie włączony w jesiennej wersji Ubuntu 25.10, ale w związku z wykrytymi w trakcie audytu problemami w gałęzi LTS Ubuntu 26.04 przywrócono narzędzia cp, mv i rm z zestawu GNU Coreutils. Zauważono, że na dzień 22 kwietnia w tych narzędziach pozostaje 8 znanych stanów wyścigu, które nie zostały naprawione. Pozostałe narzędzia zostały użyte w wersji rust-coreutils 0.8.0. W Ubuntu 26.10 deweloperzy planują całkowicie przejść na rust-coreutils.
Podatności w narzędziach systemowych są niebezpieczne, ponieważ są wykorzystywane w skryptach uruchamianych z uprawnieniami root. Na przykład, usunięta w wersji uutils coreutils 0.3.0 podatność w narzędziu rm mogła być wykorzystywana podczas codziennego uruchamiania ze skryptu cron /etc/cron.daily/apport, który jest wykonywany z uprawnieniami root i rekurencyjnie usuwa zawartość katalogu /var/crash, dostępnego do zapisu dla wszystkich użytkowników w systemie.
Wśród podatności oznaczonych w pierwszym raporcie jako krytyczne:
- Vulnerability in the chroot utility caused by handling the ‘—userspec’ option after the chroot() call, but before privilege dropping. On systems with glibc, resolving names through the getpwnam() function leads to reading the /etc/nsswitch.conf file used in NSS (Name Service Switch) and dynamically loading the libraries specified therein with NSS modules (libnss_*.so.2). Since the chroot() call is executed before processing NSS, the /etc/nsswitch.conf file is loaded relative to the new root, but NSS libraries are loaded before privilege dropping. If a user has write access to the new root, they can substitute their own NSS libraries and achieve code execution with root privileges.
- Changing file permissions after a failure to create a named pipe (FIFO) with the mkfifo utility — if an existing file is specified as an argument, mkfifo will return an error, but will not crash; instead, it will call set_permissions() and change the permissions of the existing file. Considering umask 022, the vulnerability allows changing file permissions to 644 (rw-r--r--) and gaining access to files that were not allowed for reading.
- Bypassing the ‘—preserve-root’ restrictions in the chmod utility that prevent recursive operations relative to the root of the filesystem. The vulnerability (CVE-2026-35338) occurs because the code was only checking for an exact match of the path with ‘/’ and did not perform path canonicalization. To bypass the check, it is sufficient to use a path like ‘/../’ or a symbolic link to the root. The vulnerability is dangerous because if a custom path can be injected into a system script that calls the chmod command, it could enable recursive permission changes for all files in the filesystem.
- In the rm utility, any abbreviations for the ‘—no-preserve-root’ option (‘—n’, ‘—no’, ‘—no-p’, ‘—no-pres’, etc.) were allowed to disable the protection against executing recursive operations with the root (for example, it is possible to specify ‘rm -rf —n /’ and accidentally delete all data. In GNU Coreutils, such abbreviated options are prohibited.
- Bypassing the ‘—preserve-root’ restrictions in the rm utility that prevent recursive operations relative to the root of the filesystem through the substitution of a symbolic link to ‘/’.
- Lack of comprehensive protection against specifying directories that start with a dot. For example, executing ‘rm -rf .’ will produce an error, but specifying ‘rm -rf ./’ or ‘rm -rf .///’ will silently remove the current directory.
- Błąd w kodzie analizy argumentów narzędzia kill pozwala wysłać sygnał do wszystkich procesów w systemie, gdy wskaźnik procesu wynosi „-1” (kill -1).
Pozostała część większości luk bezpieczeństwa należy do klasy TOCTOU (Time-Of-Check-To-Time-Of-Use), co oznacza, że występuje warunek wyścigu, który umożliwia zmianę danych w momencie po sprawdzeniu poprawności informacji, ale przed wykonaniem operacji na nich, na przykład, podmienienie pliku na symboliczną linkę w momencie pomiędzy zakończeniem weryfikacji a rozpoczęciem wykonywania operacji. W kontekście użycia narzędzi cp i mv w skryptach systemowych uruchamianych z uprawnieniami root, takie luki pozwalają na skopiowanie lub nadpisanie dowolnych plików.
Źródło: opennet.ru
