Skip to content

Commit 54dfa97

Browse files
committed
Prevent verifier DoS via unchecked layer_proofs length and child_claims_by_instance bounds
1 parent 95deda4 commit 54dfa97

1 file changed

Lines changed: 21 additions & 0 deletions

File tree

crypto/stark/src/gkr.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1913,6 +1913,16 @@ pub fn gkr_verify_batch<E: IsField>(
19131913

19141914
let max_layers = *n_layers_by_instance.iter().max().unwrap();
19151915

1916+
if proof.layer_proofs.len() != max_layers {
1917+
return Err(GkrError::InvalidTree {
1918+
reason: format!(
1919+
"expected {} layer proofs but got {}",
1920+
max_layers,
1921+
proof.layer_proofs.len(),
1922+
),
1923+
});
1924+
}
1925+
19161926
// Track per-instance state
19171927
let mut n_claims: Vec<Option<FieldElement<E>>> = vec![None; n_instances];
19181928
let mut d_claims: Vec<Option<FieldElement<E>>> = vec![None; n_instances];
@@ -1963,6 +1973,17 @@ pub fn gkr_verify_batch<E: IsField>(
19631973

19641974
let round_polys = &layer_proof.sumcheck_proof.round_polys;
19651975

1976+
if layer_proof.child_claims_by_instance.len() < active_instances.len() {
1977+
return Err(GkrError::InvalidTree {
1978+
reason: format!(
1979+
"layer {}: child_claims_by_instance has {} entries but {} active instances",
1980+
layer_idx,
1981+
layer_proof.child_claims_by_instance.len(),
1982+
active_instances.len(),
1983+
),
1984+
});
1985+
}
1986+
19661987
if round_polys.is_empty() {
19671988
// Trivial layer: no sumcheck needed
19681989
// Append child claims and sample eta (same as prover)

0 commit comments

Comments
 (0)