tail head cat sleep
QR code linking to this page

manページ  — SETUID

名称

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

内容

ライブラリ

Standard C Library (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 の値に設定できます。

戻り値

Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

本システムコールは次の場合に失敗します:
[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() システムコールは IEEE Std 1003.1-90 ("POSIX.1") 仕様と互換性があります。 ただし、 _POSIX_SAVED_IDS は付録 B.4.2.2 の許可された拡張で定義されていません。 seteuid() システムコールと setegid() システムコールは、 _POSIX_SAVED_IDS POSIX コンセプトを基礎にして拡張してあり、規格の将来の改定用に提案されています。

歴史

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

SETUID (2) June 4, 1993

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

I define UNIX as “30 definitions of regular expressions living under one roof.”
— Donald Knuth