保存されたuidが変数の場合。

保存されたuidが変数の場合。

私が知る限り、さまざまなユーザーIDは次のとおりです(プロセスの観点から)。

  • 実際のユーザーID:プロセスを所有するユーザーID
  • 有効ユーザーID:現在許可されているものと許可されていないものを決定するユーザーID。
  • 保存されたユーザーID:デフォルトでは元の有効ユーザーIDで、必要に応じて元の有効ユーザーIDに戻すことができます。

今、2つの質問があります。

  1. プログラムの起動時に有効なユーザーIDを変数に保存すると、保存する必要のないユーザーIDになりますか?

  2. Cプログラムで保存されたユーザーIDを取得するには?これを行う機能が見つかりません。

ベストアンサー1

プログラムの起動時に有効なユーザーIDを変数に保存すると、保存されたユーザーIDは不要になりますか?

ユーザー空間プログラムが何を覚えているのではなく、カーネルがどの権限を使用できるかが問題です。ユーザーを分離するには、システムがプロセスで使用できるユーザーIDを制御する必要があります。それ以外の場合は、すべてのプロセスでroot権限を要求できます。

Cプログラムで保存されたユーザーIDを取得するには?これを行う機能が見つかりません。

getuid()これは標準関数(sumのみ)を使用することはできませんgeteuid()。少なくともLinuxはgetresuid()ただし、3 つのユーザー ID がすべて返されます。

とにかく一般的に読む必要はありません。 setuid プログラムの場合、実際のユーザー ID と実効ユーザー ID の間の切り替えが許可されるため、実効ユーザー ID のコピーから始まります。

setuidプログラムでは、実際のユーザーIDはプログラムを実行しているユーザーのIDであり、有効で保存されたユーザーIDはそのプログラムを所有するユーザーのIDです。有効なユーザー ID は権限の確認に非常に重要であるため、プロセスが一時的に権限を放棄したい場合は、実際のユーザー ID と保存されたユーザー ID の間で有効なユーザー ID を変更します。

プロセスがユーザーIDを変更できることを確認するために、カーネルは保存されたユーザーIDをどのように使用しますか?これは、プロセスが有効なユーザーIDを変更しようとしたときにカーネルが保存されているユーザーIDを調べて、プロセスがそのようにできることを確認することを意味しますか?

はい。 Linuxのマニュアルページにsetuid()これについての言及がありますが、やや隠されています。

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()これについてのマニュアルページがより明確です。

Unprivileged processes may only set the effective user ID to the real
user ID, the effective user ID, or the saved set-user-ID.

おすすめ記事