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

时间:2012-11-03 11:55:19

标签: c++ c ptrace

我正在研究类似Ideone的系统,其中不受信任的用户代码必须以沙盒模式运行。

为此,我一直在寻找ptrace第一层保护的可能性。然而,经过几次实验后,似乎:

  • 我可以在调用之前拦截系统调用并修改输入参数。
  • 我可以在调用后拦截系统调用并更改返回值。
  • 然而,似乎根本没有办法阻止呼叫的骚扰(除了杀死整个应用程序)。

我想拦截某些系统调用并返回一个虚假的结果代码而不会实际调用。有没有办法实现这个?

2 个答案:

答案 0 :(得分:2)

请注意,如果您运行的代码不是多线程的,那么沙箱只能是安全的。您还必须非常小心,以防止沙盒代码分叉。

例如,请参阅以下关于Robert Watson关于问题的论文的讨论:

Exploiting races in system call wrappers

该文章与该文章有关,但我也会直接在这里提供链接:

"Exploiting Concurrency Vulnerabilities in System Call Wrappers"

更好的方法似乎仍然是Watson推荐的:将安全框架完全集成到内核中并注意其使用以避免并发问题。 Linux和NetBSD以及Mac OS X和其他面向安全的系统已经提供了这样的框架,因此如果使用这些系统,所有必要的是在这些现有框架内实现您的策略。即甚至不尝试在系统调用包装器或其他系统调用插入机制中实现安全策略。

答案 1 :(得分:1)

你可以通过递增IP(指令指针)来跳转执行系统调用的指令,这样就不会执行调用,你可以像往常一样设置返回值。

修改:

有一个名为pinktrace的ptrace包装器,可以让您的工作更轻松,还有更多信息:

https://security.stackexchange.com/questions/8484/wrapping-system-call-in-reliable-and-secure-way