SetUIDビットが設定された実行可能ファイルが所有者として実行されているはずですが、実際には再現できません。以下を試しました。
$ cat prepare.sh cp/bin/bash。 chown root.root bash chmod 4770 bash#Verified $ Sudo sh prepare .sh $ ./bash $ id -u 1000 $ exit $
$ cat test.c #include <stdio.h> #include <unistd.h> int main(){ printf ( "%d、%d\n"、getuid()、geteuid()); return 0; } $ gcc -o test test.c $ chmod 4770 test#Verified $ Sudo chown root.root test $ ./test 1000,1000 $#なぜですか???
しかしながら
$ su #./bash # id -u 0 #./test 0,0 #exit #exit $
注:マウントポイントにはnosuid
もnoexec
も設定されていません。
Ubuntu 16.04 LTSで動作しない理由を誰かが説明できますか?
コンパイルされた実行可能ファイルの場合、 man 2 chown
:
When the owner or group of an executable file are changed by an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared. POSIX
does not specify whether this also should happen when root does the
chown(); the Linux behavior depends on the kernel version.
chown
とchmod
の順序を逆にするとうまくいきます:
$ Sudo chmod 4770 foo
$ Sudo chown root:root foo
$ stat foo
File: 'foo'
Size: 8712 Blocks: 24 IO Block: 4096 regular file
Device: 801h/2049d Inode: 967977 Links: 1
Access: (0770/-rwxrwx---) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-04-18 15:15:15.074425000 +0900
Modify: 2017-04-18 15:15:15.074425000 +0900
Change: 2017-04-18 15:15:33.683725000 +0900
Birth: -
$ Sudo chmod 4777 foo
$ ./foo
1000,0
最初のケースでは、setuidとして実行されたくないのはBashです。
実効ユーザー(グループ)IDが実際のユーザー(グループ)IDと等しくない状態でBashが開始された場合、実効ユーザーIDは実際のユーザーIDに設定されます。
参照: スタートアップファイルに関するBashのマニュアル 、また Setuidビットはbashに影響しないようです 。
2番目の場合、重要なのはchmod
とchown
の順序です。muruはすでに answered です。所有者を変更すると、setuidビットがリセットされます。
また、テスト実行可能ファイルを含むファイルシステムが nosuid
オプション でマウントされた可能性もあります。新しいディストリビューションはデフォルトで/tmp
に対してこれを行うと聞いたことがあります。これを/home
に適用することについても適切な議論があります。 nosuid
を指定すると、カーネルはファイルシステム内のall実行可能ファイルのsetuidビットとsetgidビットを無視します。 (ディレクトリsetgidを作成するときに発生する無関係なことは影響を受けません。)