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

kno*_*orv 4 linux security hook system-calls linux-kernel

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

  • 模式A:行为良好的模式,其中的系统调用a,b并且c被使用.
  • 模式B:一个东西,走了错误的方式,其中的系统调用a,b,cd使用.

Syscalls a,b并且c是无害的,而系统调用d具有潜在的危险性,可能导致机器不稳定.

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

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

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

Art*_*yom 7

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

您可以覆盖某些符号,例如,让我们重新定义 socket

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

然后构建共享库:

gcc -fPIC -shared test.c -o libtest.so
Run Code Online (Sandbox Code Playgroud)

我们来吧:

nc -l -p 6000
Run Code Online (Sandbox Code Playgroud)

现在:

$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
Run Code Online (Sandbox Code Playgroud)

使用变量运行时会发生什么,LD_PRELOAD=./libtest.so它会覆盖libtest.so中定义的符号,而不是在库中定义的符号.


Tor*_*rek 6

似乎systrace完全符合您的需求.从维基百科页面:

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


Pas*_*uoq 5

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

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