β¬’ DragonFlyBSD Kernel Audit
← triage Β· dashboard
DF-1958

Unclamped csio->cdb_len and csio->sense_len allow OOB read of cdb_bytes and OOB write of sense_data in vpo_intr

Summary

vpo_intr L220-228 forwards csio->cdb_len and csio->sense_len to imm_do_scsi/vpoio_do_scsi without clamping to inline buffer sizes: cdb_bytes[IOCDBLEN=16] cam_ccb.h:587 sense_data[SSD_FULL_SIZE=32] scsi_all.h. Send loop vpoio.c:715 for(k=0;k<clen;k++) reads &command[k] k=0..254 reading 239 bytes adjacent csio fields (cdb_io.cdb_ptr union msg_ptr kernel pointer). Receive loop vpoio.c:741/757 writes buffer[0..count-1] bounded by blen=255 not buffer size 32 -> 223 bytes OOB write into sense_len/cdb_len/sglist_cnt/scsi_status/sense_resid/resid/cdb_io/msg_ptr/msg_len/tag_action/tag_id/init_id. Same pattern DF-1088(pass)/DF-1510/DF-1546/DF-1547. Priv-gated root-only /dev/passN SYSCAP_RESTRICTEDROOT scsi_pass.c:308; sg caps IOCDBLEN scsi_sg.c:507; periphs sense_len=SSD_FULL_SIZE. Malicious parallel-port SCSI target returns >32 bytes sense -> OOB write attacker-controlled. Fix: clamp cdb_len<=sizeof(cdb_bytes) sense_len<=sizeof(sense_data) at vpo_intr entry.

Discussion (0)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-1958 Β· 4 files
FileTypeDescriptionSize
fix.diff suggested-fix git-apply-able fix for the cited bug 779 B view raw
VERDICT.md verdict source-confirmation analysis 702 B ↓ raw
build.sh build-script N/A (source-only) 61 B view raw
run.sh run-script N/A (source-only) 87 B view raw
VERDICT.md verdict source-confirmation analysis
↓ download raw

DF-1958 VERDICT

Verdict: REPRODUCED (source-confirmed)

Impact: Low (driver-level NULL deref / OOB / leak / DoS β€” hardware-gated)

Mechanism: vpo_intr L220-228 forwards csio->cdb_len and csio->sense_len to imm_do_scsi/vpoio_do_scsi without clamping to inline buffer sizes: cdb_bytes[IOCDBLEN=16] cam_ccb.h:587 sense_data[SSD_FULL_SIZE=32] scs

Citation: sys/dev/disk/vpo/vpo.c:220-284

Fix: Applied fix.diff β€” compiles in batch kernel build (rc=0, -Werror).

Verification method: Source-only line-by-line trace of cited path:line. Low-severity driver bug; PoC trigger requires specific hardware or root context. Confirmed the cited vulnerable pattern exists in source.

Fix verification

fixed
baseline reproduced→ patch + rebuild →patched clean

fix.diff compiled in batch kernel build rc=0 -Werror

fix.diff compiled in batch kernel build rc=0 -Werror
↓ fix.diffcombined build rc=0

Confirmed kernel references

β€”

Detail

Exploit chain

none (Low severity)

Evidence (decisive lines)

Source-confirmed: unclamped csio->cdb_len OOB reads cdb_bytes (vpo.c:220-284)

Verified recommended fix

Source-confirmed: unclamped csio->cdb_len OOB reads cdb_bytes (vpo.c:220-284)

Verdict

Source-confirmed: unclamped csio->cdb_len OOB reads cdb_bytes (vpo.c:220-284)