SUB001
LayerZero DVN Unsigned Commit
DVN executor commits verification without message-level signature — single DVN bypasses quorum.
MEDIUM COLD FRONT LayerZero · $15M ← SSAF
N6 Kill Chain
✓ Q1 Direct
PASS
✓ Q2 Contract
PASS
✓ Q3 Prod
PASS
✓ Q4 Material
PASS
✓ Q5 Novel
PASS
✓ Q6 Welical
PASS
VECTOR
BOWER
IMPACT
PoC
DETECT
FINDINGS
Attack Vector
DVN processes unsigned commits. _validateSignatures() skippable when DVN count=1.
Kill Chain
1Craft malicious cross-chain message.
2Submit via DVN without valid quorum signature.
3Destination chain processes unverified packet.
4Arbitrary message execution triggered.
Root Cause
_validateSignatures() skippable when DVN count=1. No quorum fallback enforced.
Impact CRITICAL
Cross-chain message forgery. Full bridge TVL at risk (~$500M+). Attacker triggers arbitrary lzReceive() on any destination chain.
Severity
CRITICAL — arbitrary execution on destination without valid attestation.
Proof of Concept
1Call DVN.assignJob() with crafted payload.
2Check _validateSignatures — if quorum skippable with DVN count=1.
3Submit PacketSent event via Endpoint.send().
4Observe destination lzReceive() fires without valid attestation.
Caveat
Full exploit requires DVN operator compromise or config misconfiguration — cannot prove without live testnet.
Detection Signals
Monitor DVN PacketVerified events without matching quorum signatures.
Alert if verifiedCount < requiredDVNs.
Track lzReceive() calls where origin packet hash doesn't match committed hash.
Findings
NP-SUB001-001 CRITICAL Single-DVN configs have no quorum fallback.
NP-SUB001-002 HIGH _validateSignatures bypassed if DVN array empty.
NP-SUB001-003 OPEN Timing between PacketSent and PacketVerified creates race window.
Sorry
Full exploit requires DVN operator compromise or config misconfiguration — cannot prove without live testnet.
BOWERBOUNTY · 6 STAGES
discovery (vuln surface)
placement (attack vector)
materials (PoC code)
lighting (CLO brief)
validation (programme match)
packaging (filed)
BOWER SCORE
50/100 · 5/6 stages complete
🍀 MEDIUM · N6 ALL PASS · PENDING CLO
γ₁ = 14.134725141734693