注意: 本存储库及其内容是毕业论文(GrAL)的一部分,仅出于教学目的和学术研究而创建。
本存储库包含针对 CVE-2021-4034 漏洞(也称为 PwnKit)的概念验证(PoC - Proof of Concept)。此内存破坏漏洞影响 Linux 系统中 Polkit 的 pkexec 组件。当 pkexec 以空参数列表(argc == 0)执行时,可以操纵环境变量,迫使其加载任意共享库,从而实现本地权限提升。
以下说明了为利用该漏洞而准备执行环境所需执行的步骤。该过程详细说明了如何利用 pkexec 中的内存读/写错误:
gconv 结构)该漏洞利用滥用了 GLib 在尝试打印错误消息时处理字符转换的方式。为此,第一步是创建特定的目录结构,使其作为 GLib 的 GCONV 转换模块的本地存储库。
漏洞的关键在于注入 GCONV_PATH 环境变量,利用 pkexec 在 argc == 0 状态下引发的越界写入。通过这种方式,程序被迫使用异常的字符集,这告诉 GLib 应在上一步创建的受控目录中查找字符转换模块。
.so)为了执行我们的代码,需要编译一个共享库(shared object 或 .so)。当 pkexec 尝试处理一个无法找到的字符集时,它将从我们伪造的 gconv 目录中加载该库。由于 pkexec 是启用了 SUID 位的二进制文件(以 root 身份运行),加载该库时我们的代码将获得 root 权限,从而完全控制系统(例如打开一个 root shell)。
gconv-modules 文件最后,需要在该本地目录中创建一个名为 gconv-modules 的配置文件。该文件充当索引:它告诉 GLib 必须加载哪个特定库(.so)来执行所请求的特定字符集的转换。该文件将 pkexec 请求的转换与第 3 步中创建的共享库关联起来。
项目包含一个 Makefile,用于自动化 C 二进制的编译和环境清理。
编译项目: $ make
清理生成的文件(临时文件、文件夹和二进制文件): $ make clean