Bug 07 - LC State Transition Validity Check Uses || Instead of && (Dual-Replica FI Countermeasure Defeated)
Security feature bypassed
Lifecycle Controller redundant state-transition validity check - the dual-replica fault-injection countermeasure
Finding
The transition-validity check combines two replicated lookups with || (OR) instead of
&& (AND):
// lc_ctrl_state_transition.sv:140-141
if (TransTokenIdxMatrix[dec_lc_state_i[0]][trans_target_i[0]] != InvalidTokenIdx ||
TransTokenIdxMatrix[dec_lc_state_i[1]][trans_target_i[1]] != InvalidTokenIdx) begin
The transition is authorized if either replica indicates validity. The dual-replica countermeasure requires both to agree - a single fault corrupting one replica suffices to authorize a forbidden transition. The module comment (lines 138-139) states the dual-replica intent; the operator contradicts it.
Location or code reference
- hw/ip/lc_ctrl/rtl/lc_ctrl_state_transition.sv:140-141 - replica lookups combined with
||instead of&&
The attack flow for this bug is linked in the Attachments section below.
New Tools
Yes - custom VCS (U-2023.03) redundancy-checker fuzzer: enumerated all pass/fail
combinations of the two replicas and verified that the OR gate allows single-replica bypass
while the AND gate requires both. Directed testbench on the real
lc_ctrl_state_transition.sv RTL confirms the behavior (bug-005-tb-lc-or-and.sv).
AI Tools
Yes
LLM
Yes
LLM Details
Deepseek V4 Pro (1.6T params) from OpenCode Go https://opencode.ai/zen/go/v1
Online LLM Details
Orchestrator session total: 81,873,919 in / 53,192 out tokens (the agentic session that ran the custom VCS hardware-fuzzing pipeline; session ses_0336e81c1ffeFjDc6DwfGq7k4y).
Per-bug token estimates are not available: the pipeline ran as a continuous fuzzing session (compile + simulation campaigns across the three bugs) rather than per-bug agentic runs, so the orchestrator total is the only recorded figure.
LLM Prompts
Step-by-step discovery and verification (source: Custom VCS hardware-fuzzing pipeline):
- The VCS redundancy-checker fuzzer enumerated all four dual-replica pass/fail combinations of the transition-validity lookup.
- It showed that the OR gate (
||) accepts a transition when only one replica reports valid, while the correct AND (&&) requires both. - Confirmed on the RTL:
tb_bug05_lc_or_vs_and.svfaults replica 1’s state decode and shows the||branch is entered (next_lc_state=LcStRma) while the module’s independent replica-consistency check still raisestrans_invalid_error=1(honest VCS log).
Evidence:
Agent/session transcript: session transcript line 363 (writes tb_bug05_lc_or_vs_and.sv).
Detection method
Agent-based RTL inspection (comment-vs-operator contradiction) + automated VCS redundancy fuzzing.
Honest scope (corrected): the || at lc_ctrl_state_transition.sv:140-141
is a real defect in the dual-replica TOKEN-MATRIX agreement check (correct
is &&), but this layer alone does NOT complete an unauthorized transition:
the module’s independent replica-consistency check still raises
trans_invalid_error=1 on a single corrupted replica (defense-in-depth).
End-to-end authorization is not claimed at this module.
Security property: a transition is valid only if both replicas agree; the fuzzer proved
every single-replica-corrupted case is wrongly accepted.
Security impact
A physical attacker with FI capability (laser, EM, voltage glitch) corrupts one replica’s decode path; a single-bit fault making a forbidden transition look valid in one replica passes the OR gate. Worst case: transition from a locked state to an unlocked state without the correct token.
Adversary profile
Type 2 - physical attacker with fault injection equipment (laser/EM/voltage glitch).
Proposed mitigation
if (TransTokenIdxMatrix[dec_lc_state_i[0]][trans_target_i[0]] != InvalidTokenIdx &&
TransTokenIdxMatrix[dec_lc_state_i[1]][trans_target_i[1]] != InvalidTokenIdx) begin
CVSSv3.1 score and severity
6.4 - MEDIUM
CVSSv3.1 Details
CVSS:3.1/AV:P/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
- AV: Physical - fault injection on the device
- AC: High - precise timing required for one-replica corruption
- PR: None
- S: Unchanged - within the LC domain
- C/I/A: High - unauthorized state transitions