SETUID(2) | Linux Programmer's Manual | SETUID(2) |
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 またはプログラムが root に set-user-ID されているならば、 特別の注意が払われる。 setuid() 関数は呼び出し者の実効ユーザー ID をチェックし、 それがスーパーユーザーならば、 プロセスに関連する全てのユーザー ID に uid を設定する。 これが行なわれた後にはプログラムが再びルートの特権を得ることはできない。
したがって、set-user-ID-root プログラムで、一時的にルート特権を解除し、 非特権ユーザーであるかのように振舞い、後でルート権限をもう一度得ようと する場合には、 setuid() を使うことができない。その場合には、 seteuid(2) を使う必要がある。
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
注意: 呼び出し元が UID 0 であっても setuid() が失敗する場合がある。 setuid() からのリターンが失敗かどうかの確認を省略することは重大なセキュリティ上のエラーとなる。
SVr4, POSIX.1-2001. 4.4BSD のコールとは完全な互換性はない、 BSD のコールは実 (real)、保存 (saved)、実効 (effective) ID の全てを設定する。
Linux はファイルシステムユーザー ID の概念を持つ。 通常、これは実効ユーザー ID に等しい。 setuid() コールは呼び出し元のプロセスの ファイルシステムユーザー ID も設定する。 setfsuid(2) も参照すること。
uid が前の実効 UID と異っていた場合、 プロセスはコアダンプすることを禁止される。
元々の Linux の setuid() システムコールは 16 ビットのグループ ID だけに対応していた。 その後、Linux 2.4 で、32 ビットの ID に対応した setuid32() が追加された。 glibc の setuid() のラッパー関数は カーネルバージョンによるこの違いを吸収している。
getuid(2), seteuid(2), setfsuid(2), setreuid(2), capabilities(7), credentials(7), user_namespaces(7)
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2014-09-21 | Linux |