
CVE-2026-45250: переполнение буфера ядра setcred в FreeBSD 14.4 (LPE)
Этот подкаталог содержит разбор уязвимости и рабочие эксплойты для переполнения буфера в стеке в setcred(2) в ядре FreeBSD 14.x.
Сама уязвимость полностью документирована в setcred.txt. Краткая версия: kern_setcred_copyin_supp_groups() использует sizeof(*groups), где groups — это gid_t **, из-за чего шаг составляет 8 байт вместо 4 для copyin() в массив фиксированного размера на стеке ядра. Переполнение достижимо до любой проверки привилегий и доступно любому непривилегированному пользователю.
В этом репозитории собраны два рабочих пути эксплуатации:
no-SMAP / no-SMEP — exp2_lpe_no_smap.c. Один
системный вызов setcred(2) переключает вызывающий поток на uid=0,
перенаправляя примитив цепочки по адресу amd64_syscall+0x155 в
шеллкод пользовательского пространства через поддельный
struct sysentvec.
SMAP / SMEP включены — exp_setcred_smap_zfs.c. Перенаправляет
выполнение на ZSTD_initCStream_advanced в zfs.ko, тело которой
записывает td_ucred = rcx+1. При rcx = K1 = parent_pargs - 1
(qword, размещённый в slab pargs дочернего процесса), указатель
на учётные данные вызывающего потока оказывается внутри slab pargs
родительского процесса, где размещена поддельная struct ucred
с cr_uid=0. Работает на любой системе FreeBSD 14.4 GENERIC
с загруженным zfs.ko (типичная серверная конфигурация) и не
требует примитива утечки информации из ядра.
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 (любой пользователь вызывает панику ядра) и полный LPE без SMAP/SMEP
воспроизводимы соответствующими программами в exploits/.
Полный LPE с включёнными SMAP/SMEP воспроизводим с помощью
exp_setcred_smap_zfs.c на любой системе FreeBSD 14.4 GENERIC с
загруженным zfs.ko. См. setcred.txt с описанием техники.
14.4-RELEASE / stable/14 остаются уязвимыми на дату отчёта. Исправление попало в main 2025-11-27 (коммит 000d5b5) как побочный эффект несвязанного рефакторинга и не было перенесено в стабильные ветки.