CVE-2019-2215 — Android Binder Use-After-Free 权限提升 描述
针对 CVE-2019-2215 漏洞的利用程序 — Android 内核 binder 驱动中的 use-after-free。可在存在漏洞的设备上将权限提升至 root。 漏洞
CVE-2019-2215 — binder_thread 在使用 epoll 时发生 use-after-free。该错误源于 binder_poll() 中 wait 队列处理不当,从而导致能够重写内核内存。
工作原理
1. 指针泄漏(leakTaskStruct)
epoll 与 binder 之间的竞争条件导致通过 writev/pipe 读取当前进程 task_struct 的指针。
2. 覆盖 addr_limit(clobberAddrLimit)
利用相同的竞争条件,将 0xFFFFFFFFFFFFFFFE 写入 task_struct 结构体的 addr_limit 字段,从而获得对整个内核内存的访问权限。
3. 修补 cred(patchCred)
通过 pipe 通道(kernel_fd)读取并覆盖当前进程的 cred 结构体:
UID/GID = 0(root)
完整 capabilities(CAP_FULL_SET)
4. 禁用 SELinux(disableSELinuxEnforcing)
通过 nsproxy 计算内核基地址,并将 selinux_enforcing 标志清零。
5. 以 root 权限启动 shell:system("/bin/sh")
要求
使用存在漏洞的 Android 版本(2019 年 10 月补丁之前)的设备
ARM64 架构
存在 /dev/binder
编译时需要指定内核符号:
init_nsproxy — 用于计算内核基地址
selinux_enforcing — 用于禁用 SELinux
可以从目标系统的 /proc/kallsyms 中获取这些符号。