第3回 権限を最小化するLinuxカーネルケーパビリティ

面 和毅
サイオステクノロジー株式会社
インフラストラクチャービジネスユニット
Linuxテクノロジー部
OSSテクノロジーグループ
シニアマネージャ
2006/1/18

 ケーパビリティの実態

 ケーパビリティには、

  • システム全体を通して定義される「ケーパビリティバウンディングセット
  • プロセスごとに設定される「プロセスケーパビリティセット(3種類)」

の2種類があり、これらから各プロセスの持つケーパビリティが決定されます。それぞれのケーパビリティセットは、32ビットのビット列になっており各ビット列がそれぞれ約30種類のケーパビリティに対応しています。

図1 ケーパビリティセット(クリックで拡大)

 ケーパビリティバウンディングセットは、システム全体に対して適用されるケーパビリティセットで、最初にプロセスを特権で起動したときに、プロセスが持つケーパビリティのデフォルト値を決めるものです。これは/proc/sys/kernel/cap-boundにより定義されており、この値を変更することで調整できます。

 プロセスケーパビリティセットは、PID(プロセスID)を要素とする構造体により定義されており、それぞれのPIDに対して以下の3種類のケーパビリティセットを要素として含んでいます。

/usr/src/linux/include/linux/capability.h)
  32 typedef struct __user_cap_header_struct {
  33  __u32 version;
  34  int pid;
  35 } __user *cap_user_header_t;
  36
  37 typedef struct __user_cap_data_struct {
  38  __u32 effective;
  39  __u32 permitted;
  40  __u32 inheritable;
  41 } __user *cap_user_data_t;
  • 実効(effective)ケーパビリティセット:実際に判定されるケーパビリティのセット
  • 継承(inheritable)ケーパビリティセット:プロセスをexec()した際に継承するケーパビリティのセット
  • 許可(permitted)ケーパビリティセット:プロセスが持つことを許可されているケーパビリティのセット
図2 各プロセスが持つ3種類のケーパビリティセットの例(クリックで拡大)

 先述のntpdの例ですと、実際にCAP_SYS_TIMEがあるかどうか、あるいはCAP_NET_BIND_SERVICEがあるかどうかの処理は、実効ケーパビリティセットにより判定されます。

 これらの3種類のプロセスケーパビリティセットは、プロセスがexec()された際に「ケーパビリティバウンディングセット」と「exec()前にプロセスが持っていた3種類のプロセスケーパビリティセット」から計算されます。

P exec()前のプロセスのケーパビリティセットの値
P' exec()後のプロセスのケーパビリティセットの値
cap_bset ケーパビリティバウンディングセット
F ファイルケーパビリティセット(後述)の値

とすると、

P'(permitted) = (P(inheritable) & F(inheritable)) |
          (F(permitted) & cap_bset)

P'(effective) = P'(permitted) & F(effective)

P'(inheritable) = P(inheritable) [つまり、変更されない]

となります。

 ファイルケーパビリティセットは、現在のLinuxではきちんと実装しきれていないため、現状では「プログラムを特権で動作させた際や、プログラムにset-UIDビットが設定されている場合に全ケーパビリティがON(32ビット列がすべて1)となる」とされています。そのため、上の式は、

P'(permitted) = (P(inheritable) | cap_bset)

P'(effective) = P'(permitted)

P'(inheritable) = P(inheritable)

となります。現状の実装では、プロセスがexec()されたときには、

  • 許可ケーパビリティセットは、継承してきたケーパビリティセットとケーパビリティバウンディングセットの論理和になる
  • 実効ケーパビリティセットは、許可ケーパビリティセットと等しくなる
  • 継承ケーパビリティセットは変化しない

となります。

3/4

Index
権限を最小化するLinuxカーネルケーパビリティ
  Page1
権限を切り分けるPOSIXケーパビリティ
Linuxカーネルケーパビリティ
  Page2
ケーパビリティチェック
LIDSによるケーパビリティの拡張
ファイルに対するアクセス制御のフロー
Page3
ケーパビリティの実態
  Page4
ケーパビリティの調整方法
LIDSを用いた場合のケーパビリティの調整方法


Security&Trust記事一覧


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間