Я использую новую установку OpenBSD 5.3 в качестве гостевой ОС на Parallels для Mac:Почему не задан бит SUID в OpenBSD, установите эффективные и сохраненные UID для исполняемого файла?
$ uname -a
OpenBSD openbsd.localdomain 5.3 GENERIC#53 amd64
К моему удивлению, двоичный файл принадлежит корень с его SUID битом работает с UIDs, как если бы SUID был не задано. То есть, когда UID 1000 работает такая программа, программа запускается в состоянии:
<real_uid, effective_uid, saved_uid> = <1000, 1000, 1000>
и не в состоянии:
<real_uid, effective_uid, saved_uid> = <1000, 0, 0>
, как и ожидалось.
Почему это так?
Вот подробности относительно того, как я нашел проблему:
Я написал интерактивную программу C (скомпилированную как setuid_min.bin) для оценки Setuid поведения в различных системах Unix. Программа находится в подкаталоге домашнего каталога UID 1000, а команда sudo используется для изменения прав собственности и SUID; то программа запускается и я вхожу в Uid сообщать о реальной, эффективной и спас UIDs процесса:
$ sudo chown root:staff setuid_min.bin
$ ls -l | grep 'setuid_min\.bin$'
-rwxr-xr-x 1 root staff [...] setuid_min.bin
$ sudo chmod a+s setuid_min.bin
$ ls -l | grep 'setuid_min\.bin$'
-rwsr-sr-x 1 root staff [...] setuid_min.bin
$ ./setuid_min.bin
uid
1000 1000 1000 some_pid
exit
$
Обратите внимание, что some_pid выше ИДП в setuid_min.bin процесса , Программа сообщает реальный UID, эффективный UID и сохраненный UID, сообщая вывод следующей команды оболочки:
ps -ao ruid,uid,svuid,pid | grep '[ ]my_pid$'
где my_pid является Идентификатор сообщает GETPID(). Мое единственное предположение о том, почему это может быть так, заключается в том, что OpenBSD имеет некоторую базовую структуру разрешений, которая использует права собственности/разрешения каталога, в котором находится setuid_min.bin, или это фактически не изменяет бит собственности/SUID, когда непривилегированный пользователь использует sudo для изменения прав доступа к файлам.