SETUID(2)

名前
setuid - ユーザー識別(identity)を設定する

書式
#include <unistd.h>

int setuid(uid_t uid)

説明
setuid は現在のプロセスの実効(effective)ユーザーID を設定する。 もし呼び出したプロセスの実効ユーザー ID が root ならば、 実(real)ユーザーID と保存(saved)ユーザーID も設定される。

Linux では、 setuid は _POSIX_SAVED_IDS をもった POSIX版のように実装されている。 これは(ルート以外の) setuid プログラムにそのユーザーの特権を 全て落とし、特権の必要ない仕事をし、本来の実効ユーザー ID に 安全な方法で再び戻すことを許す。

ユーザーがルート(root)またはプログラムがルートに setuid されているならば、 特別の注意が払われる。 setuid 関数は呼び出し者の実効 uid をチェックし、それがスーパー・ユーザーならば、 プロセスに関連する全ての ユーザーID に uid を設定する。 これが行なわれた後にはプログラムが再びルートの特権を得ることはできない。

このように、setuid-root プログラムは一時的にルート特権を落とし、 ルートでないように振舞うことができ、それから setuid を使って再びルート特権を得ることができないようにする。 (POSIXでない、BSD) コールは seteuid で行なうことができる。

返り値
成功した場合はゼロが返される。エラーの場合は -1 が返され、 errno が適切に設定される。

エラー

EPERM
    ユーザーがスーパー・ユーザー(super-user)でなく、 uid が呼び出したプロセスの実効ユーザーIDまたは保存ユーザーID と一致しない。

準拠
SVr4, SVID, POSIX.1. 4.4BSDのコールとは完全な互換性はない、 BSD のコールは実(real)、保存(saved)、実効(effective) ID の全てを設定する。 SVr4 には他に EINVAL エラーについての記述がある。

LINUX 特有の注意
Linux はファイル・システム・ユーザーID の概念を持つ。通常、これは 実効ユーザー ID に等しい。 setuid コールは現在のプロセスのファイル・システム・ユーザーID も設定する。 setfsuid(2) も参照すること。

uid が昔の実効 uid と異っていた場合、プロセスはコア・ダンプすることを 禁止される。

関連項目
getuid(2), setreuid(2), seteuid(2), setfsuid(2).