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

2024-10-18 09:00:00
admin
原创
73
摘要:问题描述:我想知道是否有办法在 Linux 的沙盒下运行不受信任的 C 程序。有什么方法可以阻止程序打开文件、网络连接、分叉、执行等?这可能是一个小程序,一个家庭作业,上传到服务器并执行单元测试。所以这个程序的寿命会很短。解决方案 1:我曾使用Systrace在交互和自动模式下对不受信任的程序进行沙盒处理。它...

问题描述:

我想知道是否有办法在 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()仅保护文件系统。它无法阻止恶意程序打开网络套接字,也无法阻止编写不当的程序占用所有可用资源。

所有替代方案都存在资源使用问题。文件系统配额将防止程序填满磁盘。适当的ulimitsetrlimit()在 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”。以下是完全独立测试程序的方法:

  1. 首先,从 Jslinux 获取root.bin,我们将使用它作为用户空间(它具有 tcc C 编译器):

wget https://github.com/levskaya/jslinux-deobfuscated/raw/master/root.bin

  1. 我们想要把学生的提交内容放进去root.bin,所以设置循环设备:

sudo losetup /dev/loop0 root.bin

(您也可以使用 fuseext2,但它不太稳定。如果它稳定下来,您就不需要 root 权限了)

  1. 创建一个空目录:

mkdir mountpoint

  1. root.bin

sudo mount /dev/loop0 mountpoint

  1. 输入已挂载的文件系统:

cd mountpoint

  1. 修复权限:

sudo chown -R whoami .

  1. mkdir -p etc/init.d

  2. 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
  1. chmod +x etc/init.d/rcS

  2. 将提交复制到虚拟机:

cp ~/student_assignment.c root/assignment.c

  1. 退出虚拟机的根文件系统:

cd ..

  1. sudo umount mountpoint

  2. 现在镜像已经准备好了,我们只需要运行它。启动后它将编译并运行提交。

  3. mkfifo /tmp/guest_output

  4. 打开一个单独的终端并开始监听客户输出:

dd if=/tmp/guest_output bs=1

  1. 在另一个终端中:

qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput
(我在这里只使用了 Ubuntu 内核,但许多内核都可以使用)

  1. 当客户机输出显示“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
  1. 现在Average = 12.000000应该出现在客户输出管道上。如果没有,则学生失败了。

  2. 退出 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% 的学生能做到这些事情,那么就不要用这些简单的任务让他们感到厌烦,而要给他们一些大任务,让他们多写一些代码。综合学习对每个人来说都是最好的,所以不要依赖旧的僵化结构……

当然,永远不要使用同一台计算机来做重要的事情(例如写证明和考试)和浏览网页和测试软件。

对于重要的事情使用离线计算机,对于其他事情使用在线计算机。

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

... 我说到哪儿了... 对于其他人来说:

祝您黑客愉快!!

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用