我正在创建一个在django上运行的corewars类型的应用程序,并允许用户上传一些将控制其角色的python代码。现在,我知道真正的答案是,只要我从不受信任的用户那里获取代码输入,我就会遇到安全漏洞。我只是想尽可能地降低风险。以下是一些让人想到的东西:
__import__
(我可能也会进行一些扫描,以确保没有任何导入声明)open
file
input
raw_input
还有其他我错过的吗?
答案 0 :(得分:3)
关于在http://wiki.python.org/moin/SandboxedPython限制Python的一般操作,有很多答案。当我在前一段时间看到它时,Zope RestrictedPython看起来是最好的解决方案,使用白名单系统。您仍然需要注意自己的代码,这样就不会暴露任何安全漏洞,但这似乎是最好的系统。
答案 1 :(得分:2)
你真的需要避免使用eval。 想象一下如下代码:
eval("__impor" + "t__('whatever').destroy_your_server")
这可能是最重要的一个。
答案 2 :(得分:2)
由于您确实愿意这样做,我会将您链接到标准rexec模块,而不是因为我认为您应该使用它(不要 - 它有{{ 3}}),但因为它可能是让你的网络服务器受到损害你自己的限制执行框架的一个很好的起点。
特别是在“定义受限环境”标题下,列出了rexec设计师认为相当安全的几个模块和功能;这些可能可用作各种类型的初始白名单。我还建议检查一下你可能没有想过的其他问题的代码。
答案 3 :(得分:2)
是的,你必须白名单。有很多方法可以隐藏坏命令。
这是 NOT 最糟糕的情况:
最糟糕的情况是有人进入数据库
最糟糕的情况是让整个机器生根,你不会注意到它会探测你的其他机器和键盘密码。隔离这台机器并认为它是敌对的(DMZ,阻止它能够在内部和外部发动攻击等)。在不可写介质上运行tripwire或AIDE,并将所有内容记录到第二台主机。
最后,正如plash所示,需要保护许多危险的系统调用。
答案 4 :(得分:1)
您应该使用白名单,而不是黑名单。如果您使用黑名单,您将永远错过一些东西。即使你不这样做,Python也会在标准库中添加一个函数,你不会及时更新你的黑名单。
您目前允许但可能不应包含的内容:
我同意这样做是非常棘手的。一个复杂性(在许多中)可能是用户通过另一个类中的字段访问其中一个函数。
我会考虑使用另一种隔离机制,例如虚拟机,或者除此之外。您可以查看codepad如何做到这一点。
答案 5 :(得分:1)
如果你没有承诺使用Python作为游戏中的语言,一种可能性是使用LunaticPython嵌入Lua(我建议https://code.launchpad.net/~dne/lunatic-python/bugfixes处的错误修正分支。)
沙箱Lua比Python容易得多,嵌入Lua要比创建自己的编程语言容易得多。