#42941 [BC-Critical] [Critical] Network-Wide Denial of Service Through Unrecoverable Block Execution Failures
Submitted on Mar 29th 2025 at 20:04:49 UTC by @hulkvision for Attackathon | Movement Labs
Report ID: #42941
Report Type: Blockchain/DLT
Report severity: Critical
Target: https://github.com/immunefi-team/attackathon-movement/tree/main/networks/movement/movement-full-node
Impacts:
Network not being able to confirm new transactions (total network shutdown)
Description
Brief/Intro
A critical vulnerability exists in the Movement Full Node block execution logic that allows an attacker to permanently halt the entire blockchain network by crafting malicious transactions. Once triggered, nodes cannot progress past the malicious block.
Vulnerability Details
The vulnerability exists in the execute_block_with_retries function in the Movement Full Node's block execution pipeline. When a block fails to execute due to an error, the code attempts to retry execution several times with incrementally adjusted timestamps:
In networks/movement/movement-full-node/src/node/tasks/execute_settle.rs
async fn execute_block_with_retries(
&mut self,
block: Block,
mut block_timestamp: u64,
) -> anyhow::Result<BlockCommitment> {
for _ in 0..self.execution_extension.block_retry_count {
match self.execute_block(block.clone(), block_timestamp).await {
Ok(commitment) => return Ok(commitment),
Err(e) => {
info!("Failed to execute block: {:?}. Retrying", e);
block_timestamp += self.execution_extension.block_retry_increment_microseconds;
}
}
}
anyhow::bail!("Failed to execute block after 5 retries")
}Here in Line 236 if a malformed transaction is sent, the deserialization will fail causing an error, which is not handled properly causing block execution to halt. There could be several other potential failure points in the block execution process beyond just deserialization errors, deserialization error is one of them.
The core issue is that after 5 unsuccessful retry attempts, the function simply returns an error. When this error propagates to process_block_from_da, the function fails. The vulnerability occurs because process_block_from_da has no mechanism to:
Skip persistently failing blocks
Continue processing subsequent blocks
Record and handle unprocessable blocks appropriately
Once a node encounters a malicious block that consistently fails execution, it becomes permanently stuck, unable to advance to subsequent blocks in the blockchain.
Impact Details
No new transactions can be processed
Recovery requires code modification and network restart
All user assets on the chain become inaccessible during the outage
References
https://github.com/immunefi-team/attackathon-movement/blob/a2790c6ac17b7cf02a69aea172c2b38d2be8ce00/networks/movement/movement-full-node/src/node/tasks/execute_settle.rs#L150-L188 https://github.com/immunefi-team/attackathon-movement/blob/a2790c6ac17b7cf02a69aea172c2b38d2be8ce00/networks/movement/movement-full-node/src/node/tasks/execute_settle.rs#L236
Proof of Concept
Proof of Concept
setup movement full node by following the steps given in docs
Install these packages
create a folder named
protos, inside it create a file with namemovement_da_light_node.proto
compile the proto file with following command
run this python script
try sending a transaction you will see it will fail, or go see movement-full-node logs, you can see that it has crashed and further process of transaction is stopped.
Was this helpful?