Parallels for Mac のゲスト OS として OpenBSD 5.3 の新規インストールを使用しています。
$ uname -a
OpenBSD openbsd.localdomain 5.3 GENERIC#53 amd64
驚いたことに、root が所有し、SUID ビットが設定されたバイナリ ファイルは、SUID が設定されていないかのように UID で実行されます。つまり、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 であることに注意してください。プログラムは、次のシェル コマンドの出力を報告することによって、実際の UID、有効な UID、および保存された UID を報告します。
ps -ao ruid,uid,svuid,pid | grep '[ ]my_pid$'
my_pidはgetpid()によって報告される pidです。これが当てはまる理由についての私の唯一の推測は、OpenBSD には、setuid_min.binが存在するディレクトリの所有権/アクセス権を使用している、または権限のないユーザーがsudoでファイルのパーミッションを変更します。