スポンサーリンク

SETUID(2) FreeBSD システムコールマニュアル SETUID(2)

名称

setuid, seteuid, setgid, setegid − ユーザ ID とグループ ID を設定する

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

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

int

setuid(uid_t uid);

int

seteuid(uid_t euid);

int

setgid(gid_t gid);

int

setegid(gid_t egid);

解説

setuid() システムコールは、現在のプロセスの実ユーザ ID と実効ユーザ ID と 退避ユーザ ID を指定した値に設定します。 setuid() システムコールが許容さ れるのは、指定の ID がプロセスの実ユーザ ID または実効ユーザ ID に等しい 場合、または実効ユーザ ID がスーパユーザのものと等しい場合です。

setgid() システムコールは、現在のプロセスの実グループ ID と実効グループ ID と退避グループ ID を指定した値に設定します。 setgid() システムコールが 許容されるのは、指定の ID がプロセスの実グループ ID または実効グループ ID に等しい場合、または実効ユーザ ID がスーパユーザのものと等しい場合です。

seteuid() システムコール (setegid()) は、現在のプロセスの実効ユーザ (グ ループ ID) を設定します。実効ユーザ ID は実ユーザ ID または退避ユーザ ID ( intro(2)execve(2) を参照 ) の値に設定できます。これを利用し、ユーザ ID 設定された実行可能ファイルの実効ユーザ ID を実ユーザ ID に切り替えた後 に、ユーザ ID 設定の値に戻ることで、元の権限を得ることができます。同じよ うに、実効グループ ID は、実グループ ID または退避グループ ID の値に設定 できます。

戻り値

成功して終了したときには値 0 を返します。そうでない場合、値 -1 が返され、 グローバル変数 errno が設定されてエラーを示します。

エラー

本システムコールは次の場合に失敗します:

       [EPERM]

ユーザがスーパユーザでない場合、または指定された uid がその実 ID、実効 ID、または退避 ID でない場合。

セキュリティに関する考察

ファイルへの読取りと書込み許可は、 open(2) が呼ばれた時に判断されます。一 度ファイル記述子がオープンされると、権限を落してもそのプロセスの読取りま たは書込み許可には影響しません。指定されたユーザ ID に、そのファイルへの 読取りまたは書込み許可がなくともです。通常これらのファイルは、新しいプロ セスの実行時にオープンされたままとなり、その結果、ユーザがもしかすると要 注意であるデータを読んだり修正したりできてしまいます。

これらのファイルが exec(3) 呼び出しの後でもオープンされたままにされるのを 防ぐには、 close-on-exec フラグを設定するようにしてください:

void
pseudocode(void)
{

int fd;

/* ... */

fd = open("/path/to/sensitive/data", O_RDWR);

if (fd == -1)

err(1, "open");

/*

* close-on-exec フラグの設定; さらなる情報は fcntl(2) を参照。

*/

if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)

err(1, "fcntl(F_SETFD)");

/* ... */

execve(path, argv, environ);

}

関連項目

getgid(2), getuid(2), issetugid(2), setregid(2), setreuid(2)

規格

setuid() システムコールと setgid() システムコールは ISO/IEC 9945-1:1990 (‘‘POSIX.1’’) 仕様と互換性があります。ただし、 _POSIX_SAVED_IDS は付録 B.4.2.2 の許可された拡張で定義されていません。 seteuid() システムコールと setegid() システムコールは、 _POSIX_SAVED_IDS の POSIX コンセプトを基礎に して拡張してあり、規格の将来の改定用に提案されています。

歴史

setuid() 関数と setgid() 関数は Version 7 AT&T UNIX で登場しました。

FreeBSD 10.0 June 4, 1993 FreeBSD 10.0

スポンサーリンク