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[] の内容 |
重要な注意:
- このディレクティブで指定したプログラムには file execute ディレクティブを指定すべきではありません。
- このディレクティブで指定したプログラムのためのドメインは強制モードの状態にしておくべきです。
- LD_PRELOAD などの危険な環境変数によって想定外の動作をすることを予防するため、全ての環境変数はクリアされます。環境変数 PATH もクリアされることに注意してください。その他の資源、例えば標準入力や標準出力などは引き継がれます。
- プロセスが chroot 内部の環境で動作している場合、このディレクティブで指定されたプログラムがその chroot 環境の内部に存在している場合のみ機能します。
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 と同じです。
重要な注意:
- LD_PRELOAD などの危険な環境変数によって想定外の動作をすることを予防するため、全ての環境変数はクリアされます。環境変数 PATH もクリアされることに注意してください。その他の資源、例えば標準入力や標準出力などは引き継がれます。
- プロセスが chroot 内部の環境で動作している場合、このディレクティブで指定されたプログラムがその chroot 環境の内部に存在している場合のみ機能します。