在服务器上安全地执行用户提交的python代码
我正在研究启动一个项目,该项目涉及执行用户通过HTML表单输入的python代码。我知道这可能是致命的(在服务器上安全地执行用户提交的python代码,python,user-input,Python,User Input,我正在研究启动一个项目,该项目涉及执行用户通过HTML表单输入的python代码。我知道这可能是致命的(exec),但我至少在几年内看到了它的成功 我给的开发人员发了一封电子邮件,他们告诉我他们正在使用他们自己提出的解决方案,他们只透露他们正在使用“操作系统提供的安全功能”,并且“如果你知道如何使用它,操作系统[Linux]会提供你所需要的大部分安全性。” 有谁知道如何安全可靠地进行这项工作?我曾考虑为每次提交生成一个新的VM,但这会有太多的开销,而且几乎不可能有效地实现。使用()可能是解决方案
exec
),但我至少在几年内看到了它的成功
我给的开发人员发了一封电子邮件,他们告诉我他们正在使用他们自己提出的解决方案,他们只透露他们正在使用“操作系统提供的安全功能”,并且“如果你知道如何使用它,操作系统[Linux]会提供你所需要的大部分安全性。”
有谁知道如何安全可靠地进行这项工作?我曾考虑为每次提交生成一个新的VM,但这会有太多的开销,而且几乎不可能有效地实现。使用()可能是解决方案的一部分,例如与其他一些常用(或自定义)工具结合使用。如果您以用户身份运行脚本
nobody
(在Linux上),它几乎可以不写任何内容,也不能读取权限设置正确的数据。但它仍可能导致DoS攻击,例如:
- 填充
/tmp
- 吃光公羊
- 耗尽所有CPU
为了提高效率,您可以在同一个VM中运行所有提交。这为您节省了大量开销,在最坏的情况下,它们只会相互妨碍,而不会妨碍您的服务器。在现代Linux上,除了chroot(2)之外,您还可以通过使用clone(2)而不是fork(2)来进一步限制进程。有几个有趣的克隆(2)标志: 以前,该功能是在OpenVZ中实现的,然后合并到上游,因此不再需要修补内核。已经成功实现了这样一个系统(作为公共代码粘贴/运行服务!) org是一个在线编译器/解释器,也是一个简单的协作工具。它是一个为您执行代码的粘贴库。[……] 它的工作原理 代码的执行由主管基于。策略是在ptrace下运行一切,许多系统调用被禁止或忽略。编译器和最终可执行文件都是在chroot监狱中执行的,具有严格的资源限制。主管是用哈斯凯尔语写的 [……] 当你的应用程序是远程代码执行时,你必须预料到安全问题。我采取了一些额外的预防措施,而不是仅仅依靠chroot和ptrace主管:
- 监控进程在虚拟机上运行,虚拟机通过防火墙连接,因此无法进行传出连接
- 运行虚拟机的机器也会受到严格的防火墙保护,并定期从其源映像恢复
+1.自杀标签。。我想起来了。。。这个问题不是更适合SF(或者SU)吗?@Stephan202:不一定,因为这是一个编程问题。你是怎么做到的?
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)