#42112 [BC-Critical] Using `blob.GetAll` instead of `blob.Get` for Celestia DA opens full nodes to fraudulent block attacks

Submitted on Mar 20th 2025 at 21:10:55 UTC by @usmannk for Attackathon | Movement Labs

  • Report ID: #42112

  • Report Type: Blockchain/DLT

  • Report severity: Critical

  • Target: https://github.com/immunefi-team/attackathon-movement/tree/main/protocol-units/da/movement/providers/celestia

  • Impacts:

    • Unintended permanent chain split requiring hard fork (network partition requiring hard fork)

    • Network not being able to confirm new transactions (total network shutdown)

Description

Brief/Intro

The Movement full node relies on the Celestia blob.GetAll function to retrieve DA blobs from a given height range. Because Celestia namespaces are not permissioned zones, an attacker can insert their own blocks into this range. They can then add blocks that were not sequenced by the sequencer or consume excess amounts of resources.

Vulnerability Details

Movement does not verify the veracity of blocks posted to Celestia. When executing a block from DA, a block metadata transaction is constructed for it: https://github.com/immunefi-team/attackathon-movement/blob/main/networks/movement/movement-full-node/src/node/tasks/execute_settle.rs#L233.

Then, the block is executed and the aptos executor adds this block as the parent block id for the future: https://github.com/immunefi-team/attackathon-movement/blob/main/protocol-units/execution/maptos/opt-executor/src/executor/execution.rs#L53

Impact Details

If an attacker adds many blocks to a single Celestia height or multiple heights, non-sequencer nodes will attempt to process these and could be forced to consume excess resources, falling behind the chain.

However, the primary impact is that the full nodes that consume these blocks will attempt to follow their chain. The sequencer node will go on without these blocks, causing a chain split between the sequencer and all other nodes.

To remedy this, only use the Get function from Celestia, providing commitment hashes that are drawn from the trusted sequencer.

Proof of Concept

Proof of Concept

The PoC for this is quite simple. An attacker need only add a blob to Celestia in the Movement namespace containing a valid empty block. The node will add in a metadata tx automatically when executing.

After this, full nodes following the Celestia DA will fork on their next Get call, straying from the sequencer state. They will not be able to recover as their chains have permanently split.

Was this helpful?