linux - 对不受信任的源代码的编译和执行进行沙箱化的架构

标签 linux compilation sandbox virtualization

SPOJ是一个列出编程难题的网站,然后允许用户编写代码来解决这些难题并将其源代码上传到服务器。然后服务器编译该源代码(如果它是一种解释型语言,则对其进行解释),针对代码运行一系列单元测试,并验证它是否正确解决了问题。

实现此类功能的最佳方法是什么 - 您如何对用户输入进行沙箱处理,使其不会危及服务器?您应该使用 SELinux、chroot 还是虚拟化?所有这三个加上我没想到的其他东西?

应用程序如何在 jail 外可靠地传达结果,同时确保结果不会受到损害?例如,您将如何防止应用程序将大量无用数据写入磁盘或其他恶意事件?

我真的很好奇,因为这似乎是一种非常冒险的应用程序。

最佳答案

从有限用户帐户执行的 chroot jail 听起来是最好的起点(即不是 root 或运行您的网络服务器的同一用户)

为了防止将大量无用数据写入磁盘,您可以使用磁盘配额或您不介意填满的单独卷(假设您没有在同一用户下并行测试 - 或者您将最终处理烦人的竞争条件)

如果您想做一些更具可扩展性和安全性的事情,您可以将动态虚拟化主机与您自己的服务器/客户端解决方案一起用于通信 - 您有一个“代理”池,它们接收指令以从 X 存储库复制和编译或共享,然后执行一系列测试,并通过相同的服务器/客户端协议(protocol)记录输出。您的主机进程可以监视过度的磁盘使用并在需要时报告警告,代理可能会或可能不会在 chroot jail 下执行代码,如果您 super 偏执,您会在每次运行后销毁代理并启动新的 VM当下一个 sample 准备好进行测试时。如果您在云中进行如此大规模的操作(例如,在 EC2 上运行 100 多个代理),您只会有足够的速度来满足需求,从而降低成本。同样,如果你想要扩大规模,你可以使用像 Amazon SQS 这样的东西来缓冲请求,或者如果你正在做一个实验性的示例项目,那么你可以做一些更简单的事情(想想分布式并行处理系统,例如 seti@home)

关于linux - 对不受信任的源代码的编译和执行进行沙箱化的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5571987/

相关文章:

linux - phpstorm 和 qt 共享内存段泄漏

php - Centos 6.4安装php54-xml时出错

kotlin - 在git bash中编译我的Kotlin测试

linux - 有组权限但无法访问文件?

.net - 已发布的 .Net Core 网站不支持 Systemd

compilation - 同时使用 TypeScript 和 Traceur 有什么优势?

c# - 如何从文件名生成安全类名?

ios - iZip 如何与 DropBox 交互?

用于在客户端和 Node.js 服务器之间同步数据的 JavaScript 库?

macos - 使用 sparkle 更新(可悲的是已经分发)沙盒 OSX 应用程序