我想知道是否存在在Linux下的沙箱下运行不受信任的C程序的方法。什么会阻止程序打开文件,网络连接,分叉,执行等?
它将是一个小程序,一个家庭作业,它被上传到服务器并在其上执行单元测试。所以该计划将是短暂的。
我已经使用Systrace以交互方式和自动方式对不受信任的程序进行沙盒化。它有一个基于ptrace()
的后端,允许在没有特殊权限的Linux系统上使用它,以及需要修补内核的更快,更强大的后端。
也可以使用chroot(1)
在类Unix系统上创建沙箱,尽管这不是那么容易或安全。 Linux Containers和FreeBSD jails是chroot的更好选择。 Linux上的另一个替代方案是使用像SELinux或AppArmor这样的安全框架,这是我为生产系统提出的建议。
如果您告诉我们您想要做什么,我们将能够为您提供更多帮助。
编辑:
Systrace可以适用于您的情况,但我认为基于像AppArmor或SELinux这样的Linux Security Model的东西是更标准的,因此是首选的替代方案,具体取决于您的发行版。
编辑2:
虽然chroot(1)
可用于大多数(所有?)类Unix系统,但它有很多问题:
chroot()
只保护文件系统。它不会阻止恶意程序打开网络套接字或者写得不好的程序来吸收所有可用资源。资源使用问题在所有备选方案中都很常见。 Filesystem quotas将阻止程序填充磁盘。适当的ulimit
(C中的setrlimit()
)设置可以防止内存过度使用和任何叉式炸弹,以及阻止CPU占用。 nice(1)
可以降低这些程序的优先级,以便计算机可以用于任何被认为更重要而没有问题的任务。
这似乎也很有希望。使用syscall拦截的Linux文件系统沙箱。
好的,多亏了他们帮助我的所有答案。但我建议不要将这些问题作为解决原问题的人的解决方案。所有提到的工具都需要大量的工作来测试学生代码作为教师,导师,教授。在这种情况下,最好的方法是在我看来虚拟框。好吧,它模仿了一个完整的x68系统,并且以这种方式与沙盒的含义无关,但如果我想象我的编程老师那对他来说是最好的。因此,在基于debian的系统上“apt-get install virtualbox”,所有其他人都会前往https://github.com/adtac/fssb,创建一个虚拟机,添加一个iso,点击安装,等待一段时间并幸运。使用它来设置用户模式linux或做一些重要的东西会更容易......
如果你害怕你的学生乱砍你,我猜你有一个权威问题,如果你能在他们给的工作中证明只有一口男性用品,你就会起诉他们你将起诉生活的日光。您...
此外,如果有一个类,并且它的1%与他可以做这样的事情一样好,不要用这么简单的任务来承担它们并且给它们一些大的它们需要编写更多的代码。综合学习对每个人来说都是最好的,所以不要在旧的僵局结构上继续学习......
因此,永远不要使用同一台计算机来处理重要的事情(比如写证明和考试),而是用于浏览网页和测试软件等事情。
使用离线计算机处理重要事情,使用在线计算机处理所有其他事情。
然而对于其他不是偏执教师的人(不想冒犯任何人,我只是认为你应该在开始担任程序员老师之前学习有关安全和社会的基础知识......)
......我在哪里...为其他人:
快乐的黑客!!
我最近写了一个overview of sandboxing techniques in Linux。我认为你最简单的方法是使用Linux容器(lxc),如果你不介意分叉等等,这在这个环境中并不重要。您可以为进程提供只读的根文件系统,隔离的环回网络连接,您仍然可以轻松地终止它并设置内存限制等。
Seccomp会有点困难,因为代码甚至无法分配内存。
Selinux是另一种选择,但我认为它可能比容器更多的工作。
您可以使用Qemu快速测试作业。在我5岁的笔记本电脑上,此程序不到5秒钟。
让我们假设学生必须开发一个程序,该程序采用无符号整数,每个都在自己的行上,直到一行“-1”到达。然后程序应平均所有整数并输出“Average:%f”。以下是测试程序完全隔离的方法:
root.bin
,我们将其用作userland(它具有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
(我刚刚在这里使用了Ubuntu内核,但很多内核都可以使用)qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput
(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
通过测试的程序在这里:quit
。只需使用https://stackoverflow.com/a/14424295/309483而不是tcclib.h
。
试试stdio.h
。对于CPU密集型作业,它的性能开销约为1%,但对于I / O密集型作业,它可能会慢6倍。
在虚拟机中运行它应该为您提供所需的所有安全性和限制。
User-mode Linux非常适合这一点,所有工作(下载应用程序,更新磁盘映像,启动QEMU,在其中运行应用程序,以及保存输出以供以后检索)都可以编写自动化测试脚本。
当它基于ptrace(strace)结账时进行sanboxing:
“sydbox”沙箱和“pinktrace”编程库(它是C99但据我所知有绑定到python和ruby)。
收集与主题相关的链接:
(抱歉没有直接链接,但还没有足够的声望点)
seccomp和seccomp-bpf以最少的努力实现这一目标:http://www.diigo.com/user/wierzowiecki/sydbox
Firejail是最全面的工具之一 - 它支持seccomp,文件系统容器,功能等:
https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt