venglin/setcred

GitHub: venglin/setcred

针对 FreeBSD 14.x 内核 setcred(2) 栈缓冲区溢出漏洞(CVE-2026-45250)的研究成果集合,包含详细漏洞分析与可复现的本地提权 exploit。

Stars: 22 | Forks: 2

# FreeBSD setcred(2) — 研究成果 本子目录收集了针对 FreeBSD 14.x 内核中 `setcred(2)` 栈缓冲区溢出的分析文章和可用的 exploit。 漏洞本身的详细记录在 `setcred.txt` 中。简而言之:`kern_setcred_copyin_supp_groups()` 在 `groups` 为 `gid_t **` 的情况下使用了 `sizeof(*groups)`,导致在使用 `copyin()` 向固定大小的内核栈数组拷贝数据时,步长变成了 8 字节而不是 4 字节。该溢出在任何权限检查之前即可被触发,任何非特权用户均可利用。 本仓库收录了两条可用的利用路径: * **未开启 SMAP / SMEP** — `exp2_lpe_no_smap.c`。只需一次 `setcred(2)` 系统调用,即可通过一个伪造的 `struct sysentvec`,将位于 `amd64_syscall+0x155` 处的链式原语重定向到用户空间的 shellcode,从而将调用线程的 uid 切换为 0。 * **开启 SMAP / SMEP** — `exp_setcred_smap_zfs.c`。劫持到 `zfs.ko` 中的 `ZSTD_initCStream_advanced`,其函数体会执行 `td_ucred = rcx+1`。当设定 `rcx = K1 = parent_pargs - 1`(即植入到子进程 pargs slab 中的一个 qword 值)时,调用线程的凭证指针将正好落在父进程的 pargs slab 内,而我们此前已在该 slab 中植入了一个 `cr_uid=0` 的伪造 `struct ucred`。该 exploit 适用于任何加载了 `zfs.ko` 的 FreeBSD 14.4 GENERIC 系统(典型的服务器配置),且不需要内核信息泄露原语。 ## 目录结构 ``` setcred/ +- setcred.txt Primary write-up: vulnerability, both LPE | techniques, PoC pointers, FIX STATUS, timeline. | Pure ASCII. +- exploits/ Curated exploit drop. +- poc_dos.c Minimal DoS PoC -- any user | panics kernel. +- exp2_lpe_no_smap.c Full LPE on no-SMAP/SMEP kernel. +- exp_setcred_smap_zfs.c SMAP/SMEP-safe LPE via zfs.ko | ZSTD gadget. No info-leak. +- wrapper.c Tiny setuid-root → /bin/sh | launcher installed at /tmp/rsh | by exp_setcred_smap_zfs. +- Makefile.setcred_smap_zfs Guest-side build pipeline for | the SMAP/SMEP path | (all, install, clean). +- README_setcred_smap_zfs.md End-user write-up for the SMAP/SMEP path. ``` ## 状态 * DoS(任意用户均可导致内核崩溃)以及在未开启 SMAP/SMEP 环境下的完整 LPE,均可通过 `exploits/` 目录中的相应程序复现。 * 开启 SMAP/SMEP 环境下的完整 LPE,可通过 `exp_setcred_smap_zfs.c` 在任何加载了 `zfs.ko` 的 FreeBSD 14.4 GENERIC 系统上复现。具体技术细节请参阅 `setcred.txt`。 * 截至报告日期,14.4-RELEASE / stable/14 仍然受到此漏洞影响。修复已于 2025-11-27 作为某次无关重构的副作用合入 main 分支(commit 000d5b5),但未被反向移植。
标签:FreeBSD, Web报告查看器, 内核漏洞, 客户端加密, 本地提权