« 2009年02月 | メイン | 2009年04月 »
2009年03月16日
FreeBSD の ptrace ではサンドボックスを作れないという話
t/rperl.tを使うと、特定のシステムコールを禁止しつつ任意の perl script を実行できます。
404 Blog Not Found:perl - FreeBSD::i386::Ptrace released!
自分も今回、弾さんのモジュールを試すまで知らなかったのですが、FreeBSD では ptrace をそのような目的で使うことはできないと思います。というのは、私の理解が正しければ、linux とは異なり、FreeBSD の ptrace でシステムコールの実行を検出し PT_KILL を発行しても、そのプロセスが停止するのはシステムコールの終了直後になるからです。
具体例を挙げると、たとえば unlink(2) の実行を検出しトレース対象のプロセスを殺そうとしたところで、そのプロセスが停止するのは unlink システムコールの実行後となるため、ファイルの削除を抑制することはできません。
さらに、vfork(2) は、仕様として、生成された子プロセスが execve(2) を呼び出すか、あるいは終了するまで、システムコールの実行が完了しません (つまりそれまでトレース対象のプロセス (実際はプロセスグループなんじゃないかな) を停止できない)。その結果、ptrace によるシステムコールの監視下にあっても、
vfork(); // 以下は生成された子プロセスでのみ実行される 複数個の任意のシステムコールを含むコード ... _exit(0); // 子プロセスの終了直後に親プロセスが PT_KILL されるのような形で、任意のプログラムが実行可能となってしまいます。
以上は、手元の FreeBSD 6.3R で検証した結果ですが、最新リリースでも当該部分の動作は変わっていないのではないかと思います。
参考: Deny system call using ptrace | KernelTrap, geordi - C++ eval bot投稿者 kazuho : 2009年03月16日 14:50 | トラックバック (0)