いくつかの実験をして、何か奇妙なことを発見しました。私のbashコピーにsetuidビットを設定しても/usr/bin/bash-test
効果はないようです。インスタンスの実行時にマイbash-test
ホームディレクトリがに設定されておらず、/root
コマンドを実行したときにユーザー名がとして報告されず、rootとして実行されていないことを示します。ただし、setuid ビットを on に設定すると、予想どおりすべてのシェルでルートとして報告されます。whoami
bash-test
root
bash-test
whoami
/usr/bin/bash
また、setuidビットの設定を試み、同じ動作を観察しました。
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)を開始したことを検出し、root権限を使用してこの権限を破棄し、EUIDをUIDにリセットします。後で確認するためにFSUIDもありました...:
getuid() = 1000
setfsuid(1000) = 1000
getgid() = 1001
setfsgid(1001) = 1001
最後にチャンスはありません。 UIDルート(例えばsudo)でbashを開始する必要があります。
編集1
マニュアルページには次のように記載されています。
シェルの起動時に有効なユーザー (グループ) ID が実際のユーザー (グループ) ID と等しくなく、-p オプションが指定されていない場合、開始ファイルを読み取らず、シェル機能は環境および SHELLOPTS、BASHOPTS、CDPATH、および GLOBIGNORE 変数が環境に表示された場合は無視有効ユーザーIDは実際のユーザーIDに設定されます。呼び出し時に-pオプションを指定した場合、起動動作は同じですが、有効なユーザーIDはリセットされません。
しかし、これは私には効果がありません。-p
起動オプションにも記載されていません。私もそれを試しましたが、うまく--posix
いきませんでした。
答え2
とにかくSUIDルートプログラムは確かにroot($HOME
、シェル構成など)で実行すると、rootとして実行されます。その力(つまり、すべてのファイルを削除して権限を変更できます。)