web-dev-qa-db-ja.com

UbuntuでSetUIDビットが機能しない?

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 
 $ 

注:マウントポイントにはnosuidnoexecも設定されていません。
Ubuntu 16.04 LTSで動作しない理由を誰かが説明できますか?

8
iBug

コンパイルされた実行可能ファイルの場合、 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
15
muru

最初のケースでは、setuidとして実行されたくないのはBashです。

実効ユーザー(グループ)IDが実際のユーザー(グループ)IDと等しくない状態でBashが開始された場合、実効ユーザーIDは実際のユーザーIDに設定されます。

参照: スタートアップファイルに関するBashのマニュアル 、また Setuidビットはbashに影響しないようです

2番目の場合、重要なのはchmodchownの順序です。muruはすでに answered です。所有者を変更すると、setuidビットがリセットされます。

15
ilkkachu

また、テスト実行可能ファイルを含むファイルシステムが nosuidオプション でマウントされた可能性もあります。新しいディストリビューションはデフォルトで/tmpに対してこれを行うと聞いたことがあります。これを/homeに適用することについても適切な議論があります。 nosuidを指定すると、カーネルはファイルシステム内のall実行可能ファイルのsetuidビットとsetgidビットを無視します。 (ディレクトリsetgidを作成するときに発生する無関係なことは影響を受けません。)

5
zwol