我正在考虑沙盒化Linux进程的几个选项。将clone()
与CLONE_NEWNET
(等)一起使用是其中一个选项。 CLONE_NEWNET
确保沙盒进程无法建立或接受真正的网络连接。但我想完全禁用该进程的套接字,甚至bind()
0.0.0.0
上的任何端口,并绑定到Unix doman套接字(甚至是匿名)。我想这样做是为了防止进程通过绑定到数千个端口来使用过多的内核资源。我该怎么做?
一般来说,我对许多沙盒方法感兴趣(即Linux内核提供的方法和ptrace()
强制执行的方法),但在这个问题中,我只对沙盒的套接字创建方面感兴趣方法(所以如果你建议使用沙盒方法,请解释如何使用它来防止套接字创建),并且我对需要内核修补或涉及加载不属于Ubuntu Lucid默认值的内核模块的方法不感兴趣二进制内核包,或者会影响系统上的每个进程。
答案 0 :(得分:8)
ptrace
似乎是最明显的工具,但除此之外......
util-linux [-ng]有一个命令unshare
,它使用内核的clone
/ unshare
接口。如果通过unshare -n
(或clone(CLONE_NEWNET)
)运行新进程,则它创建的任何网络套接字都位于不同的名称空间中。这并不能解决内核资源问题,但它会对进程进行沙盒化。
Linux内核还支持seccomp,这是一种使用prctl(PR_SET_SECCOMP, 1)
输入的模式,它阻止进程(好吧,线程,真的)调用read
以外的任何系统调用,{{1} },write
和exit
。它是一个非常有效的沙箱,但很难与未经修改的代码一起使用。
您可以定义不允许sigreturn
/ socket
/等的SELinux域。调用,并执行到该类型的动态转换。这(显然)要求系统具有主动执行SELinux策略。 (AppArmor和TOMOYO可能有类似的东西,但我对它们中的任何一个都不太熟悉。)
答案 1 :(得分:4)
看看systrace - 不仅限于套接字,而是一个通用的系统调用策略生成器/执行器。引用:
完成GNU / Linux端口,Marius Eriksen积极维护内核补丁。 可以使用ptrace后端在没有内核更改的情况下运行。
Disclamer - 我从未在Linux上尝试过它。
答案 2 :(得分:2)
尝试使用seccomp(参见prctl手册页),它可以将您的进程限制为仅访问在进行prctl调用时保持打开的套接字。
答案 3 :(得分:2)
您可能对“ sydbox ”沙箱或“ pinktrace ”库感兴趣:
答案 4 :(得分:2)
如果您的主要目标是限制应用于良性输入的某些良性过程P打开的套接字数量,那么setrlimit(RLIMIT_NOFILE, ...)
将大致完成您想要的操作。
然而,如果假设P是恶意的而不是良性的,或者如果你正在寻找有关P在面对潜在恶意输入时将如何表现的强烈保证,那么你可能运气不好:即,最好使用当今可用的工具,您可以为攻击者创建障碍课程。
(话虽如此,如果障碍课程对您有用,那么您可以通过sandboxing.org在这里探讨或者将您的问题发送给sandboxing-talk@lists.sandboxing.org
上的友好人员来获得更多好主意。 。)