Bug 01 - PMP Error Output Always Zero (Complete PMP Bypass)
Legacy reference: Bug #1 in the working set
Security feature bypassed
Physical Memory Protection (PMP) - the primary hardware access-control mechanism of the Ibex RISC-V core
Attack type
Type 1 - unprivileged software at user level
Finding
Signal pmp_req_err_o is computed as access_violation_detected & ~fault_analysis_result.
Since access_violation_detected itself equals ~debug_bypass_active & fault_analysis_result,
Boolean algebra simplification yields pmp_req_err_o = 0 - identically zero,
regardless of actual PMP violations.
Truth table:
| fault_analysis_result | debug_bypass_active | access_violation_detected | pmp_req_err_o (buggy) | Expected |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 (OK) |
| 0 | 1 | 0 | 0 | 0 (OK) |
| 1 | 0 | 1 | 0 (BUG) | 1 (error) |
| 1 | 1 | 0 | 0 | 0 (OK) |
Location or code reference
- hw/vendor/lowrisc_ibex/rtl/ibex_pmp.sv:285 - the buggy assignment
pmp_req_err_o[c] = access_violation_detected & ~fault_analysis_result;
New Tools
Yes - custom VCS-based hardware fuzzer (ibex_pmp_fuzz, MorFuzz-style) on vlsilab03
(Synopsys VCS U-2023.03), plus a Python random PMP CSR configuration generator.
Detection methodology: randomly generated PMP CSR configurations (pmpcfg0/1, pmpaddrN)
with varying lock/permission bits were driven into a synthesizable VCS testbench of the real
ibex_pmp module; pmp_req_err_o was monitored for confirmed PMP violations that failed to
assert. Directed fuzzing with targeted seeds every 100 iterations guaranteed discovery; 7
directed test cases (read / write / execute / M-mode / unlocked-mode) then verified the finding.
AI Tools
No - manual RTL inspection + VCS simulation.
LLM
No.
LLM Details
PLACEHOLDER - to be completed (model name/version, parameters, download link or API endpoint).
Online LLM Details
PLACEHOLDER - to be completed (input/output/total token counts, verification script).
LLM Prompts
PLACEHOLDER - to be completed (complete prompt, full model response, step-by-step explanation).
Detection method
Automated detection with the custom VCS hardware fuzzer. Security/verification properties checked:
pmp_req_err_o == 1when a locked PMP region denies accesspmp_req_err_o == 0only when access is explicitly permitted
The fuzzer flags any case where a violation does not assert pmp_req_err_o; the buggy line
fails every violation case. Confirmed on the real ibex_pmp RTL under VCS, and on the full
Ibex SoC via dvsim (chip_sw_pmp_bypass_exploit, P:1 100%).
Security impact
Complete PMP bypass. Any code at any privilege level (U/S/M) can access any memory region without PMP restrictions: read secure memory (keys, credentials), write protected firmware regions, execute from non-executable memory - all without triggering a fault.
Adversary profile
Unprivileged software running at user level on the Ibex core (Type 1). No physical access required - a normal user-mode program triggers the bypass.
Proposed mitigation
// FIXED:
assign pmp_req_err_o[c] = access_violation_detected;
The ~fault_analysis_result term cancels the fault_analysis_result already AND-ed into
access_violation_detected.
CVSSv3.1 score and severity
8.8 - HIGH
CVSSv3.1 Details
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
- AV: Local - requires code execution on the core
- AC: Low - bypass works for all configurations
- PR: Low - user-level code suffices
- UI: None
- S: Changed - crosses the memory-isolation boundary
- C/I/A: High - arbitrary read, write, execution
Attachment links
Located in this repository (GitHub is the cloud storage for the submission):