执行可能不友好的Python代码的沙盒
假设有一个服务器,大家可以把一段代码发送到这个服务器上,让它来执行和评估这段代码。可是,问题来了,服务器在执行这些代码的时候,肯定会遇到一些恶意程序员发送的代码,比如“os.system('rm -rf *')”,这个命令会删除服务器上的所有文件。除了这个命令,大家还可能会利用这个服务器发送垃圾信息,或者进行拒绝服务攻击,甚至写一些像“while True: pass”这样的代码,让服务器一直忙碌。
那么,有没有办法来处理这些不友好或者不可信的代码呢?我特别想知道关于Python的解决方案。如果你有其他语言的相关信息,也请分享一下。
7 个回答
我建议你考虑把这个环境虚拟化,也就是在一个虚拟机里运行这些东西。这样的话,如果你用的某种机制有漏洞,虚拟机的设置可以再给你加一层保护。
用户数量和你预计要测试或运行的代码类型会对你的选择有很大影响。如果这些代码不需要链接文件或数据库,也不需要进行复杂的计算,而且你对性能的要求不高,那么你可以通过完全禁止文件访问和给程序设置时间限制来解决问题。这样一来,程序在超时后就会被杀掉,提交的内容也会被标记为太耗资源或有恶意。
不过,如果你要测试的代码可能是任何随机的Django扩展或页面,那你可能会面临很多工作。
如果你不局限于CPython这个实现,建议你看看PyPy[wiki]。这个Python的变种可以让你在代码执行时进行透明的沙盒处理,也就是可以在一个安全的环境中运行代码。
如果你不想用PyPy,你可以在调用exec
或eval
的时候,给它们传入一些假的__builtin__
和__builtins__
,这样可以控制代码能用哪些内置功能。
另外,你还可以用一个类似字典的对象来代替真正的字典,这样就能监控不可信代码对它的命名空间做了什么。
而且,你实际上可以追踪这些代码的执行(在受限环境中调用sys.settrace()
,在其他代码执行之前),这样如果出现问题,你可以及时中断执行。
如果这些方法都不合适,你可以使用操作系统级别的沙盒,比如chroot
、unionfs
,以及标准的multiprocess
Python模块,来在一个单独的安全进程中运行代码。
你可以看看 pysandbox,这个工具就是用来做这个的。不过,如果你能承担得起,使用虚拟机(VM)的方法可能会更安全一些。