mod_ruid2はgroupsを元の状態に戻せないのでpatch作成

mod_ruid2はDSO版のPHP等を効率良くある程度安全に使うにはかなり良いモジュールである。

「ある程度」と書いたのは、それなりに脆弱性があるためで、それは今後紹介するとして今回はそこに関しては言及しない。

簡単なmod_ruid2の動作だが、preforkされているサーバプロセスに対してリクエストがあった場合、サーバプロセスそのものをリクエスト対象のファイルの権限(uidやgid等)もしくは任意 の権限に変更し、そのごリクエスト処理を行なって、最後に変更されたサーバプロセスの権限を元の権限に戻す。このあたりの細かい話はLinux Capabilityの話になってくるので省略する。

ところが、今回色々試していると、サーバプロセスのユーザー、例えばapacheユーザー等がgroupsの設定を持っていた場合には、groupsの権限は戻せない実装になっていた。そのため、ある ディレクトリをgroupsで設定された別のgroup、例えばwww-admin等で権限設定されていた場合、元のapacheユーザーはwww-adminにアクセスできるが、mod_ruidの処理後そのgroups設定がなくなってしまい、アクセスできなくなる。

続きを読む

拡張子によってApacheモジュールの処理を適応するか判断するpatch(mod_ruid2版)

ブログはかなり久々。

会社での実装でいいものが生まれたりするのが、なかなかそれを社外に公開するわけにはいかず、あまり技術的な創作物をブログに書くことができなかった。今は、会社2割大学8割のような比率で研究しているので、最近作ったpatchでも紹介する。

実装対象は、DSO版PHPなどでもsuEXECのようなアクセス制御が行えるmod_ruid2に対してpatchを書いてみた。

mod_ruid2は実装上、モジュールとしてApacheに読み込んだ場合、すべての動的コンテンツ実行時にサーバプロセスをsetuid、setgidしてしまう。しかし、ある特定の環境下では、任意の拡張子(.phpや.py)においてのみモジュールの処理を実行させたい場合がある。Filesディレクティブ等を用いて、ファイルを指定するやり方もあるが、mod_ruid2等ではそういう設定記述は禁止されている。

そこで、mod_ruid2に2つの機能を実装した。

続きを読む

Linux Capabilityの全て

Linux Capabilityの全てはこの式を噛み締めること。

意外と味がでてくる。

PはスレッドのCapability。

FはファイルのCapability。

ダッシュがついたら新しいCapability。

[important]

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

P'(effective)     = F(effective) ? P'(permitted) : 0

P'(inheritable) = P(inheritable)

[/important]

Permittedやらは前言ったとおりで、cap_bsetはbounding set。

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

Capabilityのビットの種類


プロセスに関するLinux Capabilityには4種類のビットがあり、それぞれ役割が異なる。

[note]

P: Permitted

E: Effective

I: Inherited

B: Bounding

[/note]

この中で、プロセスがCapabilityを必要とする操作をOSに対して要求した際、評価されるのはEビットである。しかし、Eビットを決定する過程で他のビットも利用される。

続きを読む

Linux Capabilityに関する疑問

Capabilityをセットする際、セットしたいCapability *以外* のCapabilityを落としすことでCapability機能を実現している。その *落とした* Capabilityを再度同じプロセスにセットし直せない様な仕様になっているのは、どういうリスクを想定しているのだろうか。

もう少し踏み込んでみよう。

例えば、あるプロセスにあるCapabilityのみをセットした状態にし、それ以外のCapabilityは落とした状態とする。
そこで、

「プロセスにセットしてあるCapabilityを一旦落とした後、再度、直前までセットしていたCapability *のみ* をセットし直すことは可能だ」

という仕様を許可することは、リスク的にどういったものが考えられるのだろうか?