在服务器上安全地执行用户提交的python代码

时间:2009-11-15 13:23:33

标签: python user-input

我正在研究启动一个项目,该项目涉及执行用户通过HTML表单输入的python代码。我知道这可能是致命的(exec),但我已经看到它至少在one instance成功完成了。

我向Python Challenge的开发人员发送了一封电子邮件,我被告知他们正在使用他们自己提出的解决方案,他们只是让他们使用“操作系统提供的安全功能” “而且”如果您知道如何使用它,操作系统[Linux]将提供您所需的大部分安全性。“

有谁知道如何安全可靠地进行此操作?我考虑过为每次提交产生一个新的VM,但这会产生太多的开销,并且几乎不可能有效地实现。

4 个答案:

答案 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
  • 吃掉所有内存
  • 吃掉所有CPU

此外,可以打开外部网络连接,等等。你可以用内核限制来锁定所有这些,但你一定会忘记一些事情。

所以我认为无法访问网络或真正硬盘的虚拟机将是唯一(合理)安全的路由。也许Python Challenge的开发人员使用KVM,原则上是“由操作系统提供”。

为了提高效率,您可以在同一个VM中运行所有提交。这可以节省很多开销,在最糟糕的情况下,它们只会妨碍彼此,但不会妨碍您的服务器。

答案 3 :(得分:0)

使用chrootWikipedia)可能是解决方案的一部分,例如结合ulimit和其他一些常见(或自定义)工具。