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

时间:2010-01-27 10:30:24

标签: linux security linux-kernel hook system-calls

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

  • 模式A:一种行为良好的模式,其中使用了系统调用abc
  • 模式B:使用系统调用abcd的错误模式。

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

进一步假设应用程序运行的两种模式中的哪一种是随机的:应用程序以模式A运行,概率为95%,模式B运行概率为5%。该应用程序没有源代码,因此无法修改,只能按原样运行。

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

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

4 个答案:

答案 0 :(得分:7)

应用程序是静态链接的吗?

您可以覆盖某些符号,例如,让我们重新定义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中定义的符号,而不是库中定义的符号。

答案 1 :(得分:6)

似乎systrace完全符合您的需要。来自Wikipedia page

  

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

答案 2 :(得分:3)

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

您必须write the policy对应于您希望该流程执行的操作。

答案 3 :(得分:0)