繁体   English   中英

SECCOMP:如何模拟malloc,realloc和free?

[英]SECCOMP: How to emulate malloc, realloc and free?

我想在我的服务器上执行任意(潜在危险)二进制文件。 因此,我用objcopy重命名“主”符号“other_main”这样我就可以在设置一个适当的值对我自己小的主要功能链接RLIMIT_CPU并在切换SECCOMP调用other_main前旗。 到目前为止,我对这个解决方案非常满意。

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

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

+ 这里有两个简单的malloc实现

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

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

  • 在glibc中,exit和_exit调用exit_group
  • 在glibc中,printf可以调用mmap
  • 在dietlibc中,scanf可以调用ioctl
  • 等等

通常有充分的理由说明为什么这些调用是必要的。 例如,dietlibc使用ioctl来检查stdin是否是从stdin读取输入时的tty,以便刷新stdout。 这是标准行为,以确保在输出是行缓冲的情况下,在读取交互式输入之前提示是可见的。

所以,我得出结论,原始的seccomp模式或多或少是无用的。 但是,模式2(又名“过滤模式”)更有用,因为它允许您将特定的系统调用列入白名单。 我在我的github页面上有一个概念证明,它以seccomp模式2运行程序,但允许它们使用printf和scanf,以及使用malloc / free分配内存。

seccompsandbox

  • 在一个线程中启用seccomp,该线程在同一进程中执行RPC(通过预先分配的socketpair read / write )到另一个(非seccomp)线程,该进程可以执行特权操作,如mmap
  • 修补malloc (在内存中,在运行时)等函数,以重定向到它们的seccomp-safe包装器

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM