代码之家  ›  专栏  ›  技术社区  ›  Jason Baker

哪些内置函数不应该由不受信任的用户运行?

  •  1
  • Jason Baker  · 技术社区  · 14 年前

    我正在创建一个运行在django上的corewars类型的应用程序,允许用户上传一些控制其字符的python代码。现在,我知道 真实的 答案是,只要我从不受信任的用户那里获取代码输入,我就会有安全漏洞。我只是尽量减少风险。下面是一些让人想到的:

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

    我还缺什么吗?

    6 回复  |  直到 14 年前
        1
  •  1
  •   Pixy Misa    14 年前

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

    对Lua进行沙盒处理要比Python容易得多,嵌入Lua要比创建自己的编程语言容易得多。

        2
  •  3
  •   Chris Morgan    14 年前

    关于限制Python在 http://wiki.python.org/moin/SandboxedPython . 前一段时间,当我查看它时,Zope RestrictedPython看起来是最好的解决方案,它使用白名单系统。您仍然需要在自己的代码中小心,这样就不会暴露任何安全漏洞,但这似乎是最好的系统。

        3
  •  2
  •   SimonJ    14 年前

    既然你听起来决心这么做,我就把你和标准联系起来 rexec 模块,不是因为我认为你应该使用它( 不要 -它有 known vulnerabilities ),但因为这可能是 使您的Web服务器受到损害 你自己的受限执行框架。

    特别是,在“定义受限环境”标题下,列出了rexec设计器认为合理安全的几个模块和函数;这些模块和函数可以用作各种类型的初始白名单。我还建议你检查一下它的代码,看看是否还有其他你可能没想到的问题。

        4
  •  2
  •   Matthew Flaschen    14 年前

    你真的需要避免评估。 想象一下这样的代码:

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

    这可能是最重要的一个。

        5
  •  2
  •   Bradley Kreider    14 年前

    是的,你得写白名单。隐藏坏命令的方法有很多。

    这是 不是 最坏的情况是:

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

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

    最后,作为 plash 显示,有很多危险的系统调用需要防范。

        6
  •  1
  •   Matthew Flaschen    14 年前

    你应该用白名单,而不是黑名单。如果你使用黑名单,你总是会漏掉一些东西。即使没有,Python也会向标准库中添加一个函数,并且不会及时更新黑名单。

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

    我同意这将是非常棘手的正确做法。其中一个复杂的问题是用户通过另一个类中的字段访问其中一个函数。

    我会考虑改用另一种隔离机制,比如虚拟机,或者除了此之外。你可以看看 codepad 做到了。