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.
リバース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
chown
2番目のケースで重要なのは、ムルが言ったように、この合計の順序です。回答済み。所有者を変更すると、setuid ビットがリセットされます。
答え3
テスト実行可能ファイルを含むファイルシステムが以下を使用している可能性があります。nosuid
オプション;最新のディストリビューションでは、基本的にこれを行うと聞きました。これを適用するのにも良い主張が /tmp
あります。カーネルがsetuidビットとsetgidビットを無視するようにします。/home
nosuid
みんなファイルシステム内の実行可能ファイルです。 (関連していない操作を実行すると発生します。目次setgidは影響を受けません。 )