如何禁用Linux进程的套接字创建(用于沙箱)?

如何禁用Linux进程的套接字创建(用于沙箱)?,linux,sockets,sandbox,Linux,Sockets,Sandbox,我正在考虑几种沙箱化Linux进程的选项。将clone()与clone\u NEWNET(等)一起使用是选项之一CLONE_NEWNET确保沙盒进程无法建立或接受真正的网络连接。但是我想为这个过程完全禁用套接字,甚至是绑定到0.0.0.0上的任何端口,以及绑定到Unix域套接字(甚至是匿名的)。我想这样做是为了通过绑定到数千个端口来防止进程使用过多的内核资源。我该怎么做 一般来说,我对许多沙盒方法感兴趣(即Linux内核提供的沙盒方法和ptrace()强制实施的沙盒方法),但在这个问题中,我只对

我正在考虑几种沙箱化Linux进程的选项。将
clone()
clone\u NEWNET
(等)一起使用是选项之一
CLONE_NEWNET
确保沙盒进程无法建立或接受真正的网络连接。但是我想为这个过程完全禁用套接字,甚至是绑定到
0.0.0.0
上的任何端口,以及绑定到Unix域套接字(甚至是匿名的)。我想这样做是为了通过绑定到数千个端口来防止进程使用过多的内核资源。我该怎么做

一般来说,我对许多沙盒方法感兴趣(即Linux内核提供的沙盒方法和
ptrace()
强制实施的沙盒方法),但在这个问题中,我只对沙盒方法的套接字创建方面感兴趣(因此,如果您建议使用沙盒方法,还请解释如何防止使用它创建套接字),我对需要内核修补的方法不感兴趣,也不想加载不属于Ubuntu Lucid默认二进制内核包的内核模块,也不想加载会影响系统上每个进程的内核模块。

看一看-不限于套接字,而是一个通用的系统调用策略生成器/实施器。引述:

GNU/Linux端口完成,内核补丁由Marius Eriksen主动维护。可以使用ptrace后端在不更改内核的情况下运行。
Disclamer-我从未在Linux上尝试过它。

尝试使用seccomp(请参阅prctl手册页),它可以将您的过程限制为仅访问在prctl调用时保持打开状态的套接字。

ptrace
似乎是最明显的工具,但除此之外

util linux[-ng]有一个命令,它使用内核的/接口。如果通过
unshare-n
(或
clone(clone\u NEWNET)
)运行新进程,则它创建的任何网络套接字都位于不同的命名空间中。这并不能解决内核资源的问题,但它确实会对进程进行沙箱处理

Linux内核还支持通过
prctl(PR_SET_SECCOMP,1)
进入的模式,该模式防止进程(嗯,线程,实际上)调用除
read
write
exit
sigreurn
之外的任何系统调用。这是一个非常有效的沙箱,但很难与未修改的代码一起使用


您可以定义一个SELinux域,该域不允许
套接字
/
绑定
/等调用,并执行到该类型的动态转换。这(显然)需要一个具有积极执行SELinux策略的系统。(AppArmor和TOMOYO可能有类似的功能,但我对它们都不太熟悉。)

您可能对“sydbox”沙盒或“pinktrace”库感兴趣:


如果您的主要目标是限制应用于良性输入的某个良性进程p打开的套接字数量,那么
setrlimit(RLIMIT_NOFILE,…)
将大致满足您的要求

然而,如果假定p是恶意的而不是良性的,或者如果您正在寻找关于p在面对潜在恶意输入时的行为的强有力的保证,那么您可能是运气不佳:即,在目前可用的工具的情况下,您最多可以为攻击者创建一个障碍路线


(这就是说,如果一个障碍课程对你有效,那么你可以通过在这里闲逛或者通过在
沙箱上向友好的人们发送你的问题来获得一些更好的想法-talk@lists.sandboxing.org

感谢您提及systrace。我刚刚在LinuxI386上看过它,它的功能看起来很强大:它可以防止套接字创建,等等。我在编译它时遇到了大约五个小问题,但一旦完成了,它似乎可以用于沙箱简单程序,但我无法用systrace沙箱GCC调用GNU(1):systrace无限期地陷入wait4系统调用中。而且,它已经两年没有保养了。所以我放弃了。因为之前的wait4错误报告没有得到回答:仅供参考,我已经投票支持你的答案,但由于systrace对我来说不稳定,我不能接受这个答案。我知道seccomp,但这不是我问题的好答案,因为它限制了比我想要的更多(例如fork())。pts:我同意。切题地说,这就是为什么seccomp2应该被接受到主线Linux中,而不是被嘲笑的原因?链接到邮件列表存档有帖子吗?“Adam Langley(也是谷歌的)发布了一个补丁,可以做到这一点。新的“模式2”实现接受一个位掩码,描述哪些系统调用是可访问的。”上有很多链接。感谢您编写如此全面的列表。我接受了你的回答。我已经试过AppArmor,我可以确认它可以防止套接字创建。我已经在问题中提到了
CLONE\u NEWNET
(以及为什么它不是一个解决方案)。seccomp不是我问题的好答案,因为它限制了比我想要的更多的内容(例如fork())。谢谢你提到这两个。我很早就丢弃了它们,因为它们的记录严重不足。也许他们将来会进步。我一开始也有同样的感觉。幸运的是,我决定查看邮件列表上的来源和帖子,我发现这个项目看起来很有趣,最后,它不像乞讨时感觉的那么小,并提供了许多舒适的系统调用“过滤”方法——以灵活的方式!)在我的工作负载(运行g++)中,sydbox比用户模式Linux慢50%,所以我现在坚持使用用户模式Linux,因为这不仅可以进行沙箱操作,而且可以限制总内存使用量。Linux或Unix中沙箱/囚禁进程的类似Qs:***