假设一个Linux二进制foobar
有两种不同的操作模式:
a
, b
和c
的行为良好的模式。 a
, b
, c
和d
的事物错误模式。 系统调用a
, b
和c
是无害的,而系统调用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的用途。 查看如何限制对系统调用的访问 。