akarititle.png

Chapter 13: カーネルの外部でプログラムの実行可否を判断する

13.1. task denied_execute_handler

AKARI を利用しているシステム管理者は通常、それぞれのドメインからどのようなプログラムが実行されるかについて把握しているはずです。そのため、正常に動作している限りはポリシーに違反するようなプログラムの実行要求が生じることは通常はありません。もし、 /bin/bash のようなプログラムの実行要求がそのようなプログラムを実行する必要の無いドメインから生じた場合、それはそのドメインに属しているプロセスが侵害されて制御を失っているであろうと考えることができます。

この時点で、カーネルは実行要求を拒否します。しかし、実行要求を拒否したところで、攻撃者が奪取した制御をプロセスに戻してくれることはまず期待できません。そのような場合に、 task denied_execute_handler ディレクティブを使うことができます。このディレクティブは、プログラムの実行要求が拒否された場合に、要求されたプログラムの代わりにディレクティブで指定されたプログラムを実行します。プログラムとして /bin/true を指定した場合、プログラムの実行を要求したプロセスはすぐに終了することでしょう。そのため、それ以上の侵害を防ぐことができます。

このディレクティブには他のプログラムを指定することもできます。例えば、攻撃者の振る舞いを観察するためにハニーポットプログラムを実行したり、警告メッセージを表示するプログラムを実行したり、攻撃者のIPアドレスを調べてファイアウォールの設定を変更するプログラムを実行したりすることもできます。

このディレクティブは以下のように指定します。強制モード用のプロファイルが割り当てられている場合のみ機能することに注意してください:

task denied_execute_handler /bin/true

このディレクティブから実行されたプロセスは以下のコマンドライン引数を受け取ります:

引数

内容

argv[0]

このディレクティブで指定されたプログラムのパス名

argv[1]

プログラムの実行を要求したプロセスのドメイン名

argv[2]

プログラムの実行を要求したプロセスのパス名

argv[3]

プログラムの実行を要求したプロセスの情報

argv[4]

実行が要求されたプログラムのパス名

argv[5]

プログラム実行要求時の引数の数( argc )

argv[6]

プログラム実行要求時の環境変数の数( envc )

argv[7] ~ argv[6 + argc]

呼び出し元プロセスが渡した argv[] の内容

argv[7 + argc] ~ argv[6 + argc + envc]

呼び出し元プロセスが渡した envp[] の内容

重要な注意:

13.2. task auto_execute_handler

通常、プログラムの実行が要求されると、カーネルがポリシーの内容と比較して実行要求を許可するかどうかを判断します。しかし、カーネルの中で判断するには幾つかの制約があります。カーネル内では利用可能なライブラリ関数がほとんどありません。また、連続したメモリ領域を割り当てることが困難です。そのため、 task auto_execute_handler ディレクティブを用いて、プログラムの実行要求を許可するかどうかの判断をカーネルの外部で行わせることができます。そのようにすることで、豊富なライブラリ関数の活用や連続したメモリ領域の確実な割り当てが可能になります。しかし、この方法にも1つ制約があります。プログラムの実行要求を許可しなかった場合に、プログラムの実行を要求したプロセスへと制御を戻す方法が存在しないのです。

この機能は、任意の外部プログラムを活用できます。SSHを利用して他のホストに問い合わせを行うことさえできます。このディレクティブを利用するテンプレートとして ccs-tools パッケージに含まれている audit-exec-param を参考にすることができます。

audit-exec-param

このプログラムは、プログラムの実行要求に渡されたコマンドライン引数および環境変数を記録に残すためのプリプロセッサとして動作します。
このプログラム自身は要求されたプログラムの実行を許可すべきかどうか判断しません。
このプログラムを好きなようにカスタマイズして使うことができます。

このディレクティブは以下のように指定します:

task auto_execute_handler /usr/lib/ccs/audit-exec-param

このディレクティブが受け取る引数は 13.1. task denied_execute_handler と同じです。

重要な注意: