Man page - faccessat(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru de

Manual

ACCESS

名 前
書 式
説 明
faccessat()
faccessat2()
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
C ラ イ ブ ラ リ と カ ー ネ ル の 違 い
glibc で の 注 意
バ グ
関 連 項 目
こ の 文 書 に つ い て

名 前

access, faccessat, faccessat2 - ユ ー ザ ー の フ ァ イ ル へ の ア ク セ ス 権 を チ ェ ッ ク す る

書 式

#include <unistd.h>

int access(const char * pathname , int mode );

#include <fcntl.h> /* AT_* 定 数 の 定 義 */
#include <unistd.h>

int faccessat(int dirfd , const char * pathname , int mode , int flags );
/* But see C library/kernel differences, below */

int faccessat2(int dirfd , const char * pathname , int mode , int flags );

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 ( feature_test_macros (7) 参 照 ):

faccessat ():

glibc 2.10 以 降 :

_POSIX_C_SOURCE >= 200809L

glibc 2.10 よ り 前 :

_ATFILE_SOURCE

説 明

access () は 、 呼 び 出 し 元 プ ロ セ ス が フ ァ イ ル pathname に ア ク セ ス で き る か ど う か を チ ェ ッ ク す る 。 pathname が シ ン ボ リ ッ ク リ ン ク の 場 合 、 シ ン ボ リ ッ ク リ ン ク は 展 開 さ れ る 。

mode は チ ェ ッ ク を 行 う ア ク セ ス 権 を 指 定 す る も の で 、 そ の 値 は F_OK 、 も し く は R_OK , W_OK , X_OK の 1個 以 上 の ビ ッ ト 単 位 の 論 理 和 か ら 構 成 さ れ る マ ス ク で あ る 。 F_OK は フ ァ イ ル が 存 在 す る か ど う か の み を 検 査 す る 。 R_OK , W_OK , X_OK は 、 フ ァ イ ル が 存 在 し て 、 そ れ ぞ れ 読 み 込 み 、 書 き 込 み 、 実 行 の 許 可 が あ る か を 検 査 す る 。

The check is done using the calling process’s real UID and GID, rather than the effective IDs as is done when actually attempting an operation (e.g., open (2)) on the file. Similarly, for the root user, the check uses the set of permitted capabilities rather than the set of effective capabilities; and for non-root users, the check uses an empty set of capabilities.

This allows set-user-ID programs and capability-endowed programs to easily determine the invoking user’s authority. In other words, access () does not answer the "can I read/write/execute this file?" question. It answers a slightly different question: "(assuming I’m a setuid binary) can the user who invoked me read/write/execute this file?", which gives set-user-ID programs the possibility to prevent malicious users from causing them to read files which users shouldn’t be able to read.

呼 び 出 し 元 プ ロ セ ス が 特 権 プ ロ セ ス (つ ま り 、 プ ロ セ ス の 実 UID が 0) の 場 合 、 通 常 の フ ァ イ ル に 対 す る X_OK の チ ェ ッ ク は 、 そ の フ ァ イ ル の 所 有 者 、 グ ル ー プ 、 他 人 の い ず れ か の 実 行 許 可 が 有 効 に な っ て い れ ば 成 功 す る 。

faccessat()

faccessat () は access () と 全 く 同 様 に 動 作 す る が 、 以 下 で 説 明 す る 点 が 異 な る 。

pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 こ の パ ス 名 は フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る ( access () に 相 対 パ ス 名 を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。

pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 ( access () と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。

pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。

flags は 以 下 に 示 す 値 の 0 個 以 上 の OR (論 理 和 ) を と っ て 作 成 さ れ る 。
AT_EACCESS

ア ク セ ス チ ェ ッ ク を 実 行 ユ ー ザ ー /グ ル ー プ ID を 使 っ て 行 う 。 デ フ ォ ル ト で は 、 faccessat () は ( access () と 同 様 に ) 実 ID を 使 用 す る 。

AT_SYMLINK_NOFOLLOW

pathname が シ ン ボ リ ッ ク リ ン ク の 場 合 、 リ ン ク の 展 開 を 行 わ な い 。 代 わ り に 、 リ ン ク 自 身 の 情 報 を 返 す 。

faccessat () の 必 要 性 に つ い て の 説 明 に つ い て は openat (2) を 参 照 。

faccessat2()

The description of faccessat () given above corresponds to POSIX.1 and to the implementation provided by glibc. However, the glibc implementation was an imperfect emulation (see BUGS) that papered over the fact that the raw Linux faccessat () system call does not have a flags argument. To allow for a proper implementation, Linux 5.8 added the faccessat2 () system call, which supports the flags argument and allows a correct implementation of the faccessat () wrapper function.

返 り 値

成 功 し た 場 合 (要 求 し た 全 て に つ い て 許 可 が 得 ら れ た か 、 mode F_OK で フ ァ イ ル が 存 在 し た 場 合 )、 ゼ ロ が 返 さ れ る 。 エ ラ ー の 場 合 ( mode の 少 な く と も 一 つ の ビ ッ ト で 要 求 し た 許 可 が な か っ た 場 合 、 mode F_OK で フ ァ イ ル が 存 在 し な か っ た 場 合 、 他 の エ ラ ー が 起 こ っ た 場 合 )、 -1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。

エ ラ ー

access () と faccessat () は 以 下 の 場 合 に 失 敗 す る 。

EACCES

要 求 さ れ た ア ク セ ス は そ の フ ァ イ ル 自 身 に 拒 否 さ れ た か pathname へ 至 る ま で デ ィ レ ク ト リ の い ず れ か に 対 す る 検 索 許 可 (search permission) が 得 ら れ な か っ た 。 ( path_resolution (7) も 参 照 の こ と )

ELOOP

pathname を 解 決 す る と き に 、 解 決 す べ き シ ン ボ リ ッ ク リ ン ク が 多 す ぎ た 。

ENAMETOOLONG

pathname が 長 過 ぎ る 。

ENOENT

pathname を 構 成 す る パ ス の い ず れ か が 、 存 在 し な い か 、 参 照 先 の な い (dangling) シ ン ボ リ ッ ク リ ン ク に な っ て い る 。

ENOTDIR

pathname の デ ィ レ ク ト リ 部 分 が 実 際 に は デ ィ レ ク ト リ で な い 。

EROFS

読 み 込 み 専 用 (read-only) の フ ァ イ ル シ ス テ ム に 対 し て 書 き 込 み 許 可 を 要 求 し た 。

access () と faccessat () は 以 下 の 理 由 に よ り 失 敗 す る こ と が あ る 。

EFAULT

pathname が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し て い る 。

EINVAL

mode に 不 正 な 値 が 指 定 さ れ た 。

EIO

I/O エ ラ ー が 発 生 し た 。

ENOMEM

カ ー ネ ル に 十 分 な メ モ リ ー が な い 。

ETXTBSY

実 行 中 の フ ァ イ ル に 対 し て 書 き 込 み を 要 求 し た 。

faccessat () で は 以 下 の エ ラ ー も 発 生 す る 。

EBADF

dirfd が 適 切 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。

EINVAL

flags に 無 効 な フ ラ グ が 指 定 さ れ た 。

ENOTDIR

pathname が 相 対 パ ス で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。

バ ー ジ ョ ン

faccessat () は バ ー ジ ョ ン 2.6.16 で Linux に 追 加 さ れ た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は glibc バ ー ジ ョ ン 2.4 で 追 加 さ れ た 。

faccessat2 () は Linux 5.8 で 追 加 さ れ た 。

準 拠

access (): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

faccessat (): POSIX.1-2008.

faccessat2 () は Linux 固 有 で あ る 。

注 意

警 告 : あ る ユ ー ザ ー が 、 例 え ば open (2) に よ る ア ク セ ス が 可 能 か ど う か を 、 (実 際 に 行 う 前 に ) こ れ ら の シ ス テ ム コ ー ル を 使 っ て チ ェ ッ ク す る の は 、 セ キ ュ リ テ ィ ホ ー ル の 原 因 に な る 。 な ぜ な ら チ ェ ッ ク を し て か ら 実 際 に フ ァ イ ル の オ ー プ ン 操 作 を す る 間 の 短 い 間 隔 を 悪 用 で き る か ら で あ る 。 こ の 理 由 が あ る の で 、 こ の シ ス テ ム コ ー ル を 使 う の は 避 け る べ き で あ る 。 (こ こ で 説 明 し た 例 の 場 合 に は 、 よ り 安 全 な 方 法 と し て は 、 そ の プ ロ セ ス の 実 効 ユ ー ザ ー ID を 実 ユ ー ザ ー ID に 一 時 的 に 切 り 替 え て か ら open (2) を 呼 び 出 す 方 法 が あ る 。 )

access () は 常 に シ ン ボ リ ッ ク リ ン ク の 展 開 を 行 う 。 シ ン ボ リ ッ ク リ ン ク の ア ク セ ス 許 可 を 確 認 す る 必 要 が あ る 場 合 は 、 AT_SYMLINK_NOFOLLOW フ ラ グ 付 き で faccessat () を 使 う こ と 。

mode で 指 定 さ れ た ア ク セ ス 種 別 の い ず れ か 一 つ で も 拒 否 さ れ る と 、 た と え mode で 指 定 さ れ た 他 の ア ク セ ス 種 別 が 許 可 さ れ た と し て も 、 こ れ ら の シ ス テ ム コ ー ル は エ ラ ー を 返 す 。

POSIX.1-2001 で は 、 呼 び 出 し 元 プ ロ セ ス が 適 切 な 特 権 を 持 っ て い る 場 合 (つ ま り 、 ス ー パ ー ユ ー ザ ー の 場 合 )、 た と え フ ァ イ ル の 実 行 許 可 ビ ッ ト が 全 く セ ッ ト さ れ て い な く て も X_OK の チ ェ ッ ク と し て 成 功 を 返 す 実 装 が 認 め ら れ て い る 。 Linux は こ の よ う に は な っ て い な い 。

pathname の プ レ フ ィ ッ ク ス を 構 成 す る デ ィ レ ク ト リ の 全 て に 対 し て 検 索 ア ク セ ス (す な わ ち 、 実 行 ア ク セ ス ) が 許 可 さ れ た 場 合 に の み 、 フ ァ イ ル は ア ク セ ス 可 能 と な る 。 い ず れ か の デ ィ レ ク ト リ が ア ク セ ス 不 可 の 場 合 、 フ ァ イ ル 自 身 の ア ク セ ス 許 可 に 関 わ ら ず 、 access () は 失 敗 す る 。

ア ク セ ス ビ ッ ト の み が チ ェ ッ ク さ れ 、 フ ァ イ ル の 種 類 や 内 容 は チ ェ ッ ク さ れ な い 。 従 っ て 、 デ ィ レ ク ト リ が 書 き 込 み 可 能 と な っ た 場 合 は 、 デ ィ レ ク ト リ に フ ァ イ ル を 作 成 す る こ と が 可 能 な こ と を 意 味 す る の で あ り 、 デ ィ レ ク ト リ に フ ァ イ ル と し て 書 き 込 む こ と が で き る わ け で は な い 。 同 様 に DOS の フ ァ イ ル は 「 実 行 可 能 」 と 判 断 さ れ る が 、 execve (2) コ ー ル は 失 敗 す る だ ろ う 。

こ れ ら の シ ス テ ム コ ー ル は 、 UID マ ッ ピ ン グ を 使 用 し た NFSv2 フ ァ イ ル シ ス テ ム で は 正 常 に 機 能 し な い か も し れ な い 。 な ぜ な ら ば UID の マ ッ ピ ン グ は サ ー バ ー で 行 な わ れ 、 権 利 の チ ェ ッ ク を す る ク ラ イ ア ン ト に は 見 え な い か ら で あ る 。 (NFS バ ー ジ ョ ン 3 以 降 で は サ ー バ ー 側 で チ ェ ッ ク が 実 行 さ れ る 。 ) 同 様 の 問 題 は FUSE マ ウ ン ト で も 起 こ り 得 る 。

C ラ イ ブ ラ リ と カ ー ネ ル の 違 い

生 の faccessat () シ ス テ ム コ ー ル は 、 最 初 の 3 つ の 引 数 だ け を 取 る 。 フ ラ グ AT_EACCESS AT_SYMLINK_NOFOLLOW は 実 際 に は faccessat () の glibc の ラ ッ パ ー 関 数 内 で 実 装 さ れ て い る 。 こ れ ら の フ ラ グ の い ず れ か が 指 定 さ れ た 場 合 、 ラ ッ パ ー 関 数 は fstatat (2) を 使 っ て ア ク セ ス 許 可 の 判 定 を 行 う 。 た だ し 「 バ グ 」 を 参 照 の こ と 。

glibc で の 注 意

faccessat () が 利 用 で き な い 古 い カ ー ネ ル で は 、 (フ ラ グ AT_EACCESS AT_SYMLINK_NOFOLLOW が 指 定 さ れ て い な い 場 合 ) glibc ラ ッ パ ー 関 数 は access () を 使 用 す る モ ー ド に フ ォ ー ル バ ッ ク す る 。 pathname が 相 対 パ ス の 場 合 、 glibc は dirfd 引 数 に 対 応 す る /proc/self/fd の シ ン ボ リ ッ ク リ ン ク に 基 づ い て パ ス 名 を 構 成 す る 。

バ グ

Because the Linux kernel’s faccessat () system call does not support a flags argument, the glibc faccessat () wrapper function provided in glibc 2.32 and earlier emulates the required functionality using a combination of the faccessat () system call and fstatat (2). However, this emulation does not take ACLs into account. Starting with glibc 2.33, the wrapper function avoids this bug by making use of the faccessat2 () system call where it is provided by the underlying kernel.

バ ー ジ ョ ン 2.4 (と そ れ 以 前 ) の カ ー ネ ル に は 、 ス ー パ ー ユ ー ザ ー で の X_OK の チ ェ ッ ク の 扱 い に 奇 妙 な 点 が あ る 。 デ ィ レ ク ト リ 以 外 の フ ァ イ ル で (ユ ー ザ ー 、 グ ル ー プ 、 他 人 の ) 全 て の カ テ ゴ リ ー に つ い て 実 行 許 可 が な い 場 合 、 access () の チ ェ ッ ク で -1 が 返 る の は mode X_OK だ け が 指 定 さ れ た と き だ け で あ り mode R_OK W_OK が 一 緒 に 指 定 さ れ た 場 合 に は access () は 0 を 返 す 。 (バ ー ジ ョ ン 2.6.3 以 前 の ) 初 期 の 2.6 系 の カ ー ネ ル も 2.4 系 の カ ー ネ ル と 同 様 の 動 作 を す る 。

2.6.20 よ り 前 の カ ー ネ ル で は 、 こ れ ら の シ ス テ ム コ ー ル は フ ァ イ ル が 存 在 す る フ ァ イ ル シ ス テ ム を mount (2) す る 際 に 指 定 さ れ た MS_NOEXEC フ ラ グ の 効 果 を 無 視 し て い た 。 カ ー ネ ル 2.6.20 以 降 で は 、 MS_NOEXEC フ ラ グ は 考 慮 さ れ る よ う に な っ て い る 。

関 連 項 目

chmod (2), chown (2), open (2), setgid (2), setuid (2), stat (2), euidaccess (3), credentials (7), path_resolution (7), symlink (7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。