UbuntuではSetUIDビットが機能しませんか?

UbuntuではSetUIDビットが機能しませんか?

SetUIDビットが設定されている実行可能ファイルは所有者として実行する必要があると思いますが、実際に再現することはできません。私は次を試しました。

$catprep.sh
cp /bin/bash 。
chownルート。ルートbash
chmod 4770 bash #確認済み
$ sudo sh prepare.sh
$ ./バッシュ
$id-u
1000
$ 終了
$
$cattest.c
#include<stdio.h>
#include<unistd.h>
整数メイン(){
    printf("%d,%d\n", getuid(), geteuid());
    0を返します。
}
$gcc -o testtest.c
$ chmod 4770テスト#確認済み
$sudo chown root.root テスト
$ ./テスト
1000,1000
$#なぜですか? ? ?

しかし、

$ su
# ./bash
#id-u
0
#。 /試験
0,0
#出口
#出口
$

注:マウントポイントは設定されてnosuidいません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.

リバースchownchmod注文は私にとって効果的です。

$ 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 に影響を与えないようです。

chmodchown2番目のケースで重要なのは、ムルが言ったように、この合計の順序です。回答済み。所有者を変更すると、setuid ビットがリセットされます。

答え3

テスト実行可能ファイルを含むファイルシステムが以下を使用している可能性があります。nosuidオプション;最新のディストリビューションでは、基本的にこれを行うと聞きました。これを適用するのにも良い主張が /tmpあります。カーネルがsetuidビットとsetgidビットを無視するようにします。/homenosuidみんなファイルシステム内の実行可能ファイルです。 (関連していない操作を実行すると発生します。目次setgidは影響を受けません。 )

関連情報