代码之家  ›  专栏  ›  技术社区  ›  tux21b

SECCOMP:如何模仿malloc、realloc和free?

  •  6
  • tux21b  · 技术社区  · 14 年前

    我想在我的服务器上执行任意(潜在危险的)二进制文件。因此,我使用 objcopy 将“main”符号重命名为“other_main”,这样我就可以链接到自己的小main函数中,该函数为 RLIMIT_CPU 并切换 SECCOMP flag,然后再调用other_main。到目前为止,我对这个解决方案非常满意。

    现在的问题是,第三方程序代码可能包含一些对malloc的调用,这些调用可能会立即终止程序(sbrk是不允许的)。因此,我想在设置之前预先分配一些合理大小的阵列(例如20MB) SECCOMP公司 应该由malloc/realloc/free使用。不幸的是,我不知道如何归档最后一步。我必须自己实现这4个功能吗?如何将自己的函数注入stdlib(例如,当printf在内部调用malloc时会发生什么?)。

    3 回复  |  直到 14 年前
        1
  •  3
  •   pmod    14 年前

    并非所有malloc实现都基于sbrk(),例如 GNU mmalloc 。 This doc 如果需要自定义实现,也可能有用。

    +两个简单的malloc实现 here

        2
  •  2
  •   David Hovemeyer    14 年前

    对于malloc和free,您的程序只需要定义自己的版本。我见过的大多数libc实现(包括glibc、klibc和dietlibc)都会很乐意使用内存分配器例程。因此,在进入seccomp模式之前,使用mmap或sbrk分配一大块内存,然后从这个块中进行malloc/free分配。 memmgr 是一个简单的堆分配器,可以很容易地适应固定缓冲区之外的分配。

    seccomp的真正问题是,它允许的一组系统调用(读、写、退出和sigreturn)根本不足以运行或多或少链接的程序 任何 libc在那里。例如:

    • 在glibc中,exit和_exit调用exitgroup
    • 在glibc中,printf可以调用mmap
    • 在dietlbc中,scanf可以调用ioctl
    • 等等。

    这些电话之所以有必要,通常有充分的理由。例如,当从stdin读取输入时,dietlibc使用ioctl检查stdin是否为tty,以便清除stdout。如果输出是行缓冲的,则这是确保在读取交互式输入之前提示可见的标准行为。

    因此,我得出的结论是,最初的seccomp模式或多或少是无用的。然而,模式2(也称为“过滤模式”)更有用,因为它允许您将特定的系统调用列入白名单。我有一个 proof of concept 在我的github页面上,它以seccomp模式2运行程序,但允许它们使用printf和scanf,以及使用malloc/free分配内存。

        3
  •  1
  •   ephemient    14 年前

    seccompsandbox 以下为:

    • 在一个线程中启用seccomp,该线程执行RPC(通过 read / write 超过预先分配的 socketpair )到同一进程中能够执行特权操作的另一个(非seccomp)线程,例如 mmap
    • 修补功能,例如 malloc (在内存中,在运行时)重定向到其seccomp安全包装器

    Chromium's seccomp Sandbox 有关于它如何工作的更多细节。