Bug 293890 - Fatal trap NUM: page fault while in kernel mode in cam_periph_runccb
Summary: Fatal trap NUM: page fault while in kernel mode in cam_periph_runccb
Status: In Progress
Alias: None
Product: Base System
Classification: Unclassified
Component: kern (show other bugs)
Version: 15.0-RELEASE
Hardware: arm64 Any
: --- Affects Some People
Assignee: Warner Losh
URL:
Keywords: cam, crash
Depends on:
Blocks:
 
Reported: 2026-03-18 07:55 UTC by Jiaming Zhang
Modified: 2026-04-26 11:38 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jiaming Zhang 2026-03-18 07:55:43 UTC
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
```
Comment 1 commit-hook freebsd_committer freebsd_triage 2026-04-24 18:38:59 UTC
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(-)