假设互联网上有一台服务器可以发送一段代码进行评估。在某些时候,服务器会获取已提交的所有代码,并开始运行和评估它。但是,在某些时候它肯定会碰到一些邪恶的程序员发送的“os.system('rm -rf *')”。除了“rm -rf”之外,你可以期待人们尝试使用服务器发送垃圾邮件或给别人发送垃圾邮件,或者使用“while True:pass”之类的东西来愚弄。
有没有办法合作这种不友好/不受信任的代码?特别是我对python的解决方案很感兴趣。但是,如果您有任何其他语言的信息,请分享。
答案 0 :(得分:6)
如果您不是特定于CPython实现,您应该考虑查看 PyPy [wiki] 用于这些目的 - 这种Python方言允许透明代码沙盒。< / p>
否则,您可以在__builtin__
或__builtins__
的相应全局/本地参数中提供假exec
和eval
。
此外,您可以提供类似字典的对象而不是真正的字典,并跟踪不受信任的代码对其命名空间的影响。
此外,您实际上可以跟踪该代码(在执行任何其他代码之前在受限制的环境中发出sys.settrace()
),这样您就可以在出现问题时中断执行。
如果没有一个解决方案可以接受,请使用操作系统级沙盒,如chroot
,unionfs
和标准multiprocess
python模块,在单独的安全过程中生成代码工作者。
答案 1 :(得分:3)
您可以检查pysandbox这样做,但如果您负担得起,VM路线可能更安全。
答案 2 :(得分:2)
不可能为此提供绝对解决方案,因为“坏”的定义很难确定。
打开和写入文件是坏还是好?该文件是/ dev / ram怎么办?
您可以描述行为的签名,或者您可以尝试阻止任何可能不好的事情,但您永远不会赢。 Javascript就是一个非常好的例子,人们在他们的计算机上一直运行任意javascript代码 - 它应该是沙箱,但是会出现各种各样的安全问题和边缘条件。
我不是说不试试,你会从这个过程中学到很多 。
许多公司花费了数百万美元(英特尔只花了数十亿美元用于McAffee)试图了解如何检测“坏代码” - 而且每天运行McAffe反病毒的机器都会感染病毒。 Python代码的危险性不低于C.您可以运行系统调用,绑定到C库等。
答案 3 :(得分:2)
我会认真考虑虚拟化环境以运行这些东西,以便通过虚拟机的配置再次对您实施的任何机制中的漏洞进行防火墙处理。
用户数量以及您希望测试/运行的代码类型将对btw的选择产生相当大的影响。如果不期望它们链接到文件或数据库,或者运行计算密集型任务,并且压力非常低,那么只需完全阻止文件访问并在进程被杀死之前对进程施加时间限制就可以了。提交标记为太昂贵或恶意。
如果您要测试的代码可能是任意Django扩展或页面,那么您可能需要做很多工作。
答案 4 :(得分:1)
您可以尝试使用某些通用的沙盒,例如Sydbox或Gentoo's sandbox。它们不是特定于Python的。
两者都可以配置为限制对某些目录的读/写。 Sydbox甚至可以使用沙箱插座。
答案 5 :(得分:0)
我认为像这样的解决方案会非常困难,这让我想起了我参加的关于虚拟环境中编程优势的讲座。 如果你这样做的话,它实际上很酷。它不会解决一段时间的真:传递但是rm -rf /无关紧要。
答案 6 :(得分:0)
除非我弄错了(我很可能会这样),这也是Google为App Engine改变Python的原因所在。您在他们的服务器上运行Python代码,但他们已经删除了写入文件的能力。所有数据都保存在“nosql”数据库中。
这不是你问题的直接答案,而是在某些情况下如何处理这个问题的一个例子。