Setuid ビットは bash には影響しないようです

Setuid ビットは bash には影響しないようです

少し実験していたところ、奇妙なことに気付きました。 にある bash のコピーに setuid ビットを設定しても/usr/bin/bash-test効果がないようです。 のインスタンスを実行したときbash-test、ホーム ディレクトリは に設定されておらず、から コマンド/rootを実行したとき、ユーザー名が であると報告されず、 が root として実行されていないことが示されました。ただし、 に setuid ビットを設定すると、予想どおり、どのシェルでも root であると報告されました。whoamibash-testrootbash-testwhoami

setuid ビットをオンに設定してみました/usr/bin/bashが、同じ動作が観察されました。

setuid ビットを設定しても bash が root として実行されないのはなぜですか? selinux がこれに関係している可能性がありますか?

答え1

説明がちょっと面倒です。bash 自体が原因なのです。straceは私たちの友達です (これが機能するには、ルート自体が SUID されている必要があります)。

getuid()                                = 1000
getgid()                                = 1001
geteuid()                               = 0
getegid()                               = 1001
setuid(1000)                            = 0
setgid(1001)                            = 0

bash は、SUID ルート (UID!=EUID) で起動されたことを検出し、ルート権限を使用してこの権限を破棄し、EUID を UID にリセットします。さらに、念のため、後で FSUID も使用します...:

getuid()                                = 1000
setfsuid(1000)                          = 1000
getgid()                                = 1001
setfsgid(1001)                          = 1001

結局、チャンスはありません。UID ルート (つまり sudo) で bash を起動する必要があります。

編集1

man ページには次のように書かれています:

シェルが実効ユーザー (グループ) ID と実ユーザー (グループ) ID が等しくない状態で起動され、-p オプションが指定されていない場合、起動ファイルは読み込まれず、シェル関数は環境から継承されず、SHELLOPTS、BASHOPTS、CDPATH、および GLOBIGNORE 変数が環境にあっても無視され、実効ユーザー ID は実ユーザー ID に設定されます。起動時に -p オプションが指定されている場合、起動時の動作は同じですが、実効ユーザー ID はリセットされません。

しかし、これは私には機能しません。-p起動オプションの中にも記載されていません。また、--posix; も試しましたが、どちらも機能しませんでした。

答え2

いずれにせよ、SUIDルートプログラムはではないルートの環境($HOMEシェルの設定など)で実行すると、ルートで実行されます権限(つまり、任意のファイルを削除したり、任意の権限を変更したりできます)。

関連情報