他们在 Python 中发现了允许从沙盒脚本运行命令的漏洞

几天前 公开了一种绕过 Python 的孤立代码执行系统的方法,基于使用 Python 2.7 中出现的一个长期已知的错误,于 2012 年发现,但尚未在 Python 3 中修复。

有人提到 该错误允许使用特殊绑定的 python 代码来发起调用 到 Python 中已经释放的内存(Use-After-Free)。 最初,假设错误不代表安全威胁,只有在极少数情况下,通常是人为创建的,才会导致脚本异常终止。

化名 kn32 的安全研究人员对这个问题产生了兴趣,并设法准备了一个功能性漏洞利用程序,该漏洞利用程序可以调用任何系统命令,而无需直接访问 os.system 等方法。

该漏洞利用纯 Python 实现,无需导入外部库即可工作 并且没有安装“code.__new__”驱动程序。 钩子中,只使用了“builtin.__id__”,一般不禁止。 在实际方面,所提出的代码可用于绕过各种服务和环境(例如,在学习环境、在线 shell、内置控制器等)中的隔离机制,这些服务和环境允许执行 Python 代码,但限制了可用的调用和禁止访问方法,例如 os.system。

建议的代码 是 os.system 调用的类似物, 它通过利用 CPython 中的漏洞来工作。 该漏洞利用适用于 x3-86 系统上的所有 Python 64 版本,并且在 Ubuntu 22.04 上稳定,即使启用了 PIE、RELRO 和 CET 安全模式。

工作 归结为从 Python 代码中获取有关其中一个函数的地址的信息 在 CPython 可执行代码中。

根据这个地址,计算出 CPython 在内存中的基地址和加载的 libc 实例中 system() 函数的地址。 最后,通过将第一个参数的指针替换为字符串“/bin/sh”,开始直接转换到给定的地址系统。

最简单的利用方法是创建一个长度等于释放缓冲区长度的列表,该列表很可能将其项目缓冲区(ob_item)分配在与释放缓冲区相同的位置。

这意味着我们将在同一块内存上获得两个不同的“视图”。 一种观点,memoryview,认为内存只是一个字节数组,我们可以任意写入或读取。 第二个视图是我们创建的列表,它认为内存是 PyObject 指针的列表。 这意味着我们可以在内存中的某处创建伪造的 PyObject 电子邮件,通过写入 memoryview 将它们的地址写入列表,然后通过索引列表来访问它们。

在 PoC 的情况下,他们将 0 写入缓冲区(第 16 行),然后使用 print(L[0]) 访问它。 L[0] 获取第一个 PyObject* 0,然后 print 尝试访问其中的一些字段,从而导致空指针取消引用。

有人提到 至少从 python 2.7 开始,所有 python 版本中都存在此错误 尽管该漏洞被设计用于几乎所有版本的 Python 3,但这并不意味着它在 Python 2 中不可重现(根据作者的说法)。

该漏洞利用的目的是调用 system("/bin/sh") 其步骤如下:

  • CPython泄漏二进制函数指针
  • 计算 CPython 基地址
  • 计算系统地址或您的 PLT 存根
  • 跳转到这个地址,第一个参数指向 /bin/sh

最后,提到该漏洞在大多数配置中都不会有用。 但是,对于尝试隔离代码、限制导入或使用审计挂钩的 Python 解释器来说,它可能很有用。

最后 如果您有兴趣了解更多有关它的信息 关于注释,您可以查阅原始出版物中的 以下链接。


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责资料:AB Internet Networks 2008 SL
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。