75485 bc critical unbounded snappy decompression in gossipsub message id fn causes per message memory spike of 428 mib before validation
Description
Brief/Intro
Vulnerability Details
fn compute_message_id(msg: &Message) -> MessageId {
let mut decoder = Decoder::new();
let id = decoder.decompress_vec(&msg.data).map_or_else(
|_| {
let domain_invalid_snappy: Vec<u8> = vec![0x0, 0x0, 0x0, 0x0];
sha256([domain_invalid_snappy.as_slice(), msg.data.as_slice()].concat().as_slice())
[..20].to_vec()
},
|data| {
let domain_valid_snappy: Vec<u8> = vec![0x1, 0x0, 0x0, 0x0];
sha256([domain_valid_snappy.as_slice(), data.as_slice()].concat().as_slice())[..20]
.to_vec()
},
);
MessageId(id)
}Two unbounded allocations per call
Why MAX_GOSSIP_SIZE doesn't help
Regression from op-node
Impact Details
Recommended fixes
Proof of Concept
POC 1 — wire-format primitive
POC 2 — production code path
Reproducing
Previous74913 bc medium unbounded snappy decompression in libp2p gossip handling enables amplification class resource exhaustion of base consensus follower fleetNext76368 bc low challenger awaitingproof phase has no timeout
Was this helpful?