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