# Unverified injected data halts validation

Injected proposals, deposits or vote extensions skip checks that the validating path later enforces

_Area: Smart contract access control and control flow. Seen in 3 disclosed reports; latest 2025-07-21. Updated 2026-10-23._

## How it works
A node puts data into a block (a proposer-built proposal, batched deposits, vote extensions) under a weaker rule than the one applied when the block is later validated. The two rules disagree, so data the injector accepted is rejected downstream. In consensus code this is fatal: honest nodes diverge or block production stops. The broken assumption is that what a node injects will pass what it validates. That only holds if both paths enforce the same rule. A related shape is no check at all on the injector side, so arbitrary bytes enter the block [E3](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-10.md).

## Where it shows up
- Proposer path (PrepareProposal) and validator path (ProcessProposal) applying different checks to the same bytes [E2](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-1.md).
- Batch optimizations where a gate (e.g. signature validity) wraps items the spec processes unconditionally [E1](https://bugbountylibrary.com/r/cantina%3Aethereum_pectra_prysm%3A3.1.1.md).
- `NoOpMempool` or similar config that silently disables tx verification at the consensus layer [E3](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-10.md).
- Vote extensions from late precommits that bypass the extension-verification handler [E2](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-1.md).
- Any performance shortcut that re-implements spec logic.

## How to review
Trace each item from injection to validation and confirm the same predicate is applied on both sides. The invariant: every byte a node puts into a block must satisfy exactly the checks the validating path enforces. For batches, confirm the gate applies only to items the spec gates; items the spec processes unconditionally must not be dropped by a batch-level check [E1](https://bugbountylibrary.com/r/cantina%3Aethereum_pectra_prysm%3A3.1.1.md). For ABCI++ handlers, diff what PrepareProposal injects against what ProcessProposal rejects, field by field: vote extensions, commit signatures, tx bytes [E2](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-1.md). Confirm production config does not use NoOpMempool [E3](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-10.md).

## Variants seen
- Batch signature gate wrongly applied to an already-registered validator's deposit, diverging from spec [E1](https://bugbountylibrary.com/r/cantina%3Aethereum_pectra_prysm%3A3.1.1.md).
- Proposer injects unvalidated late vote extensions that ProcessProposal then rejects [E2](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-1.md).
- No-op mempool lets a proposer pack invalid txs, bloating the block store [E3](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-10.md).

## Impact and severity
High: chain split [E1](https://bugbountylibrary.com/r/cantina%3Aethereum_pectra_prysm%3A3.1.1.md), single-validator chain halt [E2](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-1.md), permanent block-store bloat [E3](https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-10.md). Severity rises when one actor (a proposer or validator) can trigger it, and when the divergence is silent rather than a clean rejection.

## Evidence
- E1: https://bugbountylibrary.com/r/cantina%3Aethereum_pectra_prysm%3A3.1.1.md
- E2: https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-1.md
- E3: https://bugbountylibrary.com/r/sherlock%3A2024-12-seda-protocol%3AH-10.md
