2012-07-13 5 views
5

私は自分のサーバー上で任意の(潜在的に危険な)バイナリを実行したいと思います。したがって、RLIMIT_CPUの適切な値を設定し、other_mainを呼び出す前にSECCOMPフラグをトグルする独自の小さなメイン関数でリンクできるように、 "main"シンボルの名前を "other_main"に変更するのにobjcopyを使用しました。これまでのところ、私はこのソリューションに満足しています。SECCOMP:malloc、realloc、freeをエミュレートするには?

サードパーティのプログラムコードにmallocの呼び出しが含まれている可能性があります。これは、プログラムを即座に終了させる可能性があります(sbrkは許可されません)。したがって、malloc/realloc/calloc/freeで使用するSECCOMPを設定する前に、適切なサイズの配列(例:20MB)を事前に割り当てたいと思います。残念ながら、私は最後のステップをアーカイブする方法を知らない。私は4つの機能をすべて自分で実装する必要がありますか? stdlibに自分自身の関数を挿入するにはどうすればいいですか?たとえば、printfがmallocを内部的に呼び出すとどうなりますか?

+0

シンボルの名前を変更するのは本当に機能していますか?私は本当にOSが剥奪されたバイナリで何をするのだろうかと思う。 –

+0

シンボルの名前の変更はここでうまくいきます。 objcopyは本当に強力です。あなたは明らかにバイナリを削除することは許されていませんが、それは私にとっては問題ではありません。私自身でバイナリをコンパイルするためです。信頼できないCコードだけです。 – tux21b

+0

OSのライブラリとは異なるCライブラリ(Newlibなど)をユーザに提供できますか?もしそうなら、自分の 'sbrk'(あなたのサンドボックスから出ることはできません)を書くのはとても簡単でしょうし、malloc/realloc/calloc/freeと友人はすべて動作します。 –

答えて

3

すべてのmalloc実装がsbrk()に基づいているわけではありません。たとえば、GNU mmallocです。カスタム実装が必要な場合は、This docも便利です。

+ 2つの単純なmallocの実装here

+0

許可されるシステムコールは、read、write、sigreturn、exitだけです。だから私はmmapを使うことはできません。プログラムの始めに十分なメモリをあらかじめ割り当てていなければ(妥当な大きさの静的配列は私のユースケースでうまくいくようです)。しかし、実際には自分のmallocを実装する必要があると仮定して、リンクは役に立ちます。しかし、私はprintfやstdlibの他の場所で使用されている内部malloc呼び出しをどのように置き換えることができるのかはまだ分かりません。 – tux21b

+0

私は答えを訂正しました.dlmallocは実際にsbrk()を使用します。しかし、そこにmmap()に基づくGNU mmalocが見つかりました。あなたの場合は、ヒープ+単純な処理機能の代わりにスタティックプール[]を使用することを検討してください。たとえば、静的配列にもN個の参照を保持することができます。それは当然擬似動的メモリであろう。 – pmod

1

seccompsandbox

  • は別の(非seccomp)に(socketpair予め割り当てられた上read/writeを介して)RPCを実行する一つのスレッドでseccompを可能同じプロセス内で、
  • のような特権操作を実行できる同じプロセス内のスレッドで、malloc(インメモリ、実行時)などのパッチ機能を使用して、 ir seccomp-safeラッパー

Chromium's seccomp Sandboxは、どのように動作するかについてもう少し詳しく説明します。

2

mallocとfreeの場合、プログラムは独自のバージョンを定義する必要があります。 (glibc、klibc、およびdietlibcを含む)私が見たほとんどのlibc実装は、メモリ割り当てルーチンをうまく使用します。したがって、seccompモードに入る前に、mmapまたはsbrkを使用して大きなチャンクを割り当ててから、このチャンクからmalloc/freeを割り当ててください。 memmgrは、単純なヒープアロケータであり、固定バッファからの割り当てに簡単に適応できます。

seccompの実際の問題は、それが許可するシステムコールの集合(read、write、exit、sigreturn)が、 libcにリンクされたプログラムを実行するには不十分であるということです。たとえば、次のglibcで

  • をexit_group呼び出し_exitのglibcで

    • 、出口と、printf関数はMMAP dietlibcで
    • を呼び出すことができ、scanf関数は、IOCTLなど等
    を呼び出すことができ

    通常、これらの呼び出しが必要な理由はよくあります。たとえば、dietlibcはstdoutをフラッシュするためにstdinがstdinから読み込まれたときにstdinがttyであるかどうかを調べるためにioctlを使います。これは、出力が行バッファリングされている場合、対話型入力を読み取る前にプロンプ​​トが確実に表示されるようにする標準的な動作です。

    このように、元のseccompモードは多かれ少なかれ役に立たないという結論に達しました。しかし、モード2(a.k.a. "フィルタモード")は、特定のシステムコールをホワイトリストに登録できるので、はるかに便利です。私はを私のgithubページに持っています。これはseccompモード2でプログラムを実行しますが、printfとscanfを使うことができ、malloc/freeを使ってメモリを割り当てることもできます。

  • 関連する問題