11

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

私はそれを行うことができると思いますptrace()が、manページから私はこの目的のためにそれを使用する方法を本当に理解していません。

4

2 に答える 2

8

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

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

于 2012-11-12T12:07:04.010 に答える
5

この方法でやりたい場合はptrace、いくつかのオプションがあります (いくつかは非常に単純です)。まず、ここで説明されているチュートリアルに従うことをお勧めします。これを使用すると、呼び出されているシステム コールを知る方法と、基本的なptrace知識を学ぶことができます (心配しないでください。これは非常に短いチュートリアルです)。あなたが持っているオプション(私が知っている)は次のとおりです。

  • 最も簡単なのは子供を殺すことです。これがまさにこのコードです
  • PTRACE_SETREGS次に、 でレジスタを変更し、間違った値を入れるだけで、子を失敗させることができます。また、必要に応じてシステムコールの戻り値を変更することもできます (これも でPTRACE_SETREGS)。
  • 最後に、システム コールをスキップできます。しかし、そのためには、システム コール呼び出しの後にアドレスを知っている必要があります。命令レジスタ ポイントをそこに作成し、それを設定します (再度、 を使用PTRACE_SETREGS)。
于 2012-11-12T19:06:31.827 に答える