在 Linux 的沙箱中运行不受信任的 C 程序,以防止其打开文件、分叉等?
- 2024-10-18 09:00:00
- admin 原创
- 73
问题描述:
我想知道是否有办法在 Linux 的沙盒下运行不受信任的 C 程序。有什么方法可以阻止程序打开文件、网络连接、分叉、执行等?
这可能是一个小程序,一个家庭作业,上传到服务器并执行单元测试。所以这个程序的寿命会很短。
解决方案 1:
我曾使用Systrace在交互和自动模式下对不受信任的程序进行沙盒处理。它有一个ptrace()
基于 的后端,允许在 Linux 系统上使用而无需特殊权限,还有一个速度更快、功能更强大的后端,需要修补内核。
也可以使用 在类 Unix 系统上创建沙盒chroot(1)
,尽管这并不那么容易或安全。Linux容器和FreeBSD jails是 chroot 的更好替代方案。Linux 上的另一种选择是使用SELinux或AppArmor等安全框架,这是我建议用于生产系统的。
如果您告诉我们您到底想做什么,我们就能为您提供更多帮助。
编辑:
Systrace 适合您的情况,但我认为基于Linux 安全模型(如 AppArmor 或 SELinux)的替代方案更标准,因此是首选,具体取决于您的发行版。
编辑2:
虽然chroot(1)
它可以在大多数(所有?)类 Unix 系统上使用,但它也存在不少问题:
它可以逃脱。如果你真的要在系统上编译或运行不受信任的 C 程序,你特别容易受到这个问题的影响。如果你的学生和我的学生一样,有人会试图越狱。
您必须创建一个完整的独立文件系统层次结构,其中包含完成任务所需的一切。您不必在 chroot 中安装编译器,但应包含运行编译程序所需的一切。虽然有一些实用程序可以帮助实现这一点,但这仍然不是一件容易的事。
您必须维护 chroot。由于它是独立的,chroot 文件不会随您的发行版一起更新。您必须定期重新创建 chroot,或者在其中包含必要的更新工具,这本质上要求它是一个完整的 Linux 发行版。您还必须使系统和用户数据(密码、输入文件等)与主机系统保持同步。
chroot()
仅保护文件系统。它无法阻止恶意程序打开网络套接字,也无法阻止编写不当的程序占用所有可用资源。
所有替代方案都存在资源使用问题。文件系统配额将防止程序填满磁盘。适当的ulimit
(setrlimit()
在 C 中)设置可以防止内存过度使用和任何 fork 炸弹,以及阻止 CPU 占用。nice(1)
可以降低这些程序的优先级,以便计算机可以毫无问题地用于任何被认为更重要的任务。
解决方案 2:
我最近写了一篇关于 Linux 沙盒技术的概述。我认为,如果您不介意分叉等问题,最简单的方法是使用 Linux 容器 (lxc),而这些在这种环境中并不重要。您可以为该进程提供只读根文件系统、隔离的环回网络连接,并且仍然可以轻松终止它并设置内存限制等。
Seccomp 将会有点困难,因为代码甚至无法分配内存。
Selinux 是另一种选择,但我认为它可能比容器更费力。
解决方案 3:
Firejail 是实现这一目标的最全面的工具之一 - 它支持 seccomp、文件系统容器、功能等:
https://firejail.wordpress.com/features-3/
解决方案 4:
您可以使用 Qemu 快速测试作业。下面的过程在我 5 年前的笔记本电脑上只需不到 5 秒。
假设学生必须开发一个程序,该程序采用无符号整数,每个整数占一行,直到出现“-1”的行。然后程序应该对所有整数求平均值并输出“平均值:%f”。以下是完全独立测试程序的方法:
首先,从 Jslinux 获取
root.bin
,我们将使用它作为用户空间(它具有 tcc C 编译器):
wget https://github.com/levskaya/jslinux-deobfuscated/raw/master/root.bin
我们想要把学生的提交内容放进去
root.bin
,所以设置循环设备:
sudo losetup /dev/loop0 root.bin
(您也可以使用 fuseext2,但它不太稳定。如果它稳定下来,您就不需要 root 权限了)
创建一个空目录:
mkdir mountpoint
山
root.bin
:
sudo mount /dev/loop0 mountpoint
输入已挂载的文件系统:
cd mountpoint
。
修复权限:
sudo chown -R
whoami .
mkdir -p etc/init.d
vi etc/init.d
:
#!/bin/sh
cd /root
echo READY 2>&1 > /dev/ttyS0
tcc assignment.c 2>&1 > /dev/ttyS0
./a.out 2>&1 > /dev/ttyS0
chmod +x etc/init.d/rcS
将提交复制到虚拟机:
cp ~/student_assignment.c root/assignment.c
退出虚拟机的根文件系统:
cd ..
sudo umount mountpoint
现在镜像已经准备好了,我们只需要运行它。启动后它将编译并运行提交。
mkfifo /tmp/guest_output
打开一个单独的终端并开始监听客户输出:
dd if=/tmp/guest_output bs=1
在另一个终端中:
qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput
(我在这里只使用了 Ubuntu 内核,但许多内核都可以使用)
当客户机输出显示“READY”时,您可以从 qemu 提示符向虚拟机发送密钥。例如,要测试此分配,您可以执行
(qemu) sendkey 1
(qemu) sendkey 4
(qemu) sendkey ret
(qemu) sendkey 1
(qemu) sendkey 0
(qemu) sendkey ret
(qemu) sendkey minus
(qemu) sendkey 1
(qemu) sendkey ret
现在
Average = 12.000000
应该出现在客户输出管道上。如果没有,则学生失败了。退出 qemu:
quit
通过测试的程序在这里:https ://stackoverflow.com/a/14424295/309483 。只需使用tcclib.h
而不是stdio.h
。
解决方案 5:
尝试用户模式 Linux。对于 CPU 密集型作业,它的性能开销约为 1%,但对于 I/O 密集型作业,它的速度可能会慢 6 倍。
解决方案 6:
在虚拟机内运行它应该可以为您提供您想要的所有安全性和限制。
QEMU非常适合这种情况,并且所有工作(下载应用程序、更新磁盘映像、启动 QEMU、在其中运行应用程序以及保存输出以供以后检索)都可以编写脚本以进行自动测试运行。
解决方案 7:
当基于 ptrace(strace)检查进行沙盒处理时:
“ sydbox ”沙箱和“ pinktrace ”编程库(它是 C99,但据我所知,它与 python 和 ruby 绑定)。
收集与主题相关的链接:
http://www.diigo.com/user/wierzowiecki/sydbox
(抱歉,不是直接链接,但声誉点还不够)
解决方案 8:
seccomp 和 seccomp-bpf 以最少的努力实现了这一点:https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt
解决方案 9:
好的,感谢大家的回答,它们对我帮助很大。但是对于提出原始问题的人,我不建议使用它们作为解决方案。所有提到的工具都需要做大量的工作,才能以老师、导师、教授的身份测试学生的代码。我认为在这种情况下最好的方法是 virtualbox。好的,它模拟了一个完整的 x68 系统,与沙盒的含义无关,但如果我想象我的编程老师,这对他来说是最好的。因此,在基于 debian 的系统上“apt-get install virtualbox”,其他所有系统都转到http://virtualbox.org/,创建一个 vm,添加一个 iso,单击安装,等待一段时间,然后运气好就行了。与设置用户模式 linux 或执行一些繁重的 strace 操作相比,它将更容易使用……
如果你担心你的学生会攻击你,我想你肯定有权威问题,而解决这个问题的办法就是威胁他们,如果你能证明他们给你的作业中有一个恶意软件,你就会起诉他们……
此外,如果一个班级里只有 1% 的学生能做到这些事情,那么就不要用这些简单的任务让他们感到厌烦,而要给他们一些大任务,让他们多写一些代码。综合学习对每个人来说都是最好的,所以不要依赖旧的僵化结构……
当然,永远不要使用同一台计算机来做重要的事情(例如写证明和考试)和浏览网页和测试软件。
对于重要的事情使用离线计算机,对于其他事情使用在线计算机。
然而对于其他不是偏执狂的老师的人来说(不想冒犯任何人,我只是认为你在开始成为一名程序员老师之前应该学习有关安全和社会的基本知识......)
... 我说到哪儿了... 对于其他人来说:
祝您黑客愉快!!
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件