名 前
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 の 説 明 を 参 照 。
対 象 の ユ ー ザ ー ID や グ ル ー プ ID の う ち 1 つ 以 上 が こ の ユ ー ザ ー 名 前 空 間 で 有 効 で は な い 。 呼 び 出 し 元 の プ ロ セ ス に 特 権 が な く (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/ に 書 か れ て い る 。 |