Я использую свежую установку OpenBSD 5.3 в качестве гостевой ОС на Parallels для Mac:
$ uname -a
OpenBSD openbsd.localdomain 5.3 GENERIC#53 amd64
К моему удивлению, двоичный файл, принадлежащий пользователю root с установленным битом SUID, работает с UID, как если бы 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, чтобы сообщить реальные, эффективные и сохраненные UID процесса:
$ 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 выше - это pid процесса setuid_min.bin. Программа сообщает реальный UID, эффективный UID и сохраненный UID, сообщая вывод следующей команды оболочки:
ps -ao ruid,uid,svuid,pid | grep '[ ]my_pid$'
где my_pid - идентификатор pid, о котором сообщает getpid (). Мое единственное предположение относительно того, почему это может быть так, заключается в том, что OpenBSD имеет некоторую базовую структуру разрешений, которая использует владение / разрешения каталога, в котором находится setuid_min.bin, или фактически не меняет владельца / Бит SUID, когда непривилегированный пользователь использует sudo для изменения прав доступа к файлам.