【问题标题】:How to prevent a system call from being executed with ptrace如何防止使用 ptrace 执行系统调用
【发布时间】:2012-10-23 22:04:09
【问题描述】:

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

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

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

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

【问题讨论】:

  • PTRACE_SYSEMU?根据手册页:“此调用由想要模拟所有孩子的系统调用的用户模式 ​​Linux 使用”

标签: c++ c ptrace


【解决方案1】:

请记住,您的沙箱只有在其运行的代码不是多线程的情况下才能安全。您还必须非常小心地防止沙盒代码分叉。

例如,参见 Robert Watson 关于这些问题的论文的以下讨论:

Exploiting races in system call wrappers

论文链接到那篇文章,但我也会直接在此处提供链接:

"Exploiting Concurrency Vulnerabilities in System Call Wrappers"

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

【讨论】:

  • 或者,由于您计划首先阻止应用程序调用某些系统调用,您可以阻止它们分叉或创建线程。不过,这会大大降低程序的功能。
【解决方案2】:

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

编辑:

有一个名为 pinktrace 的 ptrace 包装器,它应该会让你的工作更轻松,这里还有更多信息:

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

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2011-06-09
    • 2017-01-03
    • 2012-04-03
    • 2012-08-14
    • 2012-11-05
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多