在Linux的沙箱中运行一个不受信任的C程序,防止它打开文件,分叉等?

问题描述 投票:105回答:11

我想知道是否存在在Linux下的沙箱下运行不受信任的C程序的方法。什么会阻止程序打开文件,网络连接,分叉,执行等?

它将是一个小程序,一个家庭作业,它被上传到服务器并在其上执行单元测试。所以该计划将是短暂的。

linux sandbox
11个回答
45
投票

我已经使用Systrace以交互方式和自动方式对不受信任的程序进行沙盒化。它有一个基于ptrace()的后端,允许在没有特殊权限的Linux系统上使用它,以及需要修补内核的更快,更强大的后端。

也可以使用chroot(1)在类Unix系统上创建沙箱,尽管这不是那么容易或安全。 Linux ContainersFreeBSD jails是chroot的更好选择。 Linux上的另一个替代方案是使用像SELinuxAppArmor这样的安全框架,这是我为生产系统提出的建议。

如果您告诉我们您想要做什么,我们将能够为您提供更多帮助。

编辑:

Systrace可以适用于您的情况,但我认为基于像AppArmor或SELinux这样的Linux Security Model的东西是更标准的,因此是首选的替代方案,具体取决于您的发行版。

编辑2:

虽然chroot(1)可用于大多数(所有?)类Unix系统,但它有很多问题:

  • 它可以打破。如果要在系统上实际编译或运行不受信任的C程序,则特别容易受到此问题的影响。如果你的学生和我一样,有人会试图突破监狱。
  • 您必须创建一个完整的独立文件系统层次结构,其中包含您的任务所需的所有内容。您不必在chroot中有编译器,但应包含运行编译程序所需的任何内容。虽然有一些实用程序可以帮助解决这个问题,但它仍然不是一件容易的事。
  • 你必须保持chroot。由于它是独立的,因此chroot文件不会随您的发行版一起更新。您将不得不定期重新创建chroot,或者在其中包含必要的更新工具,这实际上要求它是一个完整的Linux发行版。您还必须使系统和用户数据(密码,输入文件e.t.c.)与主机系统保持同步。
  • chroot()只保护文件系统。它不会阻止恶意程序打开网络套接字或者写得不好的程序来吸收所有可用资源。

资源使用问题在所有备选方案中都很常见。 Filesystem quotas将阻止程序填充磁盘。适当的ulimit(C中的setrlimit())设置可以防止内存过度使用和任何叉式炸弹,以及阻止CPU占用。 nice(1)可以降低这些程序的优先级,以便计算机可以用于任何被认为更重要而没有问题的任务。


1
投票

这似乎也很有希望。使用syscall拦截的Linux文件系统沙箱。

http://sandbox.sourceforge.net


-1
投票

好的,多亏了他们帮助我的所有答案。但我建议不要将这些问题作为解决原问题的人的解决方案。所有提到的工具都需要大量的工作来测试学生代码作为教师,导师,教授。在这种情况下,最好的方法是在我看来虚拟框。好吧,它模仿了一个完整的x68系统,并且以这种方式与沙盒的含义无关,但如果我想象我的编程老师那对他来说是最好的。因此,在基于debian的系统上“apt-get install virtualbox”,所有其他人都会前往https://github.com/adtac/fssb,创建一个虚拟机,添加一个iso,点击安装,等待一段时间并幸运。使用它来设置用户模式linux或做一些重要的东西会更容易......

如果你害怕你的学生乱砍你,我猜你有一个权威问题,如果你能在他们给的工作中证明只有一口男性用品,你就会起诉他们你将起诉生活的日光。您...

此外,如果有一个类,并且它的1%与他可以做这样的事情一样好,不要用这么简单的任务来承担它们并且给它们一些大的它们需要编写更多的代码。综合学习对每个人来说都是最好的,所以不要在旧的僵局结构上继续学习......

因此,永远不要使用同一台计算机来处理重要的事情(比如写证明和考试),而是用于浏览网页和测试软件等事情。

