免责声明: 本材料仅供教育目的提供。未经目标系统所有者书面同意使用该漏洞利用程序是不道德的,并可能受到法律追究。
chmod +x build.sh。./build.sh。./mls_envp。你将获得 root 权限。在存在漏洞的 polkit 版本(0.105)中,作者 David Zeuthen 假设 pkexec 始终会从控制台调用。他假定 argc(参数数量)始终大于 1,因为 argv[0] 是程序本身的名称。然而,可以通过系统调用 execve 传入空参数数组来调用 pkexec。这导致程序的逻辑被破坏。
在 pkexec 的代码中硬性假定 argv 至少包含一个元素。当 argc 等于 0 时,程序仍然尝试访问 argv[1]。这导致越界访问 argv 数组,并读取 envp 数组(环境变量)的第一个元素。在我们的例子中,那里存放着字符串 "exp_exe"。
pkexec 尝试使用 g_find_program_in_path 函数查找程序 exp_exe。该函数使用 PATH 变量进行搜索。我们将 PATH 替换为 GCONV_PATH=.。最终 pkexec 在我们本地文件夹中找到占位文件 exp_exe,并返回路径 GCONV_PATH=./exp_exe。由于 argc 的缺陷,该路径被写回 envp[0],从而“合法化”了 GCONV_PATH 变量。
在启动程序之前,pkexec 会检查环境变量(包括 SHELL)。我们传入一个不存在的 shell(SHELL=xyz)以触发错误。在输出错误时,会调用 log_message,它使用 glibc 的机制。Glibc 查看变量 CHARSET=bohemcavanna,在未找到标准转换器后,会访问 GCONV_PATH 指定的目录(即我们提供的目录)。在那里它读取 gconv-modules 文件,加载我们的库 exploit.so,并以 root 权限执行其中的代码。