CVE-2024-32972
Executive Summary
CVE-2024-32972 is a high-severity denial-of-service (DoS) vulnerability in go-ethereum (geth), the primary Golang execution layer implementation of the Ethereum protocol. An unauthenticated, remote attacker can exploit this flaw by sending specially crafted p2p messages to a vulnerable node, causing it to consume excessive memory resources. This can lead to node instability, crashes, or complete unavailability, disrupting network participation and potentially impacting dependent services. The vulnerability affects all geth versions prior to 1.13.15. The fix is included in geth version 1.13.15 and onwards.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability affects the Go package github.com/ethereum/go-ethereum. Organizations using geth as part of their infrastructure must ensure they are not pulling vulnerable versions from package registries or building from source without applying the patch. The supply chain risk is moderate, as the vulnerable component is a core network client; a compromised or crashed node can lead to loss of consensus participation and financial losses for staking or transaction processing services.
CVSS Breakdown & Threat Level
- CVSS Score: 7.5 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
- Attack Vector (AV): Network – The attack is performed remotely over the network.
- Attack Complexity (AC): Low – No special conditions are required; the attack can be executed repeatedly.
- Privileges Required (PR): None – No authentication is needed.
- User Interaction (UI): None – The victim node does not need to perform any action.
- Scope (S): Unchanged – The vulnerability only affects the vulnerable component.
- Confidentiality (C): None – No data is exposed.
- Integrity (I): None – No data is modified.
- Availability (A): High – The vulnerability directly impacts node availability, leading to a denial of service.
Threat Level: High. The low attack complexity and lack of authentication make this an attractive target for attackers aiming to disrupt Ethereum network operations.
Deep Dive & Mechanics
The vulnerability resides in the p2p (peer-to-peer) message handling logic of geth. The Ethereum p2p protocol uses RLPx for encrypted transport and devp2p for sub-protocol messaging. When a node receives a message, it must decode and process it. The flaw is triggered by a specially crafted message that causes the decoder to allocate an excessive amount of memory.
Root Cause: The issue is likely in the message size validation or memory allocation during the decoding of certain p2p message types. An attacker can send a message with a malformed length field or nested structure that forces the node to allocate memory proportional to the attacker-controlled data, leading to memory exhaustion.
Attack Flow:
- Attacker identifies a geth node (version < 1.13.15) with an open p2p port (default 30303).
- Attacker establishes a TCP connection and performs the RLPx handshake.
- Attacker sends a specially crafted devp2p message (e.g., a
Disconnect,Ping,Pong, orFindNodemessage with manipulated payload). - The vulnerable node begins decoding the message, allocating memory based on the crafted data.
- Memory consumption spikes, potentially causing the node to crash (OOM) or become unresponsive.
Vulnerable vs. Patched Code
The exact code change is not publicly detailed, but the fix in version 1.13.15 likely involves:
- Vulnerable: The message decoder does not properly limit the maximum size of incoming p2p messages or the depth of nested structures.
- Patched: The decoder now enforces strict size limits and depth checks, rejecting oversized or malformed messages before memory allocation.
Conceptual Example (Vulnerable):
func decodeMessage(data []byte) (*Message, error) {
// No size check on data
msg := new(Message)
err := rlp.DecodeBytes(data, msg)
// ...
}
Conceptual Example (Patched):
func decodeMessage(data []byte) (*Message, error) {
if len(data) > maxMessageSize {
return nil, errors.New("message too large")
}
msg := new(Message)
err := rlp.DecodeBytes(data, msg)
// ...
}
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- A vulnerable geth node (version < 1.13.15) running on a test network.
- A custom script or tool to craft malicious p2p messages.
Lab Setup:
- Victim Node: Run a geth node on a private testnet (e.g., using
--devmode) with version 1.13.14.geth --dev --http --http.port 8545 --port 30303 - Attacker Node: Use a Python script with the
rlpxlibrary or raw socket programming to send crafted messages.
Exploit Script (Python - Conceptual):
import socket
import struct
# Craft a malicious RLPx message (simplified)
def craft_malicious_message():
# This would contain a malformed payload that triggers memory allocation
payload = b'\x00' * 10_000_000 # 10MB of zeros
# Wrap in RLPx frame
frame = struct.pack('>I', len(payload)) + payload
return frame
def exploit(target_ip, target_port=30303):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((target_ip, target_port))
# Perform RLPx handshake (omitted for brevity)
# Send malicious message
msg = craft_malicious_message()
sock.send(msg)
sock.close()
if __name__ == '__main__':
exploit('192.168.1.100')
Expected Outcome: The victim node's memory usage spikes, and it may crash or become unresponsive.
Blue Team (Defense & Detection)
Defensive Measures:
- Immediate Patching: Upgrade to geth 1.13.15 or later.
- Network Segmentation: Restrict p2p port (30303) access to only known peers using firewall rules.
- Rate Limiting: Implement connection rate limiting and message size limits at the network perimeter.
- Monitoring: Monitor memory usage of geth processes and set alerts for abnormal spikes.
Detection:
- Monitor for rapid memory consumption in geth processes.
- Analyze p2p traffic for unusually large message sizes.
- Use the detection rules provided below.
Indicators of Compromise (IOCs)
- Network Indicators:
- Unusually large p2p messages (>1MB) on port 30303/TCP.
- Rapid connection attempts from a single IP to multiple geth nodes.
- Host Indicators:
- geth process consuming >2GB of memory unexpectedly.
- geth process crashing with out-of-memory (OOM) errors.
- Log entries indicating "message too large" or "decode error" after patching.
- File Indicators:
- Core dumps from geth crashes (if enabled).
Detection Engineering
YARA Rule
rule CVE_2024_32972_Memory_Exhaustion {
meta:
description = "Detects potential memory exhaustion attack against geth p2p"
author = "Valters IT"
date = "2024-10-27"
reference = "CVE-2024-32972"
strings:
$rlpx_header = { 22 00 00 00 } // RLPx frame header (example)
$large_payload = { 00 00 00 01 00 00 00 } // Large size indicator
condition:
$rlpx_header at 0 and $large_payload
}
Sigma Rule
title: CVE-2024-32972 - geth Memory Exhaustion via Malformed P2P Messages
id: 8a9b3c2d-1e5f-4a7b-8c9d-0e1f2a3b4c5d
status: experimental
description: Detects excessive memory consumption in geth processes indicative of exploitation.
logsource:
category: process_creation
product: linux
detection:
selection:
Image|endswith: '/geth'
condition: selection
timeframe: 5m
aggregation:
field: Image
function: sum
metric: MemoryUsage
condition: gt 2000000000 # 2GB
falsepositives:
- Legitimate high-traffic nodes
level: high
Suricata Rule
alert tcp any any -> any 30303 (msg:"CVE-2024-32972 - Potential geth Memory Exhaustion Attack"; flow:to_server; content:"|22 00 00 00|"; depth:4; byte_test:4,>,1048576,0,relative; classtype:attempted-dos; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Patch: Upgrade all geth nodes to version 1.13.15 or later.
# Using Go go get github.com/ethereum/go-ethereum@v1.13.15 # Or download binary from official releases - Restart: Restart all geth services after patching.
Mitigation (if patching is delayed):
- Firewall: Restrict inbound connections to port 30303 to only known, trusted peer IPs.
- Monitoring: Implement real-time memory monitoring and alerting for geth processes.
- Resource Limits: Use systemd or Docker to limit the memory available to the geth container/process (e.g.,
--memory=4gin Docker).
Long-Term:
- Regularly update geth to the latest stable version.
- Subscribe to the go-ethereum security mailing list for future advisories.
- Implement network intrusion detection systems (NIDS) with the provided Suricata rule.
Valters IT
DevSecOps & Cyber Threat Intelligence