#43110 [BC-Critical] Validator can DoS the DA Layer by requesting a big range of blobs

Submitted on Apr 2nd 2025 at 06:55:27 UTC by @br0nz3p1ck4x3 for Attackathon | Movement Labs

  • Report ID: #43110

  • Report Type: Blockchain/DLT

  • Report severity: Critical

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

  • Impacts:

    • Increasing network processing node resource consumption by at least 30% without brute force actions, compared to the preceding 24 hours

Description

Description

Inside passthrough::stream_read_from_height(), the validator makes a request to the DA layer to stream blobs to the validator. This is the relevant line of code:

			let mut blob_stream = da.stream_da_blobs_from_height(height).await.map_err(|e| tonic::Status::internal(e.to_string()))?;

The issue here is that the validator can specify height as 1, which will lead to the DA layer wasting their resources doing lookups in their local DB from height = 1 until current_block. Moreover, after these lookups, these have to be returned to the Validator whom made this request. As such, this simple call will DoS the DA Layer.

Impact

This simple call will permanently waste the resources of the DA layer. Without access to the DA layer, the Validator will not be able to progress and thus, the network will be stalled.

On the DA Layer level, constrain the range of blob height that can be streamed.

Proof of Concept

Proof of Concept

The PoC is very straight-forward. We will start by defining a few variables. Let:

  • current_block = 184239

  • height = 1

Step one: The malicious validator makes a call to stream_read_from_height(), using the height variable as defined above.

Step two: The honest DA layer operator will try to lookup and return the blobs between height <-> current_block, which spans over 184238 blocks.

Step three: The hoenst DA layer will not be able to process this and thus, the network will stall.

Was this helpful?