针对python和linux的简单而轻量级的沙盒解决方案。
boxed的Python项目详细描述
盒装是一个简单的Python沙箱解决方案。它的工作原理是任意运行 python作为非特权用户在单独的python解释器中运行。
api非常简单:
from boxed import run result = run(target_func, args=args, kwargs=kwargs)
这将产生一个python解释,它将放弃其特权并运行 target_func(*args, **kwds)作为nobody用户。沟通 在主进程和从进程之间使用序列化流完成 它可以使用pickle、cloudpickle、dill或json。
如果目标函数输出 可拾取的对象,在取消拾取时产生恶意副作用。我们没有 知道如何利用此漏洞,但理论上是可能的,因此 警告。dill和cloudpickle可能更容易受到攻击,因为它们都可以 pickle函数字节码,打开许多攻击门。
使用json序列化程序可以大大降低损坏的可能性。 缺点是输入和输出都必须与json兼容(即 必须由基本类型(如数字、字符串、列表和听写)组成。 除此之外,目标函数本身必须是一个python可调用的,它生活在 公共命名空间。json序列化程序只是发送完全限定的函数 命名为沙盒并在那里导入此函数。
>>> from boxed import run >>> from math import sqrt >>> run(sqrt, args=(4,), serializer='json') 2.0
它是如何工作的?
沙盒是作为一个不同的python解释器生成的,使用python_boxed 在安装过程中创建的可执行文件。这只是一份普通的 启用了Linux setuid功能的解释器。这种简单的技术允许 进程以在执行期间更改其uid,从而使其能够放弃其权限。 在执行的早期。
这可能还记得臭名昭著的suid。suid可执行文件允许用户生成 以超级用户权限开始其生命的程序,并(希望)删除 他们尽可能快,同时只保留必要的权限 去跑步。典型的例子是web服务器。只有超级用户才能 侦听端口80(或任何其他较低的端口),因此Web服务器必须启动 以根为根的生活,迅速放弃所有特权,但那些必要的交流 所需的端口。
linux功能是suid位的细粒度版本。它给予 对程序非常特殊的特权。boxed库使用python 具有setuid功能的解释器,它只允许我们 更改进程的uid的权限。即使程序升级了 使用uid=0(超级用户)运行的权限,其他权限都不是 所以它不会获得超能力。尤其是,它不会 能够读取、写入或执行执行沙盒的用户所做的任何文件 无法访问。
默认情况下,boxed作为nobody用户运行沙盒。我们创建了 解释器在安装期间调用/usr/bin/python_,然后应用 命令:
$ setcap cap_setuid+ep /usr/bin/python_boxed
它在windows、osx、bsd等系统上工作吗?
不,这是Linux特有的技术。而且,很难提供一个好的, 轻量级,跨平台沙箱解决方案。我们没有计划实施 沙盘在其他平台上。