名 前
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() か ら の リ タ ー ン が 失 敗 か ど う か の 確 認 を 省 略 す る こ と は 重 大 な セ キ ュ リ テ ィ 上 の エ ラ ー と な る 。
エ ラ ー
EAGAIN こ の 呼 び 出 し で 呼 び 出 し 元 の 実 |
UID が 変 更 さ れ る は ず だ っ た が (つ ま |
り 、 uid が 呼 び 出 し 元 の 実 UID と 一 致 し て い な い )、 必 要 な カ ー ネ ル の デ ー タ 構 造 体 の 割 り 当 て で 一 時 的 な 失 敗 が あ っ た 。
EAGAIN |
uid は 呼 び 出 し 元 の 実 UID と 一 致 し て お ら ず 、 こ の 呼 び 出 し で 実 ユ ー ザ ー ID ruid に 属 す る プ ロ セ ス 数 が 呼 び 出 し 元 の RLIMIT_NPROC リ ソ ー ス 上 限 を 超 過 す る と こ ろ で あ っ た 。 Linux 3.1 以 降 で は 、 こ の エ ラ ー は も は や 発 生 す る こ と は な い (し か し 、 堅 牢 性 が 求 め ら れ る ア プ リ ケ ー シ ョ ン で は こ の エ ラ ー を 確 認 す べ き で あ る )。 execve(2) の EAGAIN の 説 明 を 参 照 。 | ||
EINVAL |
uid で 指 定 さ れ た ユ ー ザ ー ID が こ の ユ ー ザ ー 名 前 空 間 で は 有 効 で は な い 。 ユ ー ザ ー が 特 権 を 持 た ず (Linux で は CAP_SETUID ケ ー パ ビ リ テ ィ (capability) を 持 た ず )、 uid が 呼 び 出 し 元 プ ロ セ ス の 実 UID ま た は 保 存 set−user−ID と 一 致 し な い 。 準 拠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/ に 書 か れ て い る 。 |