プログラムの開始時に有効なユーザー ID を変数に保存すると、保存されたユーザー ID は不要になりますか?
これは、ユーザー空間プログラムが何を覚えているかの問題ではなく、カーネルが使用できる権限は何かという問題です。ユーザー間の分離が機能するためには、プロセスが使用できるユーザー ID を制御するシステムが必要です。そうしないと、どのプロセスも root になることを要求する可能性があります。
<ブロック引用>C プログラムで保存されたユーザー ID を取得するにはどうすればよいですか?それを行う関数を見つけることができませんでした.
標準関数ではできません (getuid()
しかありません と geteuid()
)。少なくとも Linux には getresuid()
があります ただし、3 つのユーザー ID すべてを返します。
とにかく、通常は読む必要はありません。これは、setuid プログラムの場合に実ユーザー ID と有効ユーザー ID の間の切り替えを可能にするために存在するため、有効ユーザー ID のコピーとして開始されます。
setuid プログラムでは、実際のユーザー ID はそれを実行しているユーザーの ID であり、有効で保存されたユーザー ID はプログラムを所有するユーザーの ID です。有効なユーザー ID は権限チェックに重要な ID であるため、プロセスが一時的に権限を削除したい場合、実際のユーザー ID と保存されたユーザー ID の間で有効なユーザー ID を変更します。
<ブロック引用>プロセスがそのユーザー ID を変更できるかどうかを確認するために、カーネルは保存されたユーザー ID をどのように使用しますか?これは、プロセスが有効なユーザー ID を変更しようとすると、カーネルが保存されたユーザー ID をチェックして、プロセスが変更を許可されていることを確認するということですか?
はい。 setuid()
の Linux man ページ これについて言及していますが、多少隠されています:
ERRORS
EPERM The user is not privileged and uid does not match the real
UID or saved set-user-ID of the calling process.
つまり、(有効な) ユーザー ID を実際の ID または保存された ID のいずれかにのみ設定できます。
setreuid()
の man ページ
Unprivileged processes may only set the effective user ID to the real
user ID, the effective user ID, or the saved set-user-ID.