
CVE-2026-45250: FreeBSD 14.4 setcred kernel buffer overflow (LPE)
本子目录收集了针对 FreeBSD 14.x 内核中 setcred(2) 栈缓冲区溢出的文档和可用漏洞利用程序。
漏洞本身在 setcred.txt 中有完整记录。简要说明:kern_setcred_copyin_supp_groups() 使用了 sizeof(*groups),其中 groups 是 gid_t ** 类型,导致在将数据 copyin() 到固定大小的内核栈数组时,步长为 8 字节而非 4 字节。该溢出在任何权限检查之前即可被任何非特权用户触发。
该仓库包含两种可行的利用路径:
无 SMAP / 无 SMEP — exp2_lpe_no_smap.c。通过一次 setcred(2) 系统调用,利用位于 amd64_syscall+0x155 的链式原语,借助伪造的 struct sysentvec 将调用线程的 uid 重定向为用户空间 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 中,我们在其中植入了包含 cr_uid=0 的伪造 struct ucred。适用于任何加载了 zfs.ko(典型服务器配置)的 FreeBSD 14.4 GENERIC 系统,且无需内核信息泄露原语。
setcred/
+- setcred.txt 主要文档:漏洞描述、两种 LPE 技术、PoC 指示、修复状态、时间线。
| 纯 ASCII。
+- exploits/ 精选漏洞利用程序。
+- poc_dos.c 最小 DoS PoC —— 任意用户即可
| 使内核崩溃。
+- exp2_lpe_no_smap.c 针对无 SMAP/SMEP 内核的完整 LPE。
+- exp_setcred_smap_zfs.c 通过 zfs.ko ZSTD gadget 实现
| 的 SMAP/SMEP 安全 LPE。无需信息泄露。
+- wrapper.c 小型 setuid-root → /bin/sh 启动器,
| 由 exp_setcred_smap_zfs 安装到
| /tmp/rsh。
+- Makefile.setcred_smap_zfs 用于 SMAP/SMEP 利用路径的
| 客户机构建脚本
| (all、install、clean)。
+- README_setcred_smap_zfs.md 针对 SMAP/SMEP 利用路径的
最终用户文档。
通过 exploits/ 中的对应程序,DoS(任意用户使内核崩溃)和无 SMAP/SMEP 的完整 LPE 均可复现。
在启用了 SMAP/SMEP 的情况下,通过 exp_setcred_smap_zfs.c 在加载了 zfs.ko 的任何 FreeBSD 14.4 GENERIC 系统上均可复现完整 LPE。具体技术细节见 setcred.txt。
截至报告日期,14.4-RELEASE / stable/14 仍然存在漏洞。该修复于 2025-11-27 作为无关重构的附带结果合并至 main(提交 000d5b5),但未反向移植。