我使用OpenBSD的5.3作爲Parallels的來賓操作系統爲Mac全新安裝:爲什麼不在OpenBSD中設置SUID位將有效並保存的UID設置爲可執行文件所有者?
$ uname -a
OpenBSD openbsd.localdomain 5.3 GENERIC#53 amd64
令我驚訝的是,通過與它的SUID根位設置擁有的二進制文件,UID的運行彷彿SUID是沒有設置。也就是說,當UID 1000運行這樣的程序,該程序的啓動狀態:
<real_uid, effective_uid, saved_uid> = <1000, 1000, 1000>
不狀態
和:
<real_uid, effective_uid, saved_uid> = <1000, 0, 0>
預期。
爲什麼會出現這種情況?
下面是關於如何我發現這個問題的細節:
我已經寫在不同的Unix系統評估setuid行爲的交互式C程序(編譯爲 setuid_min.bin)。該程序位於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是的setuid_min.bin進程的PID 。該項目通過報告下面的shell命令的輸出報告的實際UID,有效UID,並保存UID:
ps -ao ruid,uid,svuid,pid | grep '[ ]my_pid$'
其中 my_pid是PID由 GETPID()報道。我唯一能猜出爲什麼會出現這種情況的原因是,OpenBSD有一些基本的權限結構,它使用的是目錄的所有權/權限,其中 setuid_min.bin所在的目錄的所有權/權限,或者當沒有特權時,實際上並未改變所有權/ SUID位用戶使用 sudo更改文件權限。