6

foobar2 つの異なる操作モードを持つLinux バイナリを想定します。

  • モード A: syscalls abおよびcが使用される行儀の良いモード。
  • モード B: syscall abcおよびdが使用される、問題が発生したモード。

syscallおよびsyscall は無害ですがa、syscallは潜在的に危険であり、マシンを不安定にする可能性があります。bcd

さらに、アプリケーションが実行する 2 つのモードのどちらがランダムであると仮定します。アプリケーションは、モード A で 95 % の確率で実行され、モード B で 5 % の確率で実行されます。アプリケーションにはソースコードが含まれていないため、変更することはできず、そのまま実行するだけです。

アプリケーションが syscall を実行できないようにしたいd。syscall を実行するdと、結果は NOOP またはアプリケーションの即時終了のいずれかになります。

Linux 環境でそれを実現するにはどうすればよいですか?

4

4 に答える 4

8

アプリケーションは静的にリンクされていますか?

そうでない場合は、いくつかのシンボルをオーバーライドできます。たとえば、再定義しましょうsocket:

int socket(int domain, int type, int protocol)
{
        write(1,"Error\n",6);
        return -1;
}

次に、共有ライブラリを構築します。

gcc -fPIC -shared test.c -o libtest.so

実行しましょう:

nc -l -p 6000

Ok。

そしていま:

$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket

variable で実行するとどうなりますLD_PRELOAD=./libtest.soか? libtest.so で定義されたシンボルで、C ライブラリで定義されたシンボルをオーバーライドします。

于 2010-01-27T10:45:06.327 に答える
7

systraceはまさに必要なことを行っているようです。ウィキペディアのページから:

アプリケーションは、ポリシーで許可されていると指定されたシステム コールのみを実行できます。明示的に許可されていないシステム コールをアプリケーションが実行しようとすると、アラームが発生します。

于 2010-01-27T10:57:12.617 に答える
4

これは、サンドボックス化(具体的には、ルールベースの実行) の適用例の 1 つです。一般的な実装の 1 つにSELinuxがあります。

プロセスに許可する内容に対応するポリシーを作成する必要があります。

于 2010-01-27T10:33:05.353 に答える