PeronGH/badepoll-selinux-disabler

GitHub: PeronGH/badepoll-selinux-disabler

从 CVE-2026-43074 eventpoll UAF 漏洞利用链中独立提取的 SELinux 禁用原语,通过单字节内核写入将 Android 设备切换至 Permissive 模式。

Stars: 0 | Forks: 0

# badepoll-selinux-disabler 从 [CVE-2026-43074](https://nvd.nist.gov/vuln/detail/CVE-2026-43074) eventpoll UAF 漏洞利用中独立提取出来的 SELinux 禁用阶段代码。它通过与 `eventpoll` 循环深度检查(`ep_get_upwards_depth_proc`)进行竞争,将零写入 `selinux_state.enforcing`,从而通过单字节内核写入将设备切换为 Permissive 模式。这仅仅是禁用 MAC(强制访问控制)的原语——不包含权限提升。 ## 来源 由 NebuSec 从完整的 PoC 中精简而来([源码树](https://github.com/NebuSec/CyberMeowfia/tree/main/security-research/Ndays/Android-CVE-2026-43074))。UAF 漏洞存在于 eventpoll 循环深度检查(`ep_get_upwards_depth_proc`)中,该检查在 RCU 下遍历 `epi->ep`,而此时 `ep_free()` 可能会从并发线程中释放 `struct eventpoll`。上游已通过将释放操作推迟到 RCU 宽限期来修复此问题([提交 `07712db8`](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=07712db80857d5d09ae08f3df85a708ecfc3b61f);[NVD](https://nvd.nist.gov/vuln/detail/CVE-2026-43074),[OSV](https://osv.dev/vulnerability/CVE-2026-43074))。 这与“Bad Epoll”(CVE-2026-46242)不同,后者是同一个 eventpoll 代码中 `ep_remove()` 里的另一个释放后重用漏洞;此处的竞争专门针对由 `07712db8` 修复的循环深度检查生命周期缺陷。 ## 受影响的内核 根据 kernel.org CNA(通过 OSV/NVD)的信息,受影响的稳定版本分支及其修复版本如下: - `6.4.0` – `<6.6.136`(已在 `6.6.136` 修复) - `6.7.0` – `<6.12.83`(已在 `6.12.83` 修复) - `6.13.0` – `<6.18.24`(已在 `6.18.24` 修复) - `6.19.0` – `<6.19.14`(已在 `6.19.14` 修复) 所指定的目标内核 `6.6.118-android15-8` 属于受影响的 6.6 版本范围(在 `6.6.136` 中修复)。向后移植了该修复但未提升上游版本号的厂商内核不受此漏洞影响——请验证实际的补丁状态,而不要仅依赖 `uname -r`。 ## 目标 固定为一个确切的构建版本——enforcing 字节是通过硬编码的 KVA 别名访问的,且竞争依赖于该内核的 slab 布局: - **设备:** Pixel 10 Pro / blazer - **内核:** `6.6.118-android15-8-g53e6e091166e-ab15266607-4k` - **指纹:** `google/blazer/blazer:17/CP2A.260705.006/15641320:user/release-keys` - **别名:** `TARGET_SELINUX_ENFORCING_ALIAS = 0xffffff800236a2e0` 若要针对其他构建版本重新设定目标,需要重新计算 [`src/target.h`](src/target.h) 中的别名(`selinux_state` 的镜像偏移量 + 映射基址 + 加载地址)。 ## 构建 需要带有 aarch64 clang 工具链的 Android NDK。默认使用 `NDK_ROOT=/opt/android-ndk`,`API=35`: ``` make # → build/disabler ``` 根据需要覆盖默认配置: ``` make API=35 NDK_ROOT=/path/to/android-ndk ``` ## 运行 将 `build/disabler` 推送到设备并以 `shell` 用户(uid 2000)身份运行。启动时 SELinux 必须处于 Enforcing 状态;否则二进制程序将跳过执行。成功时输出如下: ``` SELINUX_AFTER Permissive RESULT PASS selinux_zero attempt=N ``` 使用 `getenforce` 验证 → `Permissive`。 ## 范围 除了此原语之外,原始漏洞利用还添加了一个 pipe-buffer `flags` 重定向(DirtyPipe 风格的针对只读页缓存页面的写入),以修改 `/system/bin/dumpstate` 从而生成一个 root daemon。这些阶段(`pipe.c`、`patch.c`、`su.c`、`payloads.S` 以及原始的 `main.c` 编排逻辑)在此处已被移除,并且 `late_refs.c` 被精简为仅保留其零字节重定向路径。仅仅禁用 SELinux 不会授予 root 权限——它只是移除了 MAC 强制执行机制,以便载体 payload 能够不受限制地运行。
标签:Android, DSL, Linux内核, PoC, SELinux, UAF, Web报告查看器, 安全渗透, 客户端加密, 暴力破解