0xCyberstan/CVE-2026-46215-POC

GitHub: 0xCyberstan/CVE-2026-46215-POC

针对 Linux DRM GEM 核心 CVE-2026-46215 释放后使用漏洞的概念验证与完整本地提权利用链,包含 KASAN 触发、内存回收、KASLR 绕过及页缓存覆盖等技术。

Stars: 0 | Forks: 0

# CVE-2026-46215:DRM GEM `change_handle` 释放后使用(非特权 LPE) Linux DRM GEM 核心中的一个释放后使用漏洞,任何拥有以下设备访问权限的用户均可触达: render 节点(`/dev/dri/renderD*`,在所有主流桌面发行版中由 systemd-logind 授予当前活动会话)。 `DRM_IOCTL_GEM_CHANGE_HANDLE` 和 `DRM_IOCTL_GEM_CLOSE` 之间的竞态条件会在每个文件的 IDR 中留下一个悬垂句柄,指向已释放的 `kmalloc-512` 内存,随后该内存会被解引用。本仓库中的利用链将此 UAF 转化为非特权用户无需密码即可获取 root 权限。 - **CVE:** CVE-2026-46215(高危,7.8,`AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H`) - **引入版本:** `53096728b891`("drm: Add DRM prime interface to reassign GEM handle"),v6.18-rc1 - **修复版本:** 6.18.32, 7.0.9, 7.1-rc3(上游 `5e28b7b94408`)。该 ioctl 也将被上游禁用。 - **受影响版本:** v6.18-rc1 至上述修复版本 ## 归属 该漏洞最先由 Puttimet Thammasaeng 报告,他在上游修复中拥有 `Reported-by` 荣誉。我于 2026-04-12 独立发现该漏洞并报告给了 security@kernel.org。我的报告得到了确认并转发给维护者,但上游的荣誉归属给了较早的报告。本仓库包含我自己的分析和利用程序。 分析文章:https://cyberstan.co.uk ## 披露状态 修复程序已包含在发布的稳定版内核中(6.18.32 和 7.0.9 及更高版本)。本仓库是在修复程序广泛可用后发布的。 ## 漏洞细节 `drm_gem_change_handle_ioctl()` 将 GEM 对象从一个句柄移动到另一个。它获取一个查找引用,插入新的 IDR 条目,删除旧条目,然后释放引用,但从未调整 `obj->handle_count`,该值在整个序列中始终为 1。这个复合操作未与 `drm_gem_handle_delete()`(即 `GEM_CLOSE` 路径)进行串行化,并且在单独的 IDR 操作之间会释放 `table_lock`。当并发的 `GEM_CLOSE` 将 `handle_count` 减至 0 时,会释放该对象,而此时第二个 IDR 条目仍在引用它。这留下了一个悬垂句柄,随后在 `drm_gem_object_release_handle()` 中被解引用。 ## 目录结构 | 路径 | 描述 | |------|-------------| | `kasan_trigger.c` | 最小化、驱动无关的 UAF 触发器。在 KASAN 下证明任何 DRM 设备上的漏洞。不进行利用。 | | `run_kasan.sh` | 构建 initramfs 并在 QEMU 下启动以复现 KASAN 崩溃报告。 | | `exploit/` | 完整的 LPE 利用链(virtio-gpu 和 nouveau)。包含 UAF、pipe-spray 内存回收、通过类型混淆泄露 KASLR 基址、绕过 DirtyPipe 补丁、以及覆盖 `/etc/passwd` 页缓存。 | ## 复现 UAF(推荐的起点) ``` ./run_kasan.sh /path/to/kasan-bzImage ``` 构建一个自包含的 initramfs,在一个循环中竞态触发这两个 ioctl,并在竞态成功时关闭 DRM fd 以触发对悬垂句柄的解引用。请留意: ``` BUG: KASAN: slab-use-after-free in drm_gem_object_release_handle ``` 需要使用受影响版本(6.18-rc1 至修复版本)构建并开启 `CONFIG_KASAN=y` 的内核。宿主机软件包要求:`qemu-system-x86`、`gcc`、`busybox-static`、`fakeroot`、`cpio`、`gzip`。 ## 利用链 特定于驱动(偏移量通过 `pahole` 验证)。目前原样支持 virtio-gpu 和 nouveau,其他驱动需要调整偏移量。完整的利用链必须在关闭 KASAN 的情况下运行,因为隔离区会阻止 `pipe_buffer` 的内存回收。 1. 竞态触发 `GEM_CHANGE_HANDLE` 和 `GEM_CLOSE` 以获取悬垂句柄(UAF) 2. Pipe 喷射(`kmalloc-512` 中的 `pipe_buffer`)回收已释放的 slab 3. KASLR 绕过:通过结构体重叠(类型混淆),经由驱动程序的 info ioctl 反向读取 `pipe_buf_ops` 指针 4. DirtyPipe 补丁绕过:FLINK 悬垂句柄,使得分配的名称恰好落在与 `pipe_buffer.flags` 重叠的字节上,从而设置 `PIPE_BUF_FLAG_CAN_MERGE` 5. 通过拼接的 pipe 写入以覆盖只读文件的页缓存,从而获取 root 权限 ## 免责声明 在上游发布修复程序后发布,仅用于研究和防御目的。按原样提供。请仅对您控制的虚拟机运行测试。
标签:DRM, Linux内核, UAF漏洞, Web报告查看器, 安全渗透, 本地提权, 身份验证强制