setfsuid -
ファイルシステムのチェックに用いられるユーザ
ID を設定する
#include <unistd.h> /* glibc では <sys/fsuid.h>
*/
int setfsuid(uid_t fsuid);
setfsuid() は Linux
カーネルがファイルシステムに対する
全てのアクセスのチェックに使用するユーザID
を設定する。通常は
fsuid の値は実効 (effective)
ユーザID
と同じになる。実際、
実効ユーザID
が変更される度に
fsuid
もまた新しい実効ユーザID
の値に変更される。
通常、
setfsuid() や
setfsgid()
が明示的に呼び出されるのは、Linux
NFS サーバー のように、
ファイルアクセスに用いるユーザID
/ グループID
を変更しなければならないが、
対応する実(real)/実効(effective)
ユーザID / グループID
は変更したくないような
プログラムに限られる。
NFS
サーバーのようなプログラムで、通常のユーザID
を変更すると、
プロセスを望まないシグナルにさらす可能性があり、
セキュリティホールになる。(下記参照)
setfsuid()
は、スーパーユーザによって呼び出された場合か、
fsuid
が実ユーザID、実効ユーザID、
保存セットユーザID (saved
set-user-ID)、現在の
fsuid
の値のいずれかに一致する場合にのみ成功する。
返り値¶
成功した場合、
fsuid
の以前の値を返す。エラーの場合は
fsuid
の現在の値を返す。
バージョン¶
このシステムコールはバージョン
1.2 以降の Linux
に存在する。
setfsuid() は Linux
特有であり、移植を想定したプログラムで使用してはいけない。
glibc が引き数がユーザID
として不正だと判断した場合は、
システムコールを行わず
errno に
EINVAL を設定して
-1 が返される。
このシステムコールが導入された当時、プロセスは
同じ実効ユーザIDのプロセスへシグナルを送ることができた。
今日では、シグナル送信権限の扱いはかなり違うものになっている。
元々の Linux の
setfsuid()
システムコールは 16
ビットのグループ ID
だけに対応していた。
その後、Linux 2.4 で、32
ビットの ID に対応した
setfsuid32() が追加された。
glibc の
setfsuid()
のラッパー関数は
カーネルバージョンによるこの違いを吸収している。
いかなる種類のエラーメッセージも呼び出し元に返さない。
失敗した場合は
(呼び出し元には
CAP_SETUID
ケーパビリティがなかったのだから)
最低でも
EPERM
くらいは返すべきである。
関連項目¶
kill(2),
setfsgid(2),
capabilities(7),
credentials(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。