名 前
capget, capset − ス レ ッ ド の ケ ー パ ビ リ テ ィ を 設 定 /取 得 す る
書 式
#include <sys/capability.h>
int capget(cap_user_header_t hdrp, cap_user_data_t datap);
int capset(cap_user_header_t hdrp, const cap_user_data_t datap);
説 明
Linux 2.2 で 、 ス ー パ ー ユ ー ザ ー (root) の 権 限 は 、 個 別 の ケ ー パ ビ リ テ ィ (capabilities) へ と 分 割 さ れ 、 そ の 集 合 と し て 表 現 さ れ る よ う に な っ た 。 各 ス レ ッ ド は 「 実 効 ケ ー パ ビ リ テ ィ (effective capability) の 集 合 」 を 持 ち 、 そ れ に よ っ て 現 在 ど の 操 作 が 実 行 可 能 か を 識 別 で き る 。 ま た 、 各 ス レ ッ ド は 、 「 継 承 可 能 ケ ー パ ビ リ テ ィ (inheritable capability) の 集 合 」 と 「 許 可 ケ ー パ ビ リ テ ィ (permitted capability) の 集 合 」 を 持 つ 。 「 継 承 可 能 ケ ー パ ビ リ テ ィ の 集 合 」 は execve(2) を 通 じ て 渡 す こ と が で き る ケ ー パ ビ リ テ ィ の 集 合 で あ り 、 「 許 可 ケ ー パ ビ リ テ ィ (permitted capability) の 集 合 」 は 実 効 ケ ー パ ビ リ テ ィ や 継 承 可 能 ケ ー パ ビ リ テ ィ と し て 有 効 に で き る ケ ー パ ビ リ テ ィ を 規 定 す る も の で あ る 。 こ の 二 つ の シ ス テ ム コ ー ル は ス レ ッ ド の ケ ー パ ビ リ テ ィ を 取 得 し た り 設 定 し た り す る た め の 生 の カ ー ネ ル イ ン タ ー フ ェ ー ス で あ る 。 こ れ ら の シ ス テ ム コ ー ル は Linux 特 有 で あ る と い う だ け で な く 、 カ ー ネ ル API は 変 更 さ れ る か も し れ ず 、 こ れ ら の シ ス テ ム コ ー ル の 使 用 法 (特 に cap_user_*_t 型 と い う 書 式 ) は カ ー ネ ル の リ ビ ジ ョ ン 毎 に 拡 張 さ れ る か も し れ な い が 、 以 前 の プ ロ グ ラ ム は そ の ま ま 動 作 す る 。 移 植 性 の あ る イ ン タ ー フ ェ ー ス は cap_set_proc(3) と cap_get_proc(3) で あ る 。 可 能 な ら ば ア プ リ ケ ー シ ョ ン は こ れ ら の 関 数 を 使 用 す べ き で あ る 。 ア プ リ ケ ー シ ョ ン に Linux 拡 張 を 使 用 し た い 場 合 に は 、 よ り 簡 単 に 使 え る イ ン タ ー フ ェ ー ス で あ る capsetp(3) と capgetp(3) を 使 用 す べ き で あ る 。 現 在 の 詳 細 現 在 の カ ー ネ ル の 詳 細 に つ い て 注 意 を 述 べ て お く 。 構 造 体 は 以 下 の よ う に 定 義 さ れ る 。
#define
_LINUX_CAPABILITY_VERSION_1 0x19980330
#define _LINUX_CAPABILITY_U32S_1 1
#define
_LINUX_CAPABILITY_VERSION_2 0x20071026
#define _LINUX_CAPABILITY_U32S_2 2
typedef struct
__user_cap_header_struct {
__u32 version;
int pid; }
*cap_user_header_t;
typedef struct
__user_cap_data_struct {
__u32 effective;
__u32 permitted;
__u32 inheritable; }
*cap_user_data_t; フ ィ ー ル
ド effective, permitted,
inheritable は 、 capabilities(7)
で 定 義 さ れ る
ケ ー パ ビ リ テ
ィ の ビ ッ ト マ
ス ク で あ る 。
CAP_* は ビ ッ ト 番
号 を 表 す イ ン
デ ッ ク ス 値 で
あ り 、 ビ ッ ト
フ ィ ー ル ド に OR
を 行 う 前 に CAP_*
の 値 の 分 だ け
ビ ッ ト シ フ ト
を 行 う 必 要 が
あ る 。 typedef の 方
は ポ イ ン タ ー
な の で 、 こ の
シ ス テ ム コ ー
ル に 渡 す 構 造
体 を 定 義 す る
に は 、 struct
__user_cap_header_struct と struct
__user_cap_data_struct と い う
名 前 を 使 用 し
な け れ ば な ら
な い 。 カ ー ネ
ル 2.6.25 よ り 前 で は
、 バ ー ジ ョ ン
_LINUX_CAPABILITY_VERSION_1 の 32 ビ
ッ ト ケ ー パ ビ
リ テ ィ が 推 奨
で あ る 。 カ ー
ネ ル 2.6.25 以 降 で は
、 バ ー ジ ョ ン
_LINUX_CAPABILITY_VERSION_2 の 64 ビ
ッ ト ケ ー パ ビ
リ テ ィ が 推 奨
で あ る 。 64 ビ ッ
ト ケ ー パ ビ リ
テ ィ で は datap[0] と
datap[1] が 使 用 さ れ
る の に 対 し 、 32
ビ ッ ト ケ ー パ
ビ リ テ ィ で は
datap[0] だ け が 使 用
さ れ る 。 こ れ
ら の シ ス テ ム
コ ー ル の 挙 動
に 影 響 が あ る
も う 一 つ の 変
更 点 は 、 フ ァ
イ ル ケ ー パ ビ
リ テ ィ (file capabilities) の
カ ー ネ ル に よ
る サ ポ ー ト (VFS ケ
ー パ ビ リ テ ィ
の サ ポ ー ト ) で
あ る 。 VFS ケ ー パ
ビ リ テ ィ の サ
ポ ー ト は 現 在
の と こ ろ コ ン
パ イ ル 時 の オ
プ シ ョ ン で あ
る (カ ー ネ ル 2.6.24
で 追 加 さ れ た
)。
capget() で は 、 hdrp−>pid の フ ィ ー ル ド 値 に ケ ー パ ビ リ テ ィ を 知 り た い プ ロ セ ス の プ ロ セ ス ID を 指 定 す る こ と で 、 任 意 の プ ロ セ ス の ケ ー パ ビ リ テ ィ を 調 べ る こ と が で き る 。
VFS ケ
ー パ ビ リ テ ィ
が サ ポ ー ト さ
れ て い る 場 合
VFS ケ ー パ ビ リ テ
ィ の サ ポ ー ト
で は 、 特 権 実
行 フ ァ イ ル に
ケ ー パ ビ リ テ
ィ を 追 加 す る
た め の フ ァ イ
ル 属 性 メ ソ ッ
ド が 作 成 さ れ
た 。 こ の 特 権
モ デ ル の 導 入
に よ り 、 あ る
プ ロ セ ス に よ
り 別 の プ ロ セ
ス の ケ ー パ ビ
リ テ ィ を 非 同
期 に 設 定 す る
機 能 の カ ー ネ
ル に よ る サ ポ
ー ト は 廃 止 さ
れ る 。 つ ま り
、 VFS サ ポ ー ト で
は 、 capset() を 呼 び
出 す 際 に
hdrp−>pid の 値 と
し て 許 さ れ る
の は 0 と getpid(2) が
返 す 値 だ け と
な る (ど ち ら の
値 で も 等 価 で
あ る )。
VFS ケ ー パ ビ リ テ ィ が サ ポ ー ト さ れ て い な い 場 合 カ ー ネ ル が VFS ケ ー パ ビ リ テ ィ を サ ポ ー ト し て い な い 場 合 、 hdrp の pid フ ィ ー ル ド が 0 以 外 で あ れ ば 、 capset() の 操 作 対 象 は pid で 指 定 さ れ た ス レ ッ ド の ケ ー パ ビ リ テ ィ に な る 。 pid が 0 の 場 合 は 呼 び 出 し 元 の ス レ ッ ド の ケ ー パ ビ リ テ ィ が 操 作 対 象 と な る 。 pid が シ ン グ ル ス レ ッ ド プ ロ セ ス を 参 照 し て い る 場 合 、 pid は 以 前 か ら 使 わ れ て い る プ ロ セ ス ID を 使 っ て 指 定 で き る 。 マ ル チ ス レ ッ ド プ ロ セ ス 内 の あ る ス レ ッ ド を 対 象 に す る 場 合 は 、 gettid(2) が 返 す ス レ ッ ド ID を 用 い て 指 定 す る 必 要 が あ る 。 ま た 、 capset() で は −1 や −1 よ り 小 さ な 値 を 指 定 す る こ と も で き る 。 −1 は 呼 び 出 し 元 と init(1) を 除 く 全 て の ス レ ッ ド を 対 象 と し て 変 更 を 行 う こ と を 、 −1 よ り 小 さ な 値 は ID が −pid の プ ロ セ ス グ ル ー プ の 全 メ ン バ を 対 象 と し て 変 更 を 行 う こ と を 意 味 す る 。 こ の デ ー タ の 詳 細 は capabilities(7) を 参 照 す る こ と 。
返 り 値
成 功 し た 場 合 は 0 が 返 さ れ る 。 エ ラ ー の 場 合 は −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。
hdrp の フ ィ ー ル ド version に サ ポ ー ト さ れ て い な い 値 が 指 定 さ れ た 場 合 、 呼 び 出 し は エ ラ ー EINVAL で 失 敗 し 、 version に カ ー ネ ル 推 奨 の _LINUX_CAPABILITY_VERSION_? を 設 定 す る 。 こ の よ う に し て 、 現 在 の 推 奨 ケ ー パ ビ リ テ ィ リ ビ ジ ョ ン が 何 か を 調 べ る こ と が で き る 。
エ ラ ー
EFAULT 不 正 な メ モ リ ー ア ド レ ス 。 |
hdrp は NULL で あ っ て は な ら な い 。 datap |
に NULL を 指 定 し て よ い の は 、 ユ ー ザ ー が カ ー ネ ル が サ ポ ー ト し て い る 推 奨 の ケ ー パ ビ リ テ ィ バ ー ジ ョ ン を 判 定 し よ う と し て い る と き だ け で あ る 。
EINVAL 引 き 数 の ど れ か が 無 効 で あ る 。 | |
EPERM 「 許 可 ケ ー パ ビ リ テ ィ セ ッ ト 」 に ケ ー パ ビ リ テ ィ を 追 加 し よ う と し て い る か 、 も し く は 「 許 可 ケ ー パ ビ リ テ ィ セ ッ ト 」 に 含 ま れ な い ケ ー パ ビ リ テ ィ を 「 実 効 ケ ー パ ビ リ テ ィ セ ッ ト 」 や 「 継 承 可 能 ケ ー パ ビ リ テ ィ セ ッ ト 」 に セ ッ ト し よ う と し て い る 。 | |
EPERM 呼 び 出 し 元 が 自 分 以 外 の ス レ ッ ド の ケ ー パ ビ リ テ ィ を |
capset() を 使 っ て 修 正 し よ う と し た が 、 十 分 な 特 権 が な か っ た 。 VFS ケ ー パ ビ リ テ ィ を サ ポ ー ト し て い る カ ー ネ ル で は 、 こ の 操 作 が 許 可 さ れ る こ と は 決 し て な い 。 VFS ケ ー パ ビ リ テ ィ を サ ポ ー ト し て い な い カ ー ネ ル で は 、 CAP_SETPCAP ケ ー パ ビ リ テ ィ が 必 要 で あ る 。 (バ ー ジ ョ ン 2.6.11 よ り 前 の カ ー ネ ル に は 、 こ の ケ ー パ ビ リ テ ィ を 持 た な い ス レ ッ ド が pid フ ィ ー ル ド に 0 で な い 値 (つ ま り 、 0 の 代 わ り に getpid(2) が 返 す 値 ) を 指 定 し て 自 分 自 身 の ケ ー パ ビ リ テ ィ を 変 更 し よ う と し た 場 合 に も 、 こ の エ ラ ー が 発 生 す る と い う バ グ が あ っ た 。 )
ESRCH そ の よ う な ス レ ッ ド が 存 在 し な い 。 |
準 拠
こ れ ら の シ ス テ ム コ ー ル は Linux 独 自 で あ る 。
注 意
ケ ー パ ビ リ テ ィ を 設 定 し た り 取 得 し た り す る 機 能 の た め の 移 植 性 あ る イ ン タ ー フ ェ ー ス は libcap ラ イ ブ ラ リ に よ っ て 提 供 さ れ る 。 こ の ラ イ ブ ラ リ は 以 下 か ら 入 手 で き る :
http://git.kernel.org/cgit/linux/kernel/git/morgan/libcap.git">http://git.kernel.org/cgit/linux/kernel/git/morgan/libcap.git
関 連 項 目
clone(2), gettid(2), capabilities(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。