6

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

  • 模式 A:一种行为良好的模式,其中a使用b和系统调用c
  • a模式 B:使用系统调用、bc的出错模式d

Syscalla和是无害的,bcsyscalld具有潜在危险,可能导致机器不稳定。

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

我想确保应用程序无法执行 syscall d。执行系统调用时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

行。

现在:

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

使用变量运行时会发生什么LD_PRELOAD=./libtest.so?它使用 libtest.so 中定义的符号覆盖 C 库中定义的符号。

于 2010-01-27T10:45:06.327 回答
7

似乎systrace正是您所需要的。从维基百科页面

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

于 2010-01-27T10:57:12.617 回答
4

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

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

于 2010-01-27T10:33:05.353 回答
3

这正是seccomp-bpf的用途。请参阅如何限制对系统调用的访问的示例

于 2014-12-10T13:27:19.293 回答