DragonFlyBSD Kernel Audit
DF-2453 / run.log
← back to finding ↓ download raw
[*] DF-2453 dm_target_flakey UAF in async read io path
[*] racing 8 readers against remove/recreate for 200 iterations
[*] iteration 0/200 (0 successful teardowns)
[*] iteration 50/200 (0 successful teardowns)
[*] iteration 100/200 (0 successful teardowns)
[*] iteration 150/200 (0 successful teardowns)

[*] Completed 200 iterations (0 teardowns succeeded).
[*] Race outcome: the UAF in _flakey_read_iodone dereferences
    freed tfc (stored in bio_caller_info1 with no refcount).
    On GENERIC with INVARIANTS, freed memory is poisoned with
    0xdeadc0de; the poisoned values at corrupt_buf_byte /
    drop_writes offsets skip both branches in iodone, making
    the UAF read SILENT (no crash).
[*] The bug IS real (code-confirmed): _flakey_read stores tfc
    in bio_caller_info1.ptr with NO refcount. A concurrent table
    destroy (dm_target_flakey_destroy -> kfree(tfc)) while async
    I/O is in flight produces a use-after-free at
    tfc->corrupt_buf_byte etc. in _flakey_read_iodone.
[*] Impact: latent UAF; hard to crash deterministically because
    read() is synchronous (iodone fires before read returns) and
    INVARIANTS poisoning makes freed-memory reads benign.
RUN_EXIT=0
(no panic, guest survives)