【问题标题】:Disabling std. and file I/O in Python sandbox implementation禁用标准。和 Python 沙盒实现中的文件 I/O
【发布时间】:2012-05-03 08:03:12
【问题描述】:

我正在尝试设置 Python 沙箱并希望禁止访问标准和文件 I/O。我正在运行的 Python 服务器中运行沙箱。

我已经看过像 RestrictedPythonPyPy 这样的模块;但是,我希望能够在我正在运行的 Python 服务器中编译沙箱代码,而不是通过外部进程。

是否有任何替代方法可以阻止对printraw_inputopen 等命令的访问?上述模块能否用于在运行的 Python 程序中编译沙箱代码的方式?

在最坏的情况下,您将如何阻止对 raw_input 的访问?

编辑:根据this tutorial on safely evaluating Python code,是否可以传入经过操作的 builtins 模块?

【问题讨论】:

  • 只有 PyPy 沙盒值得一试,其他的都是浪费时间。
  • 你能描述一下沙盒到底应该运行什么吗?任意代码、应该评估为 Python 对象的用户输入等?您需要 DoS(CPU 使用率、内存耗尽)保护吗?是什么让分离的进程对您的用例不利(请记住,您通常可以轻松地在 Python 服务器上运行代码,向/从分离的沙盒进程发送和获取结果)?
  • 沙箱应该运行来自用户输入的命令,主要是我上面提到的限制。这对我来说只是一个更简单的选择,因为我在对 eval/exec 的调用中更新了环境,并且在两个进程之间传递环境会更加困难。我一直在研究如何为命令的 exec/eval 设置内存限制,但无济于事。
  • 请描述“命令”,最好使用示例代码。内存限制需要单独的进程或操作系统强制限制 AFAIK。
  • 对不起。 “命令”是指您可以输入 Python shell 的任何内容,例如“x = [1,2,3]”或“map(, )”。这里正在解决施加内存限制的问题:stackoverflow.com/questions/10269974/…

标签: python file io sandbox pypy


【解决方案1】:

对此的粗略共识是,CPython 的复杂性和自省能力使得unreliable attempts 将解释器的部分列入黑名单。我相信主要尝试之一是 tav 的safelitecause CPython to crash 也不是那么难,它打开了另一条可用于运行任意代码的路径。避免来自任意代码的资源耗尽或 CPU 使用 DoS 可能无法在进程内执行(您需要看门狗、系统限制等)。

对于希望在 Python 中执行沙盒代码的人来说,关键是避免自己滚动(或简单地修改 sys__builtins__):很容易说服自己它是坚如磐石的,但却错过了一些明显的解决方法绕过你的保护。请记住,Python 曾经包含一个提供这种保护的模块,甚至有明显的问题可以逃脱其限制。 IIRC,它很容易将非受限对象(通过内省)钓鱼到受限环境中。

也就是说,pysandbox 是由一位核心 Python 开发人员编写的,他认为它在限制时是安全的,例如IO(它结合了许多先前的研究)并且可以按照您的意愿在进程内运行(尽管功能较少,例如针对 CPU 和内存使用的 DoS 保护)。

【讨论】:

  • Pysandbox 有任何类型的 eval 命令吗?目前它有execute,类似于'exec',但它似乎没有任何类似于eval的东西。
  • 只是为了更新(因为我今天在这里浏览)pysandbox 作者认为他的方法不安全且不值得使用。 mail.python.org/pipermail/python-dev/2013-November/130132.html
猜你喜欢
  • 2012-07-17
  • 2019-03-18
  • 2015-07-29
  • 1970-01-01
  • 2015-11-28
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多