Ubuntu で SetUID ビットが機能しないのはなぜですか?

Ubuntu で SetUID ビットが機能しないのはなぜですか?

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
# 出口
# 出口
$

注: マウント ポイントにはnosuidNOR が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 には影響しないようです

chmod2番目のケースでは、との順序がchown重要であり、muruはすでに答えた所有者を変更すると、setuid ビットがリセットされます。

答え3

また、テスト実行ファイルを含むファイルシステムが、nosuidオプション; 新しいディストリビューションでは に対してデフォルトでこれを実行すると聞いていますが、にも /tmp適用するべきという主張もあります。カーネルが の setuid および setgid ビットを無視するようにします。/homenosuid全てファイルシステム内の実行ファイル。(ディレクトリsetgid は影響を受けません。

関連情報