假设Linux二进制文件foobar
有两种不同的操作模式:
a
,b
和c
。a
,b
,c
和d
的错误模式。 Syscalls a
,b
和c
是无害的,而系统调用d
具有潜在危险,可能导致机器不稳定。
进一步假设应用程序运行的两种模式中的哪一种是随机的:应用程序以模式A运行,概率为95%,模式B运行概率为5%。该应用程序没有源代码,因此无法修改,只能按原样运行。
我想确保应用程序无法执行syscall d
。执行系统调用d
时,结果应该是NOOP或应用程序的立即终止。
如何在Linux环境中实现这一目标?
答案 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)