Леннарт Поттеринг представил утилиту run0, позволяющую выполнять процессы под идентификаторами других пользователей. Новая утилита позиционируется как более безопасная замена программы sudo, реализованная в форме надстройки над командой systemd-run и позволяющая избавиться от применения исполняемого файла с флагом SUID. Утилита run0 включена в состав выпуска systemd 256, который находится на стадии кандидата в релизы.
Отмечается, что смена идентификатора при помощи флага SUID в sudo сопряжена с дополнительными рисками, связанными с тем, что SUID-процесс наследует контекст исполнения, включающий множество свойств, контролируемых непривилегированным пользователей, таких как переменные окружения, файловые дескрипторы, параметры планировщика и привязки cgroup. Часть из подобных свойств автоматически очищается для SUID-процессов ядром, а часть – самим приложением. Тем не менее, в сложных SUID-программах, таких как sudo, продолжают регулярно находить уязвимости, вызванные неаккуратным обращением с внешними данными, на которое может влиять непривилегированный пользователь.
В run0 вместо использования SUID осуществляется обращение к системному менеджеру с запросом запуска командной оболочки или процесса с указанным идентификатором пользователя, создания нового псевдотерминала (PTY) и пересылки данных между ним и текущим терминалом (TTY). Подобное поведение больше напоминает запуск при помощи ssh, чем выполнение при помощи классического sudo. Привилегированный процесс запускается в изолированном контексте, который порождается процессом PID 1, а не процессом пользователя, т.е. не наследует свойства окружения пользователя, за исключением проброса переменной окружения $TERM. Проброс регулируется через список явно разрешённых свойств, вместо попыток запретить опасные свойства (концепция белого списка, вместо чёрного).
Для авторизации и определения возможностей пользователя в run0 используется Polkit. Классический язык описания правил (/etc/sudoers), применяемый в sudo, не поддерживается. Функциональность для запуска программ с другими привилегиями встроена в systemd-run, а команда run0 создаётся как символическая ссылка на systemd-run, при использовании которой предоставляется схожий с sudo интерфейс командной строки.
Из дополнительных возможностей run0 выделяется индикация работы с повышенными привилегиями через установку красноватого фона в терминале и добавление красной точки в заголовок окна. После прекращения выполнения с иными привилегиями точка исчезает, а фон меняется на обычный. Кроме того, run0 поддерживает все опции “systemd-run”, например, параметр “–property”, через который можно выставить произвольные настройки сервисов systemd (например, “CPUWeight=200 MemoryMax=2G IPAccounting=yes”).