针对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特有的技术。而且,很难提供一个好的, 轻量级,跨平台沙箱解决方案。我们没有计划实施 沙盘在其他平台上。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java从JSP或HTML向servlet发送多个参数   java方法来查看字符是否在字符数组中   使用带有java的MAC地址连接到设备   java如何将csv文件中的数据打印到secondactivity?   java如何从netbean 7.0.1连接到数据库   java考虑所有可能的类值,用于输出测试分割的预测值。   java我的actionListener调用有什么问题   swing在Java中实现粒子过滤器最有效的方法是什么?   java运行。getFontFamily()为返回null。使用apachepoi的docx文件   一个事务中的java领域循环与每个步骤循环中的一个事务   java日期格式与Spring Boot不兼容   java类冲突。处理   java GridBagLayout不工作   java将图像发送到另一个应用程序