我正在研究启动一个项目,该项目涉及执行用户通过HTML表单输入的python代码。我知道这可能是致命的(exec
),但我已经看到它至少在one instance成功完成了。
我向Python Challenge的开发人员发送了一封电子邮件,我被告知他们正在使用他们自己提出的解决方案,他们只是让他们使用“操作系统提供的安全功能” “而且”如果您知道如何使用它,操作系统[Linux]将提供您所需的大部分安全性。“
有谁知道如何安全可靠地进行此操作?我考虑过为每次提交产生一个新的VM,但这会产生太多的开销,并且几乎不可能有效地实现。
答案 0 :(得分:3)
在chroot(2)之外的现代Linux上,您可以使用clone(2)而不是fork(2)来进一步限制进程。有几个有趣的clone(2)标志:
CLONE_NEWIPC (new namespace for semaphores, shared memory, message queues)
CLONE_NEWNET (new network namespace - nice one)
CLONE_NEWNS (new set of mountpoints)
CLONE_NEWPID (new set of process identifiers)
CLONE_NEWUTS (new hostname, domainname, etc)
以前这个功能是在OpenVZ中实现的,然后合并到上游,因此不再需要修补内核。
答案 1 :(得分:3)
http://codepad.org/about已成功实施此类系统(作为公共代码粘贴/运行服务!)
codepad.org是一个在线编译器/解释器,以及一个简单的协作工具。它是一个为您执行代码的pastebin。 [...]
工作原理
代码执行由基于geordi的主管处理。策略是在ptrace下运行所有内容,不允许或忽略许多系统调用。编译器和最终可执行文件都在chroot jail中执行,具有严格的资源限制。主管是用Haskell编写的。
[...]
当您的应用程序是远程代码执行时,您必须预料到安全问题。我没有依赖chroot和ptrace主管,而是采取了一些额外的预防措施:
管理程序进程在虚拟机上运行,这些虚拟机具有防火墙,因此无法进行传出连接。
运行虚拟机的计算机也严重防火墙,并定期从源图像中恢复。
答案 2 :(得分:2)
如果您以用户nobody
(在Linux上)运行脚本,它几乎无处可写,并且不会读取正确设置其权限的数据。但它仍然可能导致DoS攻击,例如:
/tmp
此外,可以打开外部网络连接,等等。你可以用内核限制来锁定所有这些,但你一定会忘记一些事情。
所以我认为无法访问网络或真正硬盘的虚拟机将是唯一(合理)安全的路由。也许Python Challenge的开发人员使用KVM,原则上是“由操作系统提供”。
为了提高效率,您可以在同一个VM中运行所有提交。这可以节省很多开销,在最糟糕的情况下,它们只会妨碍彼此,但不会妨碍您的服务器。
答案 3 :(得分:0)