Hi FreeBSD maintainers, When fuzzing freebsd kernel with syzkaller and our generated syscall descriptions, an issue is discovered in the cam subsystem. This issue is reproducible on the latest release (release/15.0.0-p4, commit 8ef0ed690df2dca0cc22b827819d112f868470bb). The kernel console output, kernel config, and C/syz reproducers can be found at https://drive.google.com/drive/folders/1aqIT9ry9Lk-OhHJL5daUA35hHnk9q3_S?usp=drive_link. The issue report is also listed below (symbolized by our modified syz-symbolize) to assist with the analysis: ``` TITLE: Fatal trap NUM: page fault while in kernel mode in cam_periph_runccb CORRUPTED: false () SUPPRESSED: false MAINTAINERS (TO): [] MAINTAINERS (CC): [] Fatal trap 12: page fault while in kernel mode cpuid = 1; apic id = 01 fault virtual address = 0x50 fault code = supervisor read data, page not present instruction pointer = 0x20:0xffffffff80392a6f stack pointer = 0x28:0xfffffe00ec1352b0 frame pointer = 0x28:0xfffffe00ec135310 code segment = base rx0, limit 0xfffff, type 0x1b = DPL 0, pres 1, long 1, def32 0, gran 1 processor eflags = interrupt enabled, resume, IOPL = 0 current process = 1479 (repro.out) rdi: 0000000000000050 rsi: ffffffff82e093d0 rdx: 0000000000000000 rcx: fffffe00175ef388 r8: 0000000000000000 r9: 0000000000000001 rax: fffffe0000000000 rbx: 0000000000000900 rbp: fffffe00ec135310 r10: fffffe00ef2f00c8 r11: 000000000000009b r12: 0000000000000050 r13: fffffe00ef2f0000 r14: fffffe00ecfc37e0 r15: 0000000000000000 trap number = 12 panic: page fault cpuid = 1 time = 1773819883 KDB: stack backtrace: #0 0xffffffff81608a59 at kdb_backtrace+0x119 /usr/obj/usr/src/kern/subr_kdb.c:452 #1 0xffffffff81537d67 at vpanic+0x257 /usr/obj/usr/src/kern/kern_shutdown.c:960 #2 0xffffffff81537b05 at panic+0xb5 /usr/obj/usr/src/kern/kern_shutdown.c:887 #3 0xffffffff820f7cd2 at trap_pfault+0xaf2 /usr/obj/usr/src/amd64/amd64/trap.c:851 #4 0xffffffff820f61de at trap+0x78e /usr/obj/usr/src/amd64/amd64/trap.c:0 #5 0xffffffff8209f6b8 at calltrap+0x8 /usr/obj/usr/src/amd64/amd64/exception.S:287 #6 0xffffffff80389f28 at cam_periph_runccb+0x2b8 /usr/obj/usr/src/cam/cam_periph.c:0 #7 0xffffffff8040f159 at passsendccb+0x339 /usr/obj/usr/src/cam/scsi/scsi_pass.c:0 #8 0xffffffff8040dfa5 at passdoioctl+0x615 /usr/obj/usr/src/cam/scsi/scsi_pass.c:1830 #9 0xffffffff8040d243 at passioctl+0x33 /usr/obj/usr/src/cam/scsi/scsi_pass.c:1750 #10 0xffffffff811cb236 at devfs_ioctl+0x266 /usr/obj/usr/src/fs/devfs/devfs_vnops.c:0 #11 0xffffffff822b9ad7 at VOP_IOCTL_APV+0x87 /usr/obj/usr/src/amd64.amd64/sys/CLOUD/vnode_if.c:1154 #12 0xffffffff817bd187 at vn_ioctl+0x3c7 /usr/obj/usr/src/amd64.amd64/sys/CLOUD/vnode_if.h:639 #13 0xffffffff811cc0f9 at devfs_ioctl_f+0x69 /usr/obj/usr/src/fs/devfs/devfs_vnops.c:881 #14 0xffffffff81666cfa at kern_ioctl+0x4ca /usr/obj/usr/src/sys/file.h:378 #15 0xffffffff8166673e at sys_ioctl+0x36e /usr/obj/usr/src/kern/sys_generic.c:716 #16 0xffffffff820f9372 at amd64_syscall+0x4e2 /usr/obj/usr/src/kern/subr_syscall.c:193 #17 0xffffffff8209ffab at fast_syscall_common+0xf8 /usr/obj/usr/src/amd64/amd64/exception.S:571 Uptime: 1m36s Automatic reboot in 15 seconds - press a key on the console to abort Rebooting... cpu_reset: Restarting BSP cpu_reset_proxy: Stopped CPU 1 TITLE: panic: page fault CORRUPTED: false () SUPPRESSED: false MAINTAINERS (TO): [] MAINTAINERS (CC): [] panic: page fault cpuid = 1 time = 1773819883 KDB: stack backtrace: #0 0xffffffff81608a59 at kdb_backtrace+0x119 /usr/obj/usr/src/kern/subr_kdb.c:452 #1 0xffffffff81537d67 at vpanic+0x257 /usr/obj/usr/src/kern/kern_shutdown.c:960 #2 0xffffffff81537b05 at panic+0xb5 /usr/obj/usr/src/kern/kern_shutdown.c:887 #3 0xffffffff820f7cd2 at trap_pfault+0xaf2 /usr/obj/usr/src/amd64/amd64/trap.c:851 #4 0xffffffff820f61de at trap+0x78e /usr/obj/usr/src/amd64/amd64/trap.c:0 #5 0xffffffff8209f6b8 at calltrap+0x8 /usr/obj/usr/src/amd64/amd64/exception.S:287 #6 0xffffffff80389f28 at cam_periph_runccb+0x2b8 /usr/obj/usr/src/cam/cam_periph.c:0 #7 0xffffffff8040f159 at passsendccb+0x339 /usr/obj/usr/src/cam/scsi/scsi_pass.c:0 #8 0xffffffff8040dfa5 at passdoioctl+0x615 /usr/obj/usr/src/cam/scsi/scsi_pass.c:1830 #9 0xffffffff8040d243 at passioctl+0x33 /usr/obj/usr/src/cam/scsi/scsi_pass.c:1750 #10 0xffffffff811cb236 at devfs_ioctl+0x266 /usr/obj/usr/src/fs/devfs/devfs_vnops.c:0 #11 0xffffffff822b9ad7 at VOP_IOCTL_APV+0x87 /usr/obj/usr/src/amd64.amd64/sys/CLOUD/vnode_if.c:1154 #12 0xffffffff817bd187 at vn_ioctl+0x3c7 /usr/obj/usr/src/amd64.amd64/sys/CLOUD/vnode_if.h:639 #13 0xffffffff811cc0f9 at devfs_ioctl_f+0x69 /usr/obj/usr/src/fs/devfs/devfs_vnops.c:881 #14 0xffffffff81666cfa at kern_ioctl+0x4ca /usr/obj/usr/src/sys/file.h:378 #15 0xffffffff8166673e at sys_ioctl+0x36e /usr/obj/usr/src/kern/sys_generic.c:716 #16 0xffffffff820f9372 at amd64_syscall+0x4e2 /usr/obj/usr/src/kern/subr_syscall.c:193 #17 0xffffffff8209ffab at fast_syscall_common+0xf8 /usr/obj/usr/src/amd64/amd64/exception.S:571 Uptime: 1m36s Automatic reboot in 15 seconds - press a key on the console to abort Rebooting... cpu_reset: Restarting BSP cpu_reset_proxy: Stopped CPU 1 ```
A commit in branch main references this bug: URL: https://cgit.FreeBSD.org/src/commit/?id=e1cff854997884ed9b7251d409d9c9c7a025606d commit e1cff854997884ed9b7251d409d9c9c7a025606d Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2026-04-24 18:29:53 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2026-04-24 18:31:55 +0000 pass(4): Allowlist CCB func_codes to harden passthrough ioctls The pass(4) driver's CAMIOCOMMAND and CAMIOQUEUE ioctls accept arbitrary CCBs from userland. This device requires root to open, and thus send these commands. Previously, the only func_code filter was a blocklist check against the XPT_FC_XPT_ONLY flag. This missed several dangerous func_codes that lack that flag: - XPT_ABORT: the abort_ccb field is a raw kernel pointer from the user CCB payload. xpt_action_default() dereferences it without validation, leading to kernel crashes or worse. - XPT_SASYNC_CB: the callback and callback_arg fields come directly from the user CCB payload and get registered as a kernel async callback, allowing arbitrary kernel code execution. - Target mode CCBs (XPT_EN_LUN, XPT_TARGET_IO, etc.) fall through directly to the SIM with user-controlled payloads. Replace the XPT_FC_XPT_ONLY blocklist with an explicit allowlist of CCB function codes that are known to be safe for userland to submit: I/O operations (SCSI, ATA, NVMe, SMP, MMC), device queries, transport settings, and a handful of safe control operations (NOOP, REL_SIMQ, RESET_DEV, DEBUG). Normally, the /dev/pass* permissions only allow root to access them, so this is only a safety issue by default. Also reject CAM_DATA_PADDR and CAM_DATA_SG_PADDR, since these pass user-supplied physical addresses directly to DMA with no validation, which on systems without an IOMMU allows arbitrary host memory access. Add `options PASS_UNSAFE_PADDR` to allow the old behavior. Verified that camdd, camcontrol, smartmontools, and cdrtools use only func_codes on the allowlist (XPT_SCSI_IO, XPT_ATA_IO, XPT_NVME_IO, XPT_NVME_ADMIN, XPT_PATH_INQ, XPT_GDEV_TYPE, XPT_GET_TRAN_SETTINGS, XPT_SET_TRAN_SETTINGS, XPT_RESET_DEV, XPT_DEBUG) and none use CAM_DATA_PADDR. PR: 293888, 293890 Assisted-By: Claude Opus 4.6 (1M context) Sponsored by: Netflix Reviewed by: jhb Differential Revision: https://reviews.freebsd.org/D56486 sys/cam/scsi/scsi_pass.c | 90 ++++++++++++++++++++++++++++++++++++++++++------ sys/conf/options | 3 ++ sys/modules/cam/Makefile | 1 + 3 files changed, 84 insertions(+), 10 deletions(-)