Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all bug

名前

       setreuid, setregid - 実 (real) と実効 (effective) ユーザー (グループ) ID を設定する

書式

       #include <sys/types.h>
       #include <unistd.h>

       int setreuid(uid_t ruid, uid_t euid);
       int setregid(gid_t rgid, gid_t egid);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       setreuid(), setregid():
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

説明

       setreuid()   は呼び出し元のプロセスの実 (real) ユーザー ID と 実効 (effective) ユーザー ID
       を設定する。

       実ユーザー ID や実効ユーザー ID に -1 を与えた場合、 システムはその ID を変更しない。

       非特権プロセスは実効ユーザー  ID  を実ユーザー  ID  または実効ユーザー  ID   または   保存
       set-user-ID にしか設定できない。

       非特権ユーザーは、実ユーザー  ID  を実ユーザー  ID または 実効ユーザー ID にしか設定できな
       い。

       実ユーザーID が設定されたり (ruid が -1  ではない)、実効ユーザーID  が前の実ユーザーID  と
       異った値に設定された場合、保存 set-user-ID には新しい実効ユーザーID の値が設定される。

       これと全く同様に、  setregid()  は呼び出し元のプロセスの実グループ ID と実効グループ ID を
       設定し、 上記の説明で「ユーザー」を「グループ」に読み替えたことが成り立つ。

返り値

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

       注意: 呼び出し元が UID 0 であっても setreuid() が失敗する場合がある。 setreuid()  からのリ
       ターンが失敗かどうかの確認を省略することは重大なセキュリティ上のエラーとなる。

エラー

       EAGAIN この呼び出しで呼び出し元の実 UID が変更されるはずだったが (つまり、 ruid が呼び出し
              元の実 UID と一致していない)、 必要なカーネルのデータ構造体の割り当てで一時的な失敗
              があった。

       EAGAIN ruid  は呼び出し元の実 UID と一致しておらず、 この呼び出しで実ユーザー ID ruid に属
              するプロセス数が呼び出し元の  RLIMIT_NPROC   リソース上限を超過するところであった。
              Linux  3.1 以降では、このエラーはもはや発生することはない (しかし、堅牢性が求められ
              るアプリケーションではこのエラーを確認すべきである)。 execve(2) の EAGAIN  の説明を
              参照。

       EINVAL 対象のユーザー  ID  やグループ ID のうち 1 つ以上がこのユーザー名前空間で有効ではな
              い。

       EPERM  呼び出し元のプロセスに特権がなく (Linux では setreuid()  の場合に CAP_SETUID ケーパ
              ビリティ  (capability)  がなく、 setregid()  の場合に CAP_SETGID ケーパビリティがな
              い)、 以下のいずれでもない変更が指定された: (i) 実効ユーザー (グループ) ID と実ユー
              ザー  (グループ)  ID  を入れ換える。 (ii) 片方の値を他方に設定する。 (iii) 実効ユー
              ザー (グループ) ID に保存 set-user-ID (保存 set-group-ID) の値を設定する。

準拠

       POSIX.1-2001, 4.3BSD (setreuid()  と setregid()  関数コールは 4.2BSD で登場した)。

注意

       実効ユーザー (グループ) ID を保存ユーザー (グループ) ID  に  設定することが、Linux  1.1.37
       (1.1.38) から可能になった。

       POSIX.1 では、非特権プロセスに対して Linux 上で認められている ID の変更の 全パターンを規定
       しているわけではない。 setreuid()   では、実効ユーザー  ID  を実ユーザー  ID  もしくは保存
       set-user-ID  と  同じ値にすることができるが、  非特権プロセスが実ユーザー  ID を実ユーザー
       ID、実効ユーザー  ID、   保存   set-user-ID   のどの値にも設定できるかは規定されていない。
       setregid()   では、実グループ  ID を保存 set-group-ID と同じ値に変更でき、 実効グループ ID
       を実グループ ID や保存 set-group-ID と同じ値に変更できる。 どのような ID  の変更が認められ
       ているかの正確な詳細は 実装ごとに異なる。

       POSIX.1 では、これらのシステムコールが保存 set-user-ID や 保存 set-group-ID に与える影響に
       ついては規定していない。

       元々の Linux の setreuid() と setregid() システムコールは 16 ビットのグループ ID  だけに対
       応していた。  その後、Linux 2.4 で、32 ビットの ID に対応した setreuid32() と setregid32()
       が追加された。 glibc の setreuid() と setregid() のラッパー関数は カーネルバージョンによる
       この違いを吸収している。

関連項目

       getgid(2),  getuid(2),  seteuid(2),  setgid(2),  setresuid(2), setuid(2), capabilities(7),
       user_namespaces(7)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部  である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。