限制Linux应用程序的系统调用访问

假设一个Linux二进制foobar有两种不同的操作模式:

  • 模式A:使用系统调用abc的行为良好的模式。
  • 模式B:使用系统调用abcd的事物错误模式。

系统调用abc是无害的,而系统调用d有潜在危险,可能会导致机器不稳定。

进一步假定应用程序运行的两种模式中的哪一种是随机的:应用程序以95%的概率在模式A中运行,在模式B中以5%的概率运行。 该应用程序没有源代码,所以它不能被修改,只能按原样运行。

我想确保应用程序不能执行系统调用d 。 当执行系统调用时,结果应该是NOOP或应用程序的立即终止。

我如何在Linux环境下实现这一目标?

应用程序是否静态链接?

你可以重写一些符号,例如,让我们重新定义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运行时会发生什么,它将覆盖库中定义的libtest.so中定义的符号。

看来, systrace确实是你所需要的。 从维基百科页面 :

应用程序只允许在策略中允许指定的系统调用。 如果应用程序尝试执行未明确允许的系统调用,则会引发警报。

这是沙盒的一个可能的应用(特别是基于规则的执行)。 一个流行的实现是SELinux 。

您必须编写与您希望允许该流程执行的操作相对应的策略 。

这正是seccomp-bpf的用途。 查看如何限制对系统调用的访问 。