Linux Capabilityに関するまとめと更なる疑問

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件のフィードバック

コメントは受け付けていません。