Компания Canonical публикува предварителни резултати от независим одит на сигурността на инструмента uutils coreutils (Rust Coreutils), написан на езика Rust и частично използван в Ubuntu вместо пакета GNU Coreutils. Одитът е извършен от компанията Zellic, която има опит в анализа на уязвимости в проекти на езика Rust. По време на проверката са открити 113 проблема със сигурността.
В момента е наличен отчет (PDF, 156 страници) с резултатите от първия етап на одита, обхващащ най-важните утилити от наборa uutils. По време на първия етап, проведен от декември 2025 до януари 2026 г., са установени 73 уязвимости, от които 7 са отбелязани като критични, 11 — опасни, 29 — с умерен риск и 26 — неопасни.
Вторият етап на одита е извършен от февруари до март и обхваща второстепенни утилити, които не са проверени в първия етап. На втория етап са открити 40 уязвимости, опасността от които все още не е уточнена (отчетът ще бъде публикуван по-късно). Информацията за всички открити проблеми вече е предадена на разработчиците на uutils и по-голямата част от уязвимостите е била отстранена в версиите на uutils 0.5-0.8 без излишна публичност и бележки за връзките между направените корекции и отстраняването на уязвимостите.
Пакетът rust-coreutils беше включен по подразбиране в есенния релиз на Ubuntu 25.10, но с оглед на проблемите, идентифицирани в хода на одита, в LTS клоните на Ubuntu 26.04 утилитите cp, mv и rm от набора GNU Coreutils бяха възстановени. Обявява се, че към 22 април в тези утилити остават неотстранени 8 известни състояния на конфликти. Останалите утилити са извлечени от версията rust-coreutils 0.8.0. В Ubuntu 26.10 разработчиците смятат да преминат изцяло на rust-coreutils.
Уязвимостите в системните утилити са опасни, тъй като те се използват в скриптове, изпълнявани с права root. Например, уязвимостта, отстранена в версия uutils coreutils 0.3.0 в утилитата rm, би могла да бъде експлоатирана при редовно стартиране от cron скрипта /etc/cron.daily/apport, който се изпълнява с права root и рекурсивно изтрива съдържанието на директорията /var/crash, достъпна за запис за всички потребители в системата.
Сред уязвимостите, обозначени в първия отчет като критични:
- Уязвимост в утилитата chroot, предизвикана от обработката на опцията «—userspec» след извикване на chroot(), но преди нулиране на привилегиите. На системи с glibc разрешаването на имена чрез функцията getpwnam() води до четене на файла /etc/nsswitch.conf, използван в NSS (Name Service Switch), и динамично зареждане на посочените в него библиотеки с модули NSS (libnss_*.so.2). Тъй като преди обработката на NSS се извиква chroot(), файлът /etc/nsswitch.conf се зарежда относително към новия корен, но библиотеки NSS се зареждат преди нулирането на привилегиите. Ако потребителят има разрешение за запис в новия корен, той може да подмени своите NSS-библиотеки и да постигне изпълнение на код с права root.
- Промяна на правата за достъп до файл след срив на създаването на именуван канал (FIFO) от утилитата mkfifo — ако се укаже съществуващ файл като аргумент, mkfifo ще върне грешка, но при това аварийно няма да приключи работата си, а ще извърши извикване на set_permissions() и ще промени правата за достъп до съществуващия файл. С оглед на umask 022, уязвимостта позволява промяна на правата за достъп до файла на 644 (rw-r--r--) и получаване на достъп до файлове, за които не е било разрешено четене.
- Пробив на ограниченията «—preserve-root» в утилитата chmod, които забраняват извършването на рекурсивни операции относно корена на ФС. Уязвимостта (CVE-2026-35338) е причинена от факта, че в кода се проверяваше само точното съвпадение на пътя с «/» и не се извършваше канонизация на файловия път. За обход на проверката е достатъчно да се използва път от вида «/../» или символична връзка към корена. Уязвимостта е опасна, тъй като при възможността да подмените своя път в системния скрипт, извикващ командата chmod, можете да постигнете рекурсивна промяна на правата за достъп за всички файлове в ФС.
- В утилитата rm се допускаше обработка на всякакви съкращения на опцията «—no-preserve-root» («—n», «—no», «—no-p», «—no-pres» и т.н.) за изключване на защитата срещу извършване на рекурсивна операция с корена (например, можеше да се укаже «rm -rf —n /» и случайно да се изтрият всички данни. В GNU Coreutils подобни съкратени опции са забранени.
- Обход на ограниченията „—preserve-root“ в утилитата rm, които забраняват извършването на рекурсивни операции спрямо корена на файловата система, чрез подмяна на символична връзка с „/“.
- Липсва пълна защита срещу указването на каталози, започващи с точка. Например, при изпълнение на „rm -rf .“ утилитата ще изведе грешка, но при указване на „rm -rf ./“ или „rm -rf .///“ тихо ще премахне текущия каталог.
- Грешка в кода за разбиране на аргументите в утилитата kill позволява изпращането на сигнал до всички процеси в системата при указване на идентификатора на процеса „-1“ (kill -1).
В останалата част повечето уязвимости спадат към класа TOCTOU (Time-Of-Check-To-Time-Of-Use), което предполага наличие на състезание, позволяващо променяне на данните в момента след проверката на коректността на информацията, но преди изпълнението на операцията с тях, например, подмяна на файл с символична връзка в момента между завършването на проверката и началото на изпълнението на операцията. В контекста на използването на утилитите cp и mv в системни скриптове, стартирани с права root, подобни уязвимости позволяват копиране или презаписване на произволни файлове.
Източник: opennet.ru
