私は少し実験していて、奇妙なことに気づきました:/usr/bin/bash-test
にあるbashのコピーにsetuidビットを設定しても効果がないようです。 bash-test
のインスタンスを実行すると、ホームディレクトリが/root
に設定されず、bash-test
からwhoami
コマンドを実行したときに、ユーザー名がroot
、bash-test
がrootとして実行されていなかったことを示唆しています。ただし、setuidビットをwhoami
に設定すると、期待どおり、どのシェルでもrootであると報告されました。
/usr/bin/bash
にもsetuidビットを設定してみましたが、同じ動作が見られました。
Setuidビットを設定すると、bashがrootとして実行されないのはなぜですか? selinuxはこれと関係がありますか?
説明は一種の迷惑です: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
結局、チャンスはない。 bashはUIDルート(つまり、Sudo)で開始する必要があります。
編集1
Manページはこれを言います:
実効ユーザー(グループ)IDが実際のユーザー(グループ)IDと等しくない状態でシェルが起動され、-pオプションが指定されていない場合、起動ファイルは読み込まれず、シェル関数は環境から継承されません。SHELLOPTS 、BASHOPTS、CDPATH、およびGLOBIGNORE変数は、環境に表示されても無視され、実効ユーザーIDは実際のユーザーIDに設定されます。呼び出し時に-pオプションが指定されている場合、起動時の動作は同じですが、有効なユーザーIDはリセットされません。
しかし、これは私にはうまくいきません。 -p
は、起動オプションの中でも言及されていません。私も試しました--posix
;どちらも動作しませんでした。
いずれの場合でも、SUIDルートプログラムしないでくださいルートの環境($HOME
、シェルの設定など、ルートpowersで実行されます(つまり、ファイルの削除、権限の変更などが可能です)。