Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在服务器上安全地执行用户提交的python代码_Python_User Input - Fatal编程技术网

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

在服务器上安全地执行用户提交的python代码,python,user-input,Python,User Input,我正在研究启动一个项目,该项目涉及执行用户通过HTML表单输入的python代码。我知道这可能是致命的(exec),但我至少在几年内看到了它的成功 我给的开发人员发了一封电子邮件,他们告诉我他们正在使用他们自己提出的解决方案,他们只透露他们正在使用“操作系统提供的安全功能”,并且“如果你知道如何使用它,操作系统[Linux]会提供你所需要的大部分安全性。” 有谁知道如何安全可靠地进行这项工作?我曾考虑为每次提交生成一个新的VM,但这会有太多的开销,而且几乎不可能有效地实现。使用()可能是解决方案

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

我给的开发人员发了一封电子邮件,他们告诉我他们正在使用他们自己提出的解决方案,他们只透露他们正在使用“操作系统提供的安全功能”,并且“如果你知道如何使用它,操作系统[Linux]会提供你所需要的大部分安全性。”


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

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

如果您以用户身份运行脚本
nobody
(在Linux上),它几乎可以不写任何内容,也不能读取权限设置正确的数据。但它仍可能导致DoS攻击,例如:

  • 填充
    /tmp
  • 吃光公羊
  • 耗尽所有CPU
此外,可以打开外部网络连接,等等。您可能会用内核限制来锁定所有这些,但您肯定会忘记一些东西

因此,我认为虚拟机无法访问网络或真正的硬盘驱动器将是唯一(合理)安全的途径。也许Python的开发人员挑战使用原则上“由操作系统提供”的方法


为了提高效率,您可以在同一个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)