![Setuid ビットは bash には影響しないようです](https://rvso.com/image/31653/Setuid%20%E3%83%93%E3%83%83%E3%83%88%E3%81%AF%20bash%20%E3%81%AB%E3%81%AF%E5%BD%B1%E9%9F%BF%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%A7%E3%81%99.png)
少し実験していたところ、奇妙なことに気付きました。 にある bash のコピーに setuid ビットを設定しても/usr/bin/bash-test
効果がないようです。 のインスタンスを実行したときbash-test
、ホーム ディレクトリは に設定されておらず、から コマンド/root
を実行したとき、ユーザー名が であると報告されず、 が root として実行されていないことが示されました。ただし、 に setuid ビットを設定すると、予想どおり、どのシェルでも root であると報告されました。whoami
bash-test
root
bash-test
whoami
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
シェルの設定など)で実行すると、ルートで実行されます権限(つまり、任意のファイルを削除したり、任意の権限を変更したりできます)。