
CVE-2026-45250: FreeBSD 14.4 setcred カーネルバッファオーバーフロー (LPE)
このサブディレクトリには、FreeBSD 14.x カーネルにおける setcred(2)
スタックバッファオーバーフローの解説記事と動作するエクスプロイトをまとめています。
脆弱性自体の詳細は setcred.txt に完全に記載されています。要旨は次のとおりです。
kern_setcred_copyin_supp_groups() は、groups が gid_t ** であるにも
かかわらず sizeof(*groups) を使用しているため、固定サイズのカーネルスタック配列への
copyin() で 4 バイトではなく 8 バイトのストライドが生成されます。このオーバーフローは、
権限チェックより前に、非特権ユーザーであれば誰でも到達可能です。
このリポジトリには、動作する2つのエクスプロイト経路を収録しています。
no-SMAP / no-SMEP — exp2_lpe_no_smap.c。偽の struct sysentvec を
介して amd64_syscall+0x155 のチェーンプリミティブをユーザー空間シェルコードへ
リダイレクトすることで、単一の setcred(2) システムコールが呼び出しスレッドを
uid=0 に切り替えます。
SMAP / SMEP 有効 — exp_setcred_smap_zfs.c。ハイジャック先は zfs.ko
内の ZSTD_initCStream_advanced で、その本体は td_ucred = rcx+1 を
書き込みます。rcx = K1 = parent_pargs - 1(子プロセスの pargs スラブに
埋め込んだ qword)とすることで、呼び出しスレッドの資格情報ポインタは親の pargs
スラブ内に収まり、そこには cr_uid=0 を持つ偽の struct ucred を埋め込んで
います。zfs.ko がロードされた(一般的なサーバー構成)任意の FreeBSD 14.4
GENERIC システムで動作し、カーネルの情報漏洩(info-leak)プリミティブは不要です。
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 は、zfs.ko がロードされた任意の
FreeBSD 14.4 GENERIC システム上で exp_setcred_smap_zfs.c により再現可能です。
手法の詳細は setcred.txt を参照してください。
報告日時点で 14.4-RELEASE / stable/14 は脆弱なままです。修正は 2025-11-27 に 無関係のリファクタリングの副次的な結果として main に取り込まれました(コミット 000d5b5)が、バックポートされていません。