Спорная ошибка в systemd, позволяющая повысить привилегии, закрыта без исправления

02.07.2017 18:37

В systemd выявлена ошибка, приводящая к выполнению сервисов с правами другого пользвователя, если в параметрах запуска указано имя пользователя, начинающееся с цифры. Например, если в сервисе указан "User=0day" и пользователь 0day присутствует в системе, то сервис будет запущен с идентификатором 0, т.е. с правами root. Леннарт Поттеринг отказался исправлять ошибку и закрыл уведомление с меткой "not-a-bug".

Позиция Поттеринга: В Linux исторически не разрешено использовать имена пользователей, начинающиеся с цифры, которые считаются некорректными. Например, в утилитах из состава shadow-utils применяется ограничение "[a-z_][a-z0-9_-]*[$]". Подобное ограничение принято чтобы избежать путаницы между передачей UID и имени пользователя в качестве аргументов типовых утилит. Если имя начинается с цифры, то цифровая часть воспринимается как цифровой идентификатор пользователя (UID), поэтому имя 0day будет обработано как UID 0.

Аргументы сторонников исправления подобного поведения: Фактически ограничение на использование цифр в именах в современных реалиях повсеместно не применяется, например, начиная с RHEL 7/CentOS 7 штатный инструментарий дистрибутива позволяет создавать и использовать пользователей, имена которых начинаются с цифры. Стандарт POSIX/IEEE Std 1003.1-2001 не накладывает ограничений по использованию цифр в именах пользователей, а в ситуациях когда допускается обработка и имени и UID требует вначале проверять наличие имени пользователя, и если оно отсутствует воспринимать цифровой идентификатор как UID. В утилитах GNU рекомендуется явно выделять цифровые идентификаторы префиксом "+".

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