2012-11-12 9 views
9

私は子プロセスを生成するプログラムを作成しています。セキュリティ上の理由から、私はこれらのプロセスが何ができるのかを制限したい。私はchrootulimitのようなプログラム外からのセキュリティ対策を知っていますが、それ以上のことをしたいのです。子プロセスによって行われたシステムコールを制限したい(例えば、open()fork()などの呼び出しを防ぐ)。それを行う方法はありますか?最適には、ブロックされたシステムコールはエラーで返されるべきですが、それが不可能な場合は、プロセスを強制終了することも有効です。プロセスが特定のシステムコールを実行するのを防ぐ

私はそれがwuth ptrace()を行うことができると思いますが、マニュアルページからこの目的のためにどのように使用するのか本当に分かりません。

+3

おそらく、SELinuxのhttp://en.wikipedia.org/wiki/Security-Enhanced_Linuxが必要です。私は100%確実ではありませんが、プログラマブルなAPIが必要です。 –

+4

['prctl(PR_SET_SECCOMP、...)'](http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html)があなたが望むものかもしれません。それはあなたが得ることができるように「システムコールを許可しない」ことに近いものです。 – Damon

+1

'prctl(PR_SET_SECCOMP、...)'の問題は、 'exec()'呼び出しをブロックすることになりますので、私には使えません。 – petersohn

答えて

5

ptraceのやり方をしたいのであれば、いくつかの選択肢があります(そしていくつかは本当にシンプルです)。まず、チュートリアルexplained hereに従うことをお勧めします。それを使用して、どのシステムコールが呼び出されているかを知る方法と、基本的な知識(覚えておいてください。非常に短いチュートリアルです)を学ぶことができます。

  • 1が子供を殺すことであろう最も簡単で、それはthis exact code hereです:あなたが持っているオプションは(私が知っている)以下のとおりです。
  • 次に、PTRACE_SETREGSでレジスタを変更して間違った値を入れるだけで、子プロセスを失敗させることができます。また、システムコールの戻り値を変更することもできます(やはりPTRACE_SETREGSで)。
  • 最後に、システムコールをスキップできます。しかし、システムコールコールの後にアドレスを知っていなければなりません。intructionレジスタをそこにポイントさせ、それを設定してください(もう一度、PTRACE_SETREGSで)。
+2

サンドボックス化のためにptraceを使用する[大きな警告](http://stackoverflow.com/a/4421762/134633)があることに注意してください。 – caf

6

カーネルバージョン3.5に追加されたSECCOMP_FILTERのように聞こえます。 libseccomp libraryは、この機能に使いやすいAPIを提供します。

ちなみに、chroot()setrlimit()は、どちらもプログラム内で呼び出せるシステムコールです.secomppフィルタリングに加えて、これらのいずれかまたは両方を使用することをお勧めします。

+0

いいですが、私は2.6.32カーネルを使用しています。 – petersohn

関連する問題