1

我正在创建一个在 django 上运行的 corewars 类型的应用程序,并允许用户上传一些控制其角色的 python 代码。现在,我知道这个问题的真正答案是,只要我从不受信任的用户那里获取代码输入,我就会有安全漏洞。我只是想尽可能地降低风险。以下是一些让我想到的:

  • __import__(我可能还会做一些 ast 扫描以确保没有任何导入语句)
  • open
  • file
  • input
  • raw_input

还有其他我想念的吗?

4

6 回答 6

3

在http://wiki.python.org/moin/SandboxedPython上有很多关于限制 Python 的一般方法的答案。当我前段时间查看它时,Zope RestrictedPython 看起来是最好的解决方案,它使用白名单系统。您仍然需要注意自己的代码,以免暴露任何安全漏洞,但这似乎是目前最好的系统。

于 2010-11-13T02:57:08.960 回答
2

你真的需要避免评估。想象一下代码,例如:

eval("__impor" + "t__('whatever').destroy_your_server")

这可能是最重要的一个。

于 2010-11-13T02:37:04.790 回答
2

既然您听起来决心这样做,我会将您链接到标准rexec模块,不是因为我认为您应该使用它(不要- 它有已知的漏洞),而是因为它可能是获取您的webserver 破坏了您自己的受限执行框架。

特别是,在“定义受限环境”标题下,列出了 rexec 设计者认为相当安全的几个模块和功能;这些可能可用作各种初始白名单。我还建议检查它的代码以查找您可能没有想到的其他问题。

于 2010-11-13T02:53:58.077 回答
2

是的,你必须列入白名单。有很多方法可以隐藏错误的命令。

不是最坏的情况:

最坏的情况是有人进入数据库

最坏的情况是让整个机器植根,而你没有注意到它会探测你的其他机器并记录你的密码。隔离这台机器并认为它是敌对的(DMZ,阻止它在内部和外部发起攻击等)。在不可写媒体上运行tripwire 或AIDE,并将所有内容记录到第二台主机。

最后,正如plash所示,有许多危险的系统调用需要加以保护。

于 2010-11-13T05:13:47.320 回答
1

您应该使用白名单,而不是黑名单。如果你使用黑名单,你总会错过一些东西。即使你不这样做,Python 也会在标准库中添加一个函数,你也不会及时更新你的黑名单。

您当前允许但可能不应包括的内容:

  • compile
  • eval
  • reload(如果他们确实以某种方式访问​​文件系统,这基本上是import

我同意正确地做到这一点非常棘手。一个复杂问题(在许多问题中)可能是用户通过另一个类中的字段访问这些函数中的一个。

我会考虑使用另一种隔离机制,例如虚拟机,而不是或除此之外。你可以看看键盘是如何做到的。

于 2010-11-13T02:36:35.657 回答
1

如果您不打算在游戏中使用 Python 作为语言,一种可能性是使用 LunaticPython 嵌入 Lua(我建议在https://code.launchpad.net/~dne/lunatic-python/bugfixes的错误修复分支)。

沙盒 Lua 比 Python 容易得多,嵌入 Lua 也比创建自己的编程语言容易得多。

于 2010-11-13T08:53:00.570 回答