Capabilityのビットの種類
プロセスに関するLinux Capabilityには4種類のビットがあり、それぞれ役割が異なる。
[note]
P: Permitted
E: Effective
I: Inherited
B: Bounding
[/note]
この中で、プロセスがCapabilityを必要とする操作をOSに対して要求した際、評価されるのはEビットである。しかし、Eビットを決定する過程で他のビットも利用される。
Capabilityのビットの関係
例えば、capset(2)システムコールを使う場合のビットの関係は以下のようになる。
[note]
new P ⊆ old P
new E ⊆ new P
[/note]
ここで、プロセスにおいて最終的にCapabilityとして評価されるのはEビットであるが、PビットによってEビットで操作できるCapabilityの範囲が決められている。EビットはPビットの範囲内であれば、同一プロセス内でCapabilityの付与や剥奪を行うことができる。
同一プロセス内でのEビットとPビット
例えば、特定のルーチン内でのみEビットにCapabilityを与え、ルーチンの最後でCapabilityを剥奪し、他のルーチンではCapabilityの無い状態で処理をさせることができる。ただし、同一プロセス上で、PビットのCapabilityが一旦剥奪されると、そのCapabilityは同一プロセス内で二度と付与することができない。
「Capabilityの剥奪は一方向、剥奪したCapabilityを付与することはできない」とされる所以はPビットのCapabilityに関してである。さらに、Pビットはexecve(2)の計算時にrootユーザであってもBビットによって制限され、Bビットも剥奪の方向へしかCapabilityを操作できない。
BビットやPビットが剥奪する方向へ一方向なのは、chroot(2)を使ってプロセス固有のnamespaceから脱獄できないようにする目的があったとされている。
ここで疑問
では、BビットにはCapabilityが設定されていないが、PビットにはCapabilityが設定されていたとする。このようなプロセスをのっとられた場合、どういう危険性が考えられるだろうか。
「Linux Capabilityに関するまとめと更なる疑問」への1件のフィードバック
コメントは受け付けていません。