Capability-безопасность в Redox: пространства имён и рабочий каталог стали дескрипторами

17.03.2026

В Redox пространства имён перестали быть числовым идентификатором в ядре и стали файловыми дескрипторами, а рабочий каталог теперь хранится дескриптором, а не строкой пути. Ядро перестало знать имена схем и разбирать пути — за это отвечает userspace-сервис на Rust.

Как устроен доступ к файлам в Redox

Файл в Redox доступен по пути вида /scheme/имя/путь. Такой путь однозначен только если известен корень: одна и та же запись /file в разных схемах указывает на разные файлы. Поэтому каждому процессу нужно пространство имён — набор корней, — а внутри него работа с каталогом идёт по относительному пути от текущего каталога процесса.

Что было не так

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

Рабочий каталог был строкой. Чтобы выполнить операцию с относительным путём, relibc склеивала её с абсолютным, получала готовый путь и передавала в ядро. Никакой возможности ограничить, куда программа может зайти, из этого не следовало.

Пространство имён как дескриптор

Пространство имён стало обычным файловым дескриптором, которым управляет redox-rt. Между приложением и схемами появился userspace-демон nsmgr: приложение оперирует только относительно своего дескриптора, а nsmgr разбирает путь с корнем схемы и передаёт вызов нужной схеме.

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

Рабочий каталог как capability

В relibc рабочий каталог теперь хранится дескриптором, а не строкой. Когда программа передаёт относительный путь или специальное значение AT_FDCWD, relibc вызывает внутренний openat с дескриптором каталога. Преобразовывать относительный путь в абсолютный больше не нужно — и не нужно проходить через ядро, чтобы это сделать.

Что из этого следует

Основной вывод — механизм песочницы. Если ограничить все обращения программы одним дескриптором каталога, программа физически не увидит ничего за его пределами. На этой основе в relibc реализован O_RESOLVE_BENEATH: флаг на дескрипторе запрещает выход вверх через ../.

Сам приём не нов — в Linux похожее делает openat2 с RESOLVE_BENEATH. Здесь он сделан на уровне userspace-сервиса, а не в ядре. Для кода на Rust это естественно ложится на абстракции вида «каталог-дескриптор вместо пути»: тот же cap-std, что и на Linux, начинает работать на Redox.

Инструменты для песочницы автор объявил планом на будущее, а не готовой функцией.

Оригинал

Статья «Capability-based Security for Redox: Namespace and CWD as capabilities» от 17 марта 2026 года; переход подтверждён коммитом refactor: Reimplement the *at functions using openat and CWD fd от 1 марта в репозитории redox-os/relibc

Упоминаний: 1 · Просмотров: 2