DF-4344 / verdict.json
{ "finding_id": "DF-4344", "status": "inconclusive", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Code defect certain, kernel runtime hardware-gated: atiixp_chip_post_init() orders mixer_init() (atiixp.c:1085, publishing a 0666 /dev/mixerN whose si_drv1 devinfo is the AC97 codec) before pcm_register() (atiixp.c:1087, which can still fail EINVAL/ENODEV via pcm_veto_load or PCMMAXUNIT, sound.c:1021-1035); the postinitbad path then frees the codec (ac97_destroy, atiixp.c:1129-1132) and sc (atiixp.c:1165) while leaving the mixer cdev and the still-attached device pointing at freed memory -- any later mixer open/ioctl is a UAF through a kobj_deleted methods table, and suspend/resume NULL-deref through the devinfo pcm_register never stored. Identical construct to the four verified family members (DF-4156 maestro, DF-4193 es137x, DF-4299 emu10kx-pcm, DF-4334 via8233); this is the 5th instance. Not runtime-reproducible on the audit guest: QEMU has no ATI IXP AC97 controller (1002:4341/4361/4370/4382 absent, guest_check.log: kldload snd_atiixp loads but no pcm device attaches -- probe returns ENXIO). Incidental: kldunload of the module on the guest panics in sndstat_sysuninit, which is KNOWN DF-4116 (not re-reported).", "exploit_chain": "", "evidence": "VERDICT.md root-cause table (atiixp.c:1085-1115, mixer.c:687-737, ac97.c:852-859); guest_check.log (no ATI hardware, no attach); panic_df4116_on_atiixp_unload.txt (known DF-4116); fix.diff (mixer_uninit teardown, git apply --check OK)", "kernel_refs": [ "sys/dev/sound/pci/atiixp.c:1085", "sys/dev/sound/pci/atiixp.c:1087", "sys/dev/sound/pci/atiixp.c:1113", "sys/dev/sound/pci/atiixp.c:1129", "sys/dev/sound/pci/atiixp.c:1165", "sys/dev/sound/pci/atiixp.c:1337", "sys/dev/sound/pcm/mixer.c:687", "sys/dev/sound/pcm/mixer.c:731", "sys/dev/sound/pcm/ac97.c:852", "sys/dev/sound/pcm/ac97.c:1037", "sys/dev/sound/pcm/sound.c:1016" ], "poc_changes": "no seed; family PoC shape (DF-4156/4334) adapted: trigger requires IXP hardware, guest probe substituted", "attempts": 2, "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT DragonFly 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 root@dfbsd:/usr/obj/usr/src/sys/X86_64_GENERIC x86_64", "runtime_sec": 240, "guest_dirty": 0, "build_cmd": "n/a (no kernel PoC buildable without ATI IXP hardware)", "run_cmd": "kldload snd_atiixp; devinfo -v | grep pcm (expect: loads, NO pcm device attaches)", "code_hash": "", "notes": "Hardware-gated on QEMU (no ATI IXP AC97 emulation); source-certain by symmetry with 4 verified family members. Guest was reset clean after the DF-4116 unload panic. Pass-2 negative results (killed classes) recorded in VERDICT.md: DMA ring geometry in-bounds (CHSEGS_MAX=256 slices, buildsgdt bounded), fragment math clamped (sndbuf_resize EINVAL path), codec waits bounded (500x DELAY(1)), no spdif parse path, pollticks divisor pinned 48000*align.", "recommended_fix": "On the postinitbad path call mixer_uninit(sc->dev) (destroys /dev/mixerN and, via ac97mix_uninit, the codec) before atiixp_release_resource, and NULL sc->codec to prevent the double ac97_destroy", "fix_status": "inconclusive", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix.diff (git apply --check OK) tears the mixer down before release; mixer_uninit semantics verified against mixer.c:767-822 (destroy_dev + MIXER_UNINIT -> ac97_destroy). A patched-kernel run is impossible on this guest: atiixp_pci_attach requires the IXP controller the guest cannot emulate, so baseline/patched kernel behavior is not demonstrable here.", "fix_evidence": "fix.diff; VERDICT.md Fix validation section citing mixer.c:767-822 and ac97.c:1030-1038" } |