如何使用ptrace防止系统调用被执行

7

我正在开发一个类似Ideone的系统,需要在沙盒模式下运行不受信任的用户代码。

为此,我一直在探索使用ptrace作为第一层保护的可能性。然而,在进行了一些实验后,似乎:

  • 我可以在调用系统调用之前拦截它并修改输入参数。
  • 我可以在调用系统调用之后拦截它并更改返回值。
  • 但是,好像没有办法完全阻止调用(除了杀死整个应用程序)。

我想拦截某些系统调用并返回虚假结果代码,而不实际发生调用。有实现这一点的方法吗?


PTRACE_SYSEMU?根据man手册:“此调用由像用户模式Linux这样想要模拟所有子系统调用的程序使用”。 - Krumelur
2个回答

2
请记住,如果沙箱运行的代码不是多线程的话,它才能保证安全。您还需要非常小心地防止沙盒代码分叉。
例如,可以参考罗伯特·沃森(Robert Watson)关于这些问题的论文的讨论: Exploiting races in system call wrappers 该文章中链接了该论文,但我也会在此直接提供链接: "Exploiting Concurrency Vulnerabilities in System Call Wrappers" 仍然更好的方法似乎是像沃森建议的那样:将安全框架完全集成到内核中,并注意其使用以避免并发问题。Linux、NetBSD、Mac OS X和其他安全导向的系统已经提供了这样的框架,因此如果使用这些系统,则只需在这些现有框架内实施您的策略即可。也就是说,不要试图在系统调用包装器或其他系统调用拦截机制中实现您的安全策略。

或者,由于您计划首先防止应用程序调用某些系统调用,因此可以防止它们分叉或创建线程。然而这将大大降低程序的能力。 - petersohn

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接