setuid - システムコールの説明 - Linux コマンド集 一覧表
名前
setuid - ユーザー識別 (identity) を設定する
書式
#include <sys/types.h>
#include <unistd.h>
int setuid(uid_t
uid
);
説明
setuid ()は現在のプロセスの実効 (effective) ユーザー ID を設定する。 もし呼び出し元プロセスの実効 UID が root ならば、 実 (real) UID と保存 (saved) set-user-ID も設定される。
Linux では、 setuid ()は _POSIX_SAVED_IDS をもった POSIX 版のように実装されている。 これは (ルート以外の) set-user-ID プログラムにそのユーザーの特権を 全て与え、特権の必要ない仕事をし、本来の実効ユーザー ID に 安全な方法で再び戻すことを許す。
ユーザーがルート (root) またはプログラムがルートに set-user-ID されているならば、 特別の注意が払われる。 setuid ()関数は呼び出し者の実効ユーザー ID をチェックし、 それがスーパー・ユーザーならば、 プロセスに関連する全てのユーザー ID に uid を設定する。 これが行なわれた後にはプログラムが再びルートの特権を得ることはできない。
このように、set-user-ID-root プログラムは一時的にルート特権を与え、 ルートでないように振舞うことができ、それから setuid ()を使って再びルート特権を得ることができないようにする。 (POSIX でない、BSD) コールは seteuid ()で行なうことができる。
返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
エラー
- EAGAIN
- uid が現在のユーザー ID とマッチせず、この uid によってプロセスが NPROC rlimit を超えた。
- EPERM
- ユーザーが特権を持たず (Linux では CAP_SETUID ケーパビリティ (capability) を持たず)、 uid が呼び出し元プロセスの実 UID または保存 set-user-ID と一致しない。
準拠
SVr4, POSIX.1-2001. 4.4BSD のコールとは完全な互換性はない、 BSD のコールは実 (real)、保存 (saved)、実効 (effective) ID の全てを設定する。
LINUX 特有の注意
Linux はファイル・システム・ユーザー ID の概念を持つ。 通常、これは実効ユーザー ID に等しい。 setuid ()コールは現在のプロセスのファイル・システム・ユーザー ID も設定する。 setfsuid (2) も参照すること。
uid が昔の実効 uid と異っていた場合、プロセスはコア・ダンプすることを 禁止される。