我正在考虑对Linux进程进行沙箱保护的几种选择。在CLONE_NEWNET中使用clone() (等)是其中一种选择。CLONE_NEWNET确保沙箱进程不能建立或接受真正的网络连接。但我想为这个过程完全禁用套接字,甚至bind()到0.0.0.0上的任何端口,并绑定到Unix doman套接字(甚至匿名)。我想这样做是为了防止进程通过绑定到数千个端口来使用过多的内核资源。我该怎么做?
一般来说,我对许多沙箱方法感兴趣(例如,那些由Linux内核提供的和那些由ptrace()执行的),但在这个问题中,我只对沙箱方法的套接字创建方面感兴趣(所以如果你建议使用沙箱方法,也请解释如何防止使用它创建套接字),我对需要内核补丁的方法或涉及加载不属于Ubuntu Lucid默认二进制内核包的内核模块的方法不感兴趣,或者对影响系统上的每个进程的方法不感兴趣。
发布于 2010-12-11 04:04:36
除了…之外,ptrace似乎是最明显的工具
util-linux-ng有一个命令unshare,它使用内核的clone/unshare接口。如果通过unshare -n(或clone(CLONE_NEWNET))运行新进程,则它创建的任何网络套接字都在不同的命名空间中。这并没有解决内核资源问题,但它确实用沙箱保护了进程。
Linux内核还支持seccomp,这是通过prctl(PR_SET_SECCOMP, 1)进入的一种模式,它可以防止进程(实际上是线程)调用read、write、exit和sigreturn以外的任何syscall。这是一个非常有效的沙箱,但很难与未经修改的代码一起使用。
您可以定义一个不允许socket/bind/etc.调用的SELinux域,并执行到该类型的动态转换。这(显然)需要一个主动执行SELinux策略的系统。( AppArmor和TOMOYO可能也有类似的事情,但我对它们中的任何一个都不是很熟悉。)
发布于 2010-12-11 03:51:44
尝试seccomp (参见prctl手册页),它可以将您的进程限制为仅访问在发出prctl调用时处于打开状态的套接字。
发布于 2010-12-31 08:31:51
您可能对"sydbox“沙箱或"pinktrace”库感兴趣:
https://stackoverflow.com/questions/4410447
复制相似问题