Summary
verify_block_proof in crates/store/src/state/apply_proof.rs only deserializes the proof bytes it never performs cryptographic verification. Any byte sequence that parses as a valid BlockProof struct is accepted and written to disk.
Code
// crates/store/src/state/apply_proof.rs
fn verify_block_proof(_block_num: BlockNumber, proof_bytes: &[u8]) -> anyhow::Result<()> {
let _proof =
BlockProof::read_from_bytes(proof_bytes).context("failed to deserialize block proof")?;
// TODO: perform verification.
Ok(())
}
Impact
- This function is called from
apply_proof, which is used by both the sequencer's ProofScheduler and the full-node's ProofSync
- Unverified proofs are persisted to disk and broadcast to all replica subscribers via
proof_cache
- An attacker can submit a structurally valid but cryptographically invalid proof and it will be accepted
Expected behavior
The proof should be cryptographically verified before returning Ok(()).
Summary
verify_block_proofincrates/store/src/state/apply_proof.rsonly deserializes the proof bytes it never performs cryptographic verification. Any byte sequence that parses as a validBlockProofstruct is accepted and written to disk.Code
Impact
apply_proof, which is used by both the sequencer'sProofSchedulerand the full-node'sProofSyncproof_cacheExpected behavior
The proof should be cryptographically verified before returning
Ok(()).