第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記事一覧 |
- Windows起動前後にデバイスを守る工夫、ルートキットを防ぐ (2017/7/24)
Windows 10が備える多彩なセキュリティ対策機能を丸ごと理解するには、5つのスタックに分けて順に押さえていくことが早道だ。連載第1回は、Windows起動前の「デバイスの保護」とHyper-Vを用いたセキュリティ構成について紹介する。 - WannaCryがホンダやマクドにも。中学3年生が作ったランサムウェアの正体も話題に (2017/7/11)
2017年6月のセキュリティクラスタでは、「WannaCry」の残り火にやられたホンダや亜種に感染したマクドナルドに注目が集まった他、ランサムウェアを作成して配布した中学3年生、ランサムウェアに降伏してしまった韓国のホスティング企業など、5月に引き続きランサムウェアの話題が席巻していました。 - Recruit-CSIRTがマルウェアの「培養」用に内製した動的解析環境、その目的と工夫とは (2017/7/10)
代表的なマルウェア解析方法を紹介し、自社のみに影響があるマルウェアを「培養」するために構築した動的解析環境について解説する - 侵入されることを前提に考える――内部対策はログ管理から (2017/7/5)
人員リソースや予算の限られた中堅・中小企業にとって、大企業で導入されがちな、過剰に高機能で管理負荷の高いセキュリティ対策を施すのは現実的ではない。本連載では、中堅・中小企業が目指すべきセキュリティ対策の“現実解“を、特に標的型攻撃(APT:Advanced Persistent Threat)対策の観点から考える。
|
|