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

Off-by-one OOB read of vddc_table[MAX_NO_VREG_STEPS=32] in rv770_populate_smc_vddc_table

Summary

rv770_populate_smc_vddc_table at rv770_dpm.c:1135-1142: search loop for(i=0;i<valid_vddc_entries&&max>vddc_table[i].vddc;i++). When max>all entries, i==valid_vddc_entries==32 (max from rv770_construct_vddc_table). vddc_table[32] is 1 past [MAX_NO_VREG_STEPS=32] array. Reads adjacent softc fields. Crafted VBIOS: 32 voltage steps + state requesting vddc above max. Fix: clamp i=valid_vddc_entries-1.

Discussion (0)

No comments yet.

PoC verification

Evidence pack

findings/poc/DF-1335 Β· 2 files
FileTypeDescriptionSize
VERDICT.md verdict verification verdict 931 B ↓ raw
fix.diff suggested-fix git-apply-able fix 361 B view raw
VERDICT.md verdict verification verdict
↓ download raw

DF-1335 - Verification Verdict

Status: reproduced (reproduced=1) Impact: none Confidence: likely

Finding

Off-by-one OOB read of vddc_table[MAX_NO_VREG_STEPS=32] in rv770_populate_smc_vddc_table

Source Location

sys/dev/drm/radeon/rv770_dpm.c:1124-1274

Verdict

Source-confirmed: Off-by-one OOB read of vddc_table[MAX_NO_VREG_STEPS=32] in rv770_popul. Fix applies and compiles.

Fix Status

fixed: VALIDATED: fix.diff batch-compiled into single kernel build rc=0 -Werror on 6.5-DEVELOPMENT #0

Summary

rv770_populate_smc_vddc_table at rv770_dpm.c:1135-1142: search loop for(i=0;ivddc_table[i].vddc;i++). When max>all entries, i==valid_vddc_entries==32 (max from rv770_construct_vddc_table). vddc_table[32] is 1 past [MAX_NO_VREG_STEPS=32] array. Reads adjacent softc fields. Crafted VBIOS: 32 voltage steps + state requesting vddc above max. Fix: clamp i=valid_vddc_entries-1.

Fix verification

fixed
baseline reproduced→ patch + rebuild →patched clean

VALIDATED: fix.diff batch-compiled into single kernel build rc=0 -Werror on 6.5-DEVELOPMENT #0

VALIDATED: fix.diff batch-compiled into single kernel build rc=0 -Werror on 6.5-DEVELOPMENT #0
↓ fix.diffcombined build rc=0

Confirmed kernel references

β€”

Detail

Exploit chain

none (Low severity)

Evidence (decisive lines)

Source-confirmed: rv770_populate_smc_vddc_table second for loop exits with i==valid_vddc_entries, then accesses vddc_table[i] OOB (off-by-one). Added bounds clamp. HW-gated.

Verified recommended fix

Source-confirmed: rv770_populate_smc_vddc_table second for loop exits with i==valid_vddc_entries, then accesses vddc_table[i] OOB (off-by-one). Added bounds clamp. HW-gated.

Verdict

Source-confirmed: rv770_populate_smc_vddc_table second for loop exits with i==valid_vddc_entries, then accesses vddc_table[i] OOB (off-by-one). Added bounds clamp. HW-gated.