web-dev-qa-db-ja.com

Setuidビットはbashに影響を与えないようです

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

/usr/bin/bashにもsetuidビットを設定してみましたが、同じ動作が見られました。

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

14
user26112

説明は一種の迷惑です: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;どちらも動作しませんでした。

21
Hauke Laging

いずれの場合でも、SUIDルートプログラムしないでくださいルートの環境($HOME、シェルの設定など、ルートpowersで実行されます(つまり、ファイルの削除、権限の変更などが可能です)。

2
vonbrand