DF-3864 / verdict.json
{ "finding_id": "DF-3864", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Source-certain NULL dereference on a reachable error path: vm->root.base.bo is published only by amdgpu_vm_bo_base_init (amdgpu_vm.c:3107), but error_unreserve (:3136-3137) already does amdgpu_bo_unreserve(vm->root.base.bo) == unreserve(NULL) -> ttm_bo_unreserve(&NULL->tbo) (amdgpu_object.h:165-168) and error_free_root (:3139-3140) computes &vm->root.base.bo->shadow with base.bo==NULL (small constant address) which amdgpu_bo_unref then loads (amdgpu_object.c:817-825). Reached whenever amdgpu_bo_reserve (:3097) or amdgpu_vm_clear_bo (:3101) fails in amdgpu_vm_init, which runs on EVERY DRM open (amdgpu_kms.c:990); clear_bo draws an IB from the bounded shared pool (amdgpu_ib.c:279-287) and does TTM validation - exhaustible by unprivileged users under load -> unprivileged local kernel panic (DoS, Medium). Upstream v4.20 identical (verified). Guest: no AMD GPU, /dev/dri absent - trigger compiles (RC=0) and reports the gate (run.log): honest not_reproduced.", "exploit_chain": "", "evidence": "VERDICT.md (ordering proof: create 3093 -> reserve 3097 -> clear_bo 3101 -> base_init 3107 vs labels 3136/3139); build.log/run.log/env.txt", "kernel_refs": ["sys/dev/drm/amd/amdgpu/amdgpu_vm.c:3097", "sys/dev/drm/amd/amdgpu/amdgpu_vm.c:3101", "sys/dev/drm/amd/amdgpu/amdgpu_vm.c:3107", "sys/dev/drm/amd/amdgpu/amdgpu_vm.c:3136", "sys/dev/drm/amd/amdgpu/amdgpu_vm.c:3139", "sys/dev/drm/amd/amdgpu/amdgpu_kms.c:990"], "poc_changes": "authored from scratch", "attempts": 1, "guest_uname": "DragonFly dfbsd 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": 11, "guest_dirty": 0, "build_cmd": "cc -Wall -O2 -o vm_init_error_race vm_init_error_race.c -lpthread", "run_cmd": "./vm_init_error_race /dev/dri/renderD128", "code_hash": "b844592caeda0c9e7341ee4a92fb5d7e28cca56f98fea7119ba02a48d84685fe", "notes": "Panic-class bug; no escalation path (NULL-page kernel trap).", "recommended_fix": "Use the local root pointer on both error labels (amdgpu_bo_unreserve(root); amdgpu_bo_unref(&root->shadow); amdgpu_bo_unref(&root)) - fix.diff", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix.diff switches the error labels to the local root pointer which is valid on every path reaching them; git apply --check clean; not exercisable without AMD hardware", "fix_evidence": "findings/poc/DF-3864/fix.diff" } |