SetUID ビットが設定された実行可能ファイルは所有者として実行されるはずですが、実際に再現することはできません。次のことを試しました。
$ 猫準備.sh /bin/bash を実行します。 chown root.root bash chmod 4770 bash # 検証済み $ sudo sh 準備.sh $ ./bash $ id -u 1000 $ 終了 $
$ 猫テスト.c #include<stdio.h> #include<unistd.h> int main(){ printf("%d,%d\n", getuid(), geteuid()); 0を返します。 } $ gcc -o テスト test.c $ chmod 4770 テスト # 検証済み $ sudo chown root.root テスト $ ./テスト 1000,1000 $ # なぜ???
しかし
$ ス # ./bash # id -u 0 # 。/テスト 0,0 # 出口 # 出口 $
注: マウント ポイントにはnosuid
NOR がnoexec
設定されていません。Ubuntu
16.04 LTS で動作しない理由を説明できる人はいますか?
答え1
コンパイルされた実行ファイルの場合、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
答え2
最初のケースでは、Bash は setuid として実行されることを好みません。
Bash が実効ユーザー (グループ) ID と実際のユーザー (グループ) ID が等しくない状態で起動され、実効ユーザー ID が実際のユーザー ID に設定される。
見る:Bash の起動ファイルに関するマニュアル、 またSetuid ビットは bash には影響しないようです。
chmod
2番目のケースでは、との順序がchown
重要であり、muruはすでに答えた所有者を変更すると、setuid ビットがリセットされます。
答え3
また、テスト実行ファイルを含むファイルシステムが、nosuid
オプション; 新しいディストリビューションでは に対してデフォルトでこれを実行すると聞いていますが、にも /tmp
適用するべきという主張もあります。カーネルが の setuid および setgid ビットを無視するようにします。/home
nosuid
全てファイルシステム内の実行ファイル。(ディレクトリsetgid は影響を受けません。