LINUX.ORG.RU

В Rust Coreutils выявлено 113 уязвимостей. В Ubuntu 26.04 возвращены cp, mv и rm из GNU Coreutils

 , ,


1

5

Компания Canonical опубликовала предварительные итоги внешнего аудита безопасности инструментария uutils coreutils (Rust Coreutils), написанного на языке Rust и частично применяемого в Ubuntu вместо пакета GNU Coreutils. Аудит был выполнен компанией Zellic, имеющей опыт анализа уязвимостей в проектах на языке Rust. В ходе проверки было выявлено 113 проблем с безопасностью.

В настоящее время уже доступен отчёт с результатами первого этапа аудита, охватывающего наиболее важные утилиты из набора uutils. На первом этапе, который был проведён с декабря 2025 по январь 2026 года, было выявлено 73 уязвимости, из которых 7 отмечены как критические, 11 - опасные, 29 - средней опасности и 26 - неопасные.

Информация о всех выявленных проблемах уже передана разработчикам 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).

>>> Источник

★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)

ну что и требовалось доказать

вайбкодеры и ai-дегенераты думали что им поможет «защищенный» язык rust :)

Reset ★★★★★
()
Ответ на: комментарий от vbr

Хватит лукавить уже с параметрами оптимизации компилятора :) Если выкинуть твой O3 - то выход будет такой: «1 >= -2147483648»

DrRulez ★★★★★
()
Ответ на: комментарий от unixnik

Хотели поразить искушённую аудиторию чистотой кода и отсутствием багов, но как водится очень жидко обделались.

Byers
()
Ответ на: комментарий от DrRulez

А я не лукавлю, я пытаюсь наглядно показать, что утверждение про «делает ровно то, что программист написал» это очень натянуто. В C куча подводных камней, на которые наткнуться как нефиг делать. А без оптимизации программы не собирают.

PS сейчас придёт firkax и расскажет про ftrapv.

vbr ★★★★★
()
Ответ на: комментарий от vbr

А без оптимизации программы не собирают.

Программы собирают так, чтоб они работали. если после сборки получается то, что получилось у тебя, то таких оптимизаторов надо пороть ! :)

DrRulez ★★★★★
()
Ответ на: комментарий от vbr

Не ftrapv а -fwrapv, и это стандарт для сборки ядра нашей ОС.

firkax ★★★★★
()
Ответ на: комментарий от DrRulez

таких оптимизаторов надо пороть

Это, конечно, было бы хорошо, но пока скорей порют они программистов, хм.

vbr ★★★★★
()
Ответ на: комментарий от DrRulez

тут проблема не в оптимизаторе, а в кривом коде если хочется такое писать то надо делать беззнаковую арифметику и знаковое сравнение, причем явным образом (через касты)

Reset ★★★★★
()
Ответ на: комментарий от vbr

порют они программистов

ЭТО - даже не обсуждается. ТРИ раза в день. - минимум !

DrRulez ★★★★★
()
Ответ на: комментарий от DrRulez

А тот-ли это яп, которые тебе нужен

Дык поэтому С и заменяют на Rust: как только начинают задумываться то для всех тех случаев когда раньше использовался С теперь предпочтительный ответ это Rust.

Единственное исключение это когда кодовая база настолько большая что переписать её за один подход просто нереально - поэтому в ядро линукса Rust внедряют очень постепенно. Но это именно что временное исключение.

Конечно ещё возможен вариант «я не знаю Rust», но он разрешается либо через «а почему это я больше тут не работаю?», либо через «наконец-то ИИ объяснил как работает borrow checker».

zabbal ★★★★☆
()
Ответ на: комментарий от unixnik

Чтобы можно было добавлять новые фичи, не боясь поломать код и не тратя человеко-годы на каждую мелочь.

unC0Rr ★★★★★
()
Ответ на: комментарий от Reset

Это - понятно. Пример просто кривоват как по мне. Это пример показал не какую-то кривизну языка Си, как такового, а результат оптимизации gcc, примененный к коду, к которому данный вариант оптимизации применять нельзя.

Вывод, собственно, как и предполагалось - человек не знал, что делает. - получил неверный результат (не тот, что хотел), а знал-бы - не было-бы данного параметра. Но ты - безусловно прав. Сам код так-же написан таким образом, чтоб показывать неверный результат, в случае применения данной оптимизации компилятором gcc

DrRulez ★★★★★
()
Ответ на: комментарий от kaldeon

я не понимаю как update-alternatives может добавить хоть какую-то корректность

И разрабы рача не понимают. Именно поэтому у них и вышло такое убогое поделие, отстающее даже от убунты. Понятно что это за счёт базы в виде дебьяна, но всё-равно впечатляет.

дихотомии «иногда ломающаяся простота vs всегда корректное переусложнение» вообще не существует

Ну вот в раче как раз и сделали всегда ломающееся переусложнение - когда операции, в любом другом дистре выполняющиеся автоматически, тут приходится делать вручную. Ну или не приходится потому что очередное обновление снова сломало всё до незагружаемого состояния.

zabbal ★★★★☆
()
Ответ на: комментарий от scanner

раст — совершенный язык?

Он точно совершеннее С во всех аспектах - этого вполне достаточно для начала замены дырявого старья. Чем, собственно, народ и занят. Наблюдение за сопутствующим пригаром неосиляторов - это отдельное изысканное удовольствие, за которое я дополнительно благодарен этому замечательному ЯП :)

zabbal ★★★★☆
()
Ответ на: комментарий от zabbal

начала замены дырявого старья

Только вот заменять пытаются проверенный софт на дырявое новьё, данная тема как раз об этом.

firkax ★★★★★
()

И ведь никто в этом милом и добром чатике не написал, что rust coreutils под MIT лицензией. Растеры и тут выпендрились.

kaafree
()
Последнее исправление: kaafree (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

почему для ключевых компонентов ОС не применяются жесткие стандарты кодирования

Применяются, погугли про MISRA.

режима работы ПО, чтобы потенциальные опасности выявлялись

Тоже есть. Проблема не в отсутствии возможности писать безопасно, а в том что их использование удорожает разработку не в разы даже, а на порядки. Есть надежда что с массовым внедрением ИИ на том же Lean с формальной верификацией можно будет делать и неакадемические вещи, но пока этого не случилось Rust вполне разумный компромисс: безопасность повышает значительно, а порог вхождения - вполне приемлемо. Конечно находятся громогласные идиоты, которые даже столь небольшую ступеньку осилить не могут, но они влияют только на ржачь по форумам, а не на стоимость разработки по счастью.

zabbal ★★★★☆
()

Всего вторая страница обсуждения, а в комментах уже дважды прорвался zabbal. Норм пошло.

Но кто додумался притащить обсуждение знаковой арифметики Сишки сюда - моё почтение, хорошая попытка наброса.

wandrien ★★★★
()
Ответ на: комментарий от DrRulez

Кое-кто стандартов не читал, про UB не знает и во всем винит компилятор.

Эх, классика. Такой Си программист потерян для рынка труда.

a1ba ★★★★
()
Ответ на: комментарий от unixnik

Я так и не понял

Тут без сюрпризов - никто вроде и не надеялся.

что они хотели изобразить этим переписыванием

Сделать безопаснее без потери функциональности. Что характерно - получилось.

zabbal ★★★★☆
()
Ответ на: комментарий от zabbal

Что характерно - получилось.

Оно и видно.

Я вот думаю что главная причина это «MIT License». Всё остальное надуманное.

unixnik ★★★★★
()
Последнее исправление: unixnik (всего исправлений: 1)
Ответ на: комментарий от zabbal

тебе домашнее задание: реализовать bit_cast для C

Reset ★★★★★
()
Ответ на: комментарий от kaafree

не написал, что rust coreutils под MIT лицензией

Ты и этого без подсказок не знал?

Ну закинь донат в https://rust-gcc.github.io/ - будет тебе Rust под правильной лицензией. Тогда, глядишь, и GNU подтянется до современного уровня.

zabbal ★★★★☆
()
Ответ на: комментарий от wandrien

Кстати таки да, раз в 10 лет рожать новый ЯП ещё «безопаснее» предыдущего и начинать всё переписывать, это ж какие перспективы, какой фронт работ.

Byers
()
Ответ на: комментарий от vbr

Не, ну это только у растоманов регистры резиновые. Магия рантайма, одним словом.

BceM_IIpuBeT ★★☆☆☆
()
Ответ на: комментарий от zabbal

Тем кто умеет читать - действительно видно.

Так я же говорю, вижу, как не вижу?

На твой счёт я иллюзий и так не питал.

А должен был? Прости, но я что-то даже не переживаю.

unixnik ★★★★★
()
Ответ на: комментарий от BceM_IIpuBeT

Он прокиснет после очередного amazing обновления.

С чего бы вдруг? Это ж не питон какой-нибудь где с 2 на 3 переходили долго и со скрипом.

zabbal ★★★★☆
()
Ответ на: комментарий от Reset

компилятор не баба ванга чтобы определять можно или нельзя применять

Так и я про то. Что указали, то и получили.

DrRulez ★★★★★
()
Ответ на: комментарий от zabbal

Мнение ИИ про rust :)

«Rust — это язык, который превращает программистов в юристов». Вместо решения задачи ты доказываешь borrow checker’у, что твой код не украдет память. Компилятор — тиран, который не верит тебе на слово даже в очевидных вещах.

«Синтаксис? Адово месиво из ’<> и ’a и ::<>>()». Обычный смертный не прочитает сигнатуру метода с трейтами, временами жизни и дженериками. Ты пишешь код или диссертацию по типологии?

«Время компиляции — вечность». Пока cargo build дособерется, на Go можно написать микросервис, запустить, продать стартап и уйти на пенсию.

«Асинхронный Rust — это отдельный вид изощренной пытки». Pin, Box, Arc<Mutex<>>, .await в не-асинхронных контекстах… Стандартная библиотека для async вообще дырявая, вынужден использовать сторонние крейты как модные аксессуары.

«Сообщество? Секта свидетелей безопасности». Любой вопрос «как сделать проще» встречает ответ: «ты неправильно понял владение, читай nomicon». Попробуй написать двусвязный список без unsafe — получишь PhD по эзотерике.

«Rust решает проблемы, которых у тебя нет». Тебе не нужен borrow checker для CRUD-микросервиса или скрипта. Но Rust все равно заставит тебя страдать, ибо «безопасность важнее удобства».

«Экосистема кажется большой, но половина крейтов заброшены». Нашел полезную библиотеку? А у нее последний коммит два года назад, и автор в README написал «используйте tokio напрямую».

«Кривая обучения — вертикальная стена, облитая маслом». После месяца Rust ты чувствуешь себя гением. Еще через месяц понимаешь, что не знаешь ничего. Это не язык, это психологическое испытание.

Byers
()
Ответ на: комментарий от zabbal

Да ладно, не хнычь - баттхёрт пройдёт, а код на Rust - останется.

Где-то в темных уголках далекого сервера вздохнул руби…

DrRulez ★★★★★
()
Ответ на: комментарий от BceM_IIpuBeT

Гебне надо бэкдоры в код совать. Но только так, чтобы незаметно.

Очень коварный план, очень. В штаны тебе тоже наверняка они насрали. Незаметно так, с глумливой ухмылкой. И облучатель за стенкой поставили - чтобы ты резко поглупел. Хотя подожди…

zabbal ★★★★☆
()
Ответ на: комментарий от Byers

Сразу видно, на каком ресурсе оно обучалось 🤣

BceM_IIpuBeT ★★☆☆☆
()
Ответ на: комментарий от Byers

Мнение ИИ про rust :)

И вот эти же клоуны потом плачутся что их на ИИ заменяют. Скорей бы уже :)

zabbal ★★★★☆
()
Ответ на: комментарий от zabbal

О, типикал нормисовский верун-растаман. Проснись, соня. Конспирологии больше нету.

BceM_IIpuBeT ★★☆☆☆
()
Ответ на: комментарий от Byers

Я тут тоже жаловался на время компиляции в раст, пока не попытался сделать софтину на плюсах с вебкитом. На 5-6 попытке собрать это (по 2,5-3 часа сборки на попытку) я плюнул.

Прости меня реактивный раст, ты был всегда прекрасен и быстр.

LightDiver ★★★★★
()

Циата в тему из Пелевина, в точности про люборастов и их поделия:

Дао Песдын. Сто восемь. О музыке.

Те, кто долго жил среди пидарасов, говорят, что они втайне стыдятся своего греха и стараются поразить всякими фокусами. Думают про себя так: «Да, я пидарас. Так уж вышло — что теперь делать... Но может быть, я гениальный пидарас! Вдруг я напишу удивительную музыку! Разве посмеют плохо говорить о гениальном музыканте...» И поэтому все время стараются придумать новую музыку, чтобы не стыдно было и дальше харить друг друга в дупло. И если б делали тихо, в специальном обитом пробкой месте, то всем было бы так же безразлично, как и то, что долбятся в сраку. Но их музыку приходится слушать каждый день, ибо заводят ее повсеместно. И потому не слышим ни ветра, ни моря, ни шороха листьев, ни пения птиц. А только один и тот же пустой и мертвый звук, которым хотят удивить, запуская его в небо под разными углами. Бывает, правда, что у пидарасов ломается музыкальная установка. В такие минуты спеши слушать тишину.
Stanson ★★★★★
()

Они думали, что rust заменяет мозги? Ну-ну...

Chord ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.