アプリケーションは静的にリンクされていますか?
そうでない場合は、いくつかのシンボルをオーバーライドできます。たとえば、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
わかりました。
そして今:
$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
変数 LD_PRELOAD=./libtest.so
で実行するとどうなりますか ? C ライブラリで定義されているシンボルを libtest.so で定義されているシンボルでオーバーライドします。
systrace はまさに必要なことを行っているようです。ウィキペディアのページから:
<ブロック引用>アプリケーションは、ポリシーで許可されていると指定されたシステム コールのみを実行できます。明示的に許可されていないシステム コールをアプリケーションが実行しようとすると、アラームが発生します。
これは、サンドボックス化 (具体的には、ルールベースの実行) の適用例の 1 つです。一般的な実装の 1 つは SELinux です。
プロセスに許可したいことに対応するポリシーを作成する必要があります。