假设我在资源受限的系统上运行,并且我想确保我运行的应用程序打开的文件不超过 10 个全部的。
如果我尝试使用 来做到这setrlimit
一点,例如:
if (fork() == 0) {
struct rlimit l = { 10, 10 };
setrlimit(RLIMIT_NOFILE, &l);
execl(EVIL_PROGRAM, args);
}
那么EVIL_PROGRAM
将继承 10 个打开文件描述符的限制。然而,如何阻止恶意/编码不良的应用程序生成 X 个子进程(所有进程都打开了 10 个文件)? (这是现实生活中的场景)。
我不想完全阻止它创建子进程(这应该由 global 管理limits.conf
),只是为了对打开文件的数量设置合理的限制。
我找到了为此目的使用 cgroups 的参考,但我认为您必须是 root 才能使用此功能?
答案1
专门针对setrlimit
以下是您可能希望研究的一些更有用的命令选项;把它们从man
书页上拉出来。
RLIMIT_NOFILE
指定一个比该进程可以打开的最大文件描述符数大一的值。
RLIMIT_NPROC
可以为调用进程的真实用户 ID 创建的最大进程数(或者更准确地说,在 Linux 上为线程数)。当遇到这个限制时
RLIMIT_SIGPENDING
指定可以为调用进程的真实用户 ID 排队的信号数量限制。为了检查此限制,标准信号和实时信号都会被计数。
似乎还可以设置其他非常酷的限制,所以我很感激我遇到了你的问题,因为它向我展示了另一种用于控制流程的工具。
通用 Unix/Linux
我相信您正在寻找的应用程序限制工具的通用术语称为“ Sandbox
for UNIX”,它看起来像承包商和乘客是可靠的选择,对于 Linux,我已经见过Docker
,KVM
并Firejail
在像 Raspberry Pi B+v2 或双核上网本这样受限的系统上使用。对于大多数沙盒操作,您需要具有虚拟化功能的系统和内核。在 Android 等系统上,我见过Selinux
在最新的 CyonagenMod ROM 上使用的系统,如果您想使用 chroot 应用程序,那么有点令人沮丧……但我离题了,在我运行过 Ubuntu 的一些系统上,我运行过Apparmor
当新安装的程序尝试时弹出错误打电话回家具有持久连接。可以这么说,有很多选项可以控制特定程序或一组程序可以执行的操作、查看的内容和/或与之通信的内容,以及可以使用多少 CPU 和 GPU 资源。
如果你能让它工作(有点不确定,因为我仍在与开发人员合作,让 ARMhf 二进制文件工作),对于你的使用场景来说,最好的就是 Firejail,因为开发人员主页上托管的指南涵盖了 Firejail可以根据您的需求进行修改的双游戏设备。与提到的其他文件相比(从我所看到的情况来看),它的内存占用量较低,并且对于进程可以访问哪些文件以及是否允许持久性是高度可配置的。这对于测试很有好处,因为您将拥有一个可重复、可定制且最终可根据需要删除的工作环境。
对于没有完全虚拟化支持的系统,我发现 selinux 通常用于对已存在的user
/group
权限设置定义更严格的规则,以保留读写权限。搜索这个词Linux name space permissions
,结果发现有很多隐人们可以限制行动的方式,但最大的洞对于所有这些选项,root
即使在构造良好的 chroot 监狱中,如果有方法在监狱或沙箱内获得 root 权限,那么就有方法升级到正在运行被监禁进程的用户 ID。
基本上,一个进程必须突破多个层,即对于一个 Web 服务器,我将设置一组限制性的防火墙规则、日志读取器以动态添加规则并更改防火墙设置(带有自定义操作的fail2ban 和脚本),然后是一个 chroot 监狱,其目录结构中仅具有 Web 服务器所需的依赖项,绑定到高于 1024 的端口,这样它甚至不会请求套接字绑定的根级别权限,并将它们包装在虚拟沙箱内(可能是 Firejail),其主机运行渗透检测措施,例如tripwire
和honeyd
在各自的监狱内。所有这些都是为了确保.php
不应在公共服务器上修改的类似代码确实会收到坏接触它会被忽略,back-ips 会被重新分配,并且违规者将被禁止将来访问。
在您的示例代码中,您看起来并没有在网络方面做太多工作,但很可能会从另一个脚本或函数调用它,并且因为它显然正在调用子进程,您将需要弄清楚如何清理输入,并在每一步捕获错误(查找杀死 Chrome 浏览器的链接以了解原因),并确保未经处理的输入不会被特权用户读取或干扰(查找如何添加shell-shock
到 Firefox 的浏览器 ID 以了解原因),以及如果调用或返回输出涉及网络,那么该进程绑定的端口应该位于非特权端口上(如果它是一个 Web 应用程序,请使用 iptables/防火墙进行转发)。虽然有很多用于锁定系统服务的选项需要考虑,但似乎也有很多用于测试代码可破坏性的选项;Metasploit
这drone.io
是两个相当著名的渗透测试和代码测试选项,在有人为您做之前您可能希望研究一下。