使用离线计算机处理重要事情,使用在线计算机处理所有其他事情。

然而对于其他不是偏执教师的人(不想冒犯任何人,我只是认为你应该在开始担任程序员老师之前学习有关安全和社会的基础知识......)

......我在哪里...为其他人:

快乐的黑客!!


17
投票

我最近写了一个overview of sandboxing techniques in Linux。我认为你最简单的方法是使用Linux容器(lxc),如果你不介意分叉等等,这在这个环境中并不重要。您可以为进程提供只读的根文件系统,隔离的环回网络连接,您仍然可以轻松地终止它并设置内存限制等。

Seccomp会有点困难,因为代码甚至无法分配内存。

Selinux是另一种选择,但我认为它可能比容器更多的工作。


6
投票

您可以使用Qemu快速测试作业。在我5岁的笔记本电脑上,此程序不到5秒钟。

让我们假设学生必须开发一个程序,该程序采用无符号整数,每个都在自己的行上,直到一行“-1”到达。然后程序应平均所有整数并输出“Average:%f”。以下是测试程序完全隔离的方法:

  1. 首先,从Jslinux获取root.bin,我们将其用作userland(它具有tcc C编译器): wget https://github.com/levskaya/jslinux-deobfuscated/raw/master/root.bin
  2. 我们想把学生的提交放在root.bin中,所以设置循环设备: sudo losetup /dev/loop0 root.bin (你也可以使用fuseext2,但它不是很稳定。如果稳定,你不需要root用于任何这个)
  3. 制作一个空目录: mkdir mountpoint
  4. 登上root.binsudo mount /dev/loop0 mountpoint
  5. 输入挂载的文件系统: cd mountpoint
  6. 修复权利: sudo chown -R `whoami` .
  7. mkdir -p etc/init.d
  8. 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
  9. chmod +x etc/init.d/rcS
  10. 将提交复制到VM: cp ~/student_assignment.c root/assignment.c
  11. 退出VM的根FS: cd ..
  12. sudo umount mountpoint
  13. 现在图像准备就绪,我们只需要运行它。它将在引导后编译并运行提交。
  14. mkfifo /tmp/guest_output
  15. 打开一个单独的终端并开始侦听来宾输出: qazxsw poi
  16. 在另一个终端: dd if=/tmp/guest_output bs=1(我刚刚在这里使用了Ubuntu内核,但很多内核都可以使用)
  17. 当guest虚拟机输出显示“READY”时,您可以从qemu提示符向VM发送密钥。例如,要测试此分配,您可以这样做 qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput
  18. 现在(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 应出现在客户输出管道上。如果没有,那么学生就失败了。
  19. 退出qemu:Average = 12.000000

通过测试的程序在这里:quit。只需使用https://stackoverflow.com/a/14424295/309483而不是tcclib.h


5
投票

试试stdio.h。对于CPU密集型作业,它的性能开销约为1%,但对于I / O密集型作业,它可能会慢6倍。


3
投票

在虚拟机中运行它应该为您提供所需的所有安全性和限制。

User-mode Linux非常适合这一点,所有工作(下载应用程序,更新磁盘映像,启动QEMU,在其中运行应用程序,以及保存输出以供以后检索)都可以编写自动化测试脚本。


3
投票

当它基于ptrace(strace)结账时进行sanboxing:

“sydbox”沙箱和“pinktrace”编程库(它是C99但据我所知有绑定到python和ruby)。

收集与主题相关的链接:

QEMU

(抱歉没有直接链接,但还没有足够的声望点)


3
投票

seccomp和seccomp-bpf以最少的努力实现这一目标:http://www.diigo.com/user/wierzowiecki/sydbox


2
投票

Firejail是最全面的工具之一 - 它支持seccomp,文件系统容器,功能等:

https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt


1
投票

这个库应该很好地服务于你的目标

https://firejail.wordpress.com/features-3/

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.