Skip to content

[Security][tentative] Medium (correctness): Checkpoint Finalized Header Is Not Seeded Into Finalizer DB #236

Description

@evonide

Context

Summit checkpoint startup lets a node resume from checkpoint artifacts instead of replaying all prior history. The syncer needs the checkpoint block artifacts to continue block synchronization, and the finalizer needs the checkpoint epoch's finalized header as the predecessor for future epoch-boundary headers.

Claim

Checkpoint startup passes the checkpoint finalized_header only to the syncer and never seeds it into finalizer storage. The broken invariant is that a checkpoint-joined finalizer can have no persisted predecessor finalized header, causing boundary aux-data generation to fall back to genesis instead of the checkpoint header.

A node operator starts from checkpoint artifacts that include a finalized_header, then the checkpoint-joined proposer reaches an epoch boundary before that header is seeded into finalizer storage; aux-data generation reads an empty finalized-header DB, falls back to genesis, and emits boundary blocks linked to the wrong prior header.

Flow

The path requires startup from checkpoint artifacts that include finalized_header, followed by proposing or building an epoch-boundary block before the finalizer DB has the checkpoint header seeded through another path.

Impact

A checkpoint-joined node can build future epoch-boundary headers whose prev_epoch_header_hash points to genesis rather than the checkpoint epoch header. Because boundary header-link verification is also weak, such headers can be accepted and make post-checkpoint finalized-header chains diverge from continuously running nodes.

Root Cause

Checkpoint import hands the finalized-header artifact to the syncer but not to finalizer storage, and boundary aux-data generation treats a missing finalized header as a genesis fallback.

Code

Related Issues/PRs

Related issues cover adjacent checkpoint startup, import, restart, finalized-header export, and response sizing consistency gaps.

Fix

  • Seed the supplied checkpoint finalized header into the finalizer DB during checkpoint startup.
  • Require consistency between checkpoint state, last block, and finalized header before seeding.
  • Add an integration test that imports a checkpoint and verifies the next boundary header links to the checkpoint header.

Metadata

Metadata

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions