⬢ DragonFlyBSD Kernel Audit
DF-5033 / manifest.json
← back to finding ↓ download raw
{
  "finding_id": "DF-5033",
  "title": "UAF/OOB-read race in amdgpu_bo_list_get(): DragonFly idr_find() is lockless while idr_grow() kfree()s the node array synchronously (Linux RCU-safe-idr assumption does not hold)",
  "verdict": "inconclusive",
  "impact": "none",
  "reproduced": false,
  "confidence": "certain",
  "reproduce": {
    "build": "sh build.sh",
    "run": "sh run.sh",
    "expected": "oracle (baseline) exits 1 with both V1 (preemption-in-window) and V2 (load-reorder) reporting reads of the freed idr_nodes[] array returning poisoned 0xDDDDDDDDDDDDDDDD as the data pointer handed to kref_get_unless_zero; oracle_fixed exits 0 with both variants clean; idr_race/idr_race_fixed complete 400 grow phases (1600 grow kfree events) with hits=0 (window is ~2 cycles; natural catch needs preemption in window or the reorder variant, which the oracle forces)"
  },
  "kernel_refs": [
    "sys/dev/drm/amd/amdgpu/amdgpu_bo_list.c:167",
    "sys/dev/drm/amd/amdgpu/amdgpu_bo_list.c:170",
    "sys/dev/drm/amd/amdgpu/amdgpu_bo_list.c:283",
    "sys/dev/drm/amd/amdgpu/amdgpu_cs.c:591",
    "sys/libkern/linux_idr.c:516",
    "sys/libkern/linux_idr.c:454",
    "sys/libkern/linux_idr.c:458",
    "sys/libkern/linux_idr.c:358",
    "sys/dev/drm/linux_rcu.c:187",
    "sys/dev/drm/amd/amdgpu/amdgpu_kms.c:1007"
  ],
  "artifacts": [
    "README.md", "VERDICT.md", "gen_core.py", "idr_test_core.c",
    "harness_prelude.h", "inc/sys/idr.h", "idr_race.c", "oracle.c",
    "build.sh", "run.sh", "build.log", "oracle_baseline.log",
    "oracle_fixed.log", "race_baseline.log", "race_fixed.log", "env.txt",
    "fix.diff", "verdict.json", "manifest.json"
  ]
}