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

标签 linux security linux-kernel hook system-calls

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

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

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

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

我想确保应用程序无法执行系统调用d。当执行系统调用 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 中定义的符号覆盖 C 库中定义的符号。

关于linux - 限制 Linux 应用程序的系统调用访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2146059/

相关文章:

security - 哈希和登录

c - libusb 程序的 makefile

c - 内核在添加新代码时中断(永远不会运行)

linux - 是否可以在 Linux 内核上设置基于角色的安全文件系统

linux - nop 是忙等待吗?

linux - 如何从浏览器或 Azure Functions 调用远程计算机上的 Shell 脚本

linux - 附加脚本是否试图破解密码?

c++ - main 之前 C++ 程序中的奇怪段错误

linux - sudo 在 centOS 6.9 服务器上不工作

java - Spring - 如何使用 SAML 2.0 实现单点登录