Проект Prossimo перепишет sudo и su на Rust

xwo5wtep98tszk7b2dwtvmd1gjg.pngКоманды разработчиков из Ferrous Systems и Tweede Golf при финансовой поддержке Amazon Web Services начали работы по реализации sudo и su на Rust. Об этом 26 апреля объявил Prossimo — проект Internet Security Research Group, в рамках которого идут планирование и координация деятельности по замене программного обеспечения на небезопасных при работе с памятью языках.

Активность в репозитории sudo-rs на GitHub началась ещё в январе этого года, но процесс продолжается, и к реальному использованию продукт пока не готов.
За Prossimo стоит благотворительная некоммерческая корпорация Internet Security Research Group, которая также создала проекты Let«s Encrypt (бесплатные криптографические сертификаты X.509 для TLS) и Divvi Up (сфокусированный на уважении к приватности пользователей сервис статистики).

Миссия Prossimo — переписать ключевые свободные программные продукты на безопасном при работе с памятью языке, избавив их от уязвимостей кода на C и C++. Так проект надеется изменить само восприятие софта до такой степени, чтобы безопасность доступа к памяти считалась обязательным качеством для программного обеспечения.

Программ на C и C++ в мире много, чаще всего они и так неплохо работают. Цели Prossimo выбирает по нескольким факторам:

  • Широко используется: на почти каждом сервере и/или клиенте.
  • Работает на сетевом уровне и/или имеет критическую функцию.
  • Написана на небезопасном при работе с памятью языке (C, C++, язык ассемблера и так далее), ключевые компоненты поддаются лёгкой замене.
  • Спонсор согласен профинансировать работы, а мейнтейнеры готовы сотрудничать.


На главной странице memorysafety.org перечислены несколько инициатив, к которым проект успел приложить руку. Это, например, декодер стандарта сжатия видео AV1, сервер и клиент синхронизации времени NTP и резольвер DNS — все переписаны на Rust, но на разных стадиях работ и не всегда готовы к реальному использованию. В других случаях Prossimo пытается помочь встроить инструменты на Rust или интегрировать модули: для curl протолкнули безопасные библиотеки TLS и HTTP, а для Linux добились поддержки драйверов на Rust в ядре.

sudo — консольная утилита Unix-подобных операционных систем для запуска команд с привилегиями другого пользователя, по умолчанию — суперпользователя root. Хорошей практикой безопасности считается ограничить права обычных пользователей системы и, при необходимости привилегий root, не входить под суперпользователя командой su без аргументов, а вызывать команды с помощью sudo. В некоторых случаях также ограничивают команды, которые могут вызываться из под sudo.

Как sudo, так и su хорошо попадают в многие из факторов отбора: это не новомодный doas, а популярные компоненты с историей из семидесятых и восьмидесятых годов прошлого века, заслужившие статус стандартного компонента Unix-подобных систем. Также в них регулярно находятся уязвимости: 172 различных записи базы данных CVE (Common Vulnerabilities and Exposures) упоминают sudo. Многие из «дыр» связаны с ошибками доступа к памяти: выход за пределы массива (CVE-2022–43995), переполнение буфера (CVE-2021–3156), а в этом году в sudo нашлась уязвимость double free (CVE-2023–27320).

Возможности sudo и su в sudo-rs напишут с нуля на Rust — языке программирования, в котором реализуются механики безопасности доступа к памяти. Rust всё чаще используют и рекомендуют в индустрии: он стал одним из основных языков для Android, Microsoft объявила о намерении переписать на нём ядро и часть библиотек Windows, а Агентство национальной безопасности США призывает отказаться от C и C++, называя в качестве одной из замен Rust.

Код sudo-rs распространяется под лицензиями MIT и Apache 2.0. Это куда лучше, чем неразбериха в лицензии sudo.

Процесс разработки только начинается. Документация предупреждает:

  • Продукт не готов для реального использования, он рекомендуется для тестирования и разработки. Например, для запуска в системе придётся указать переменную окружения SUDO_RS_IS_UNSTABLE на значение I accept that my system may break unexpectedly.
  • Поддерживаются системы на Linux. На других Unix-подобных системах sudo-rs может заработать, но без поддержки.
  • Аутентификация в sudo-rs идёт только через PAM, компонент должен присутствовать в системе.


Некоторые из фич sudo не в приоритете. Авторы sudo-rs объясняют, что оригинал имеет глубокую историю, и некоторые из функций актуальны только для устаревших систем. Оценку, какие части взять, а какие выкинуть, обещают проводить на основе критериев современности, реальной востребованности и безопасности.

Вариант su на Rust будет проще оригинала, в программу добавят только базовую функциональность. Вообще, отдельного репозитория для клона su нет: документация объясняет, что из кирпичиков реализации sudo построят поведение su.

Prossimo разбила план работ над sudo-rs на 5 этапов (от 0 до 4). Реализация su планируется, например, на этапе 2, а на последнем этапе добавят корпоративные функции.

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

github.com/memorysafety/sudo-rs

© Habrahabr.ru