CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2025-6120

CVE-2025-6120: Heap-Based Buffer Overflow in Assimp HL1MDLLoader read_meshes

Alon Barad
Alon Barad
Software Engineer

Jul 29, 2026·5 min read·3 visits

Executive Summary (TL;DR)

A heap-based buffer overflow vulnerability in Assimp's Half-Life 1 MDL parser (<= 5.4.3) allows local attackers to cause denial of service or potentially execute arbitrary code via a malformed model file.

CVE-2025-6120 is a critical memory corruption vulnerability in the Open Asset Import Library (Assimp) affecting versions up to and including 5.4.3. The flaw is located in the Half-Life 1 MDL file format loader, specifically within the read_meshes function in HL1MDLLoader.cpp. It arises due to a lack of verification checks on array, bone, skin, or vertex indices parsed directly from a binary stream, resulting in a heap-based buffer overflow or out-of-bounds memory access.

Vulnerability Overview

The Open Asset Import Library (Assimp) is an open-source library designed to import and manipulate various 3D model formats. It is utilized in rendering engines, game development tools, asset pipelines, and visualization software. To parse these legacy formats, Assimp employs specific loader components designed for individual file extensions. One such module is the Half-Life 1 MDL loader, which parses historical game assets.

Legacy 3D format loaders present a significant attack surface because they often parse highly nested, binary, and complex structures. Because Assimp is implemented in C++, memory management is handled manually, requiring robust boundary checks on all parsed offsets and index parameters. A failure to validate these values can lead to severe memory corruption when processing corrupted or maliciously modified input files.

CVE-2025-6120 identifies a critical heap-based buffer overflow inside the HL1 MDL loader component. The vulnerability resides specifically within the read_meshes function located in the source file HL1MDLLoader.cpp. This weakness permits local attackers to supply malformed 3D assets that corrupt heap memory, causing the application to terminate unexpectedly or potentially execute arbitrary code.

Root Cause Analysis

The primary flaw within HL1MDLLoader::read_meshes lies in the handling of array index variables parsed directly from the MDL binary stream. When the loader encounters model structures, it initializes several heap-allocated arrays, including temp_bones_ and bind_pose_vertices. These arrays hold vertex, bone, and transformation matrices crucial for skeletal animation and mesh reconstruction.

During parsing, the loader retrieves index values such as bone indices pvertbone[k] and skin references pskinref[pmesh->skinref] from the MDL file stream. These indices are subsequently utilized as offsets to access elements inside the heap-allocated structures without any boundary validation. Because the parser trusts the file header and structure counts, it assumes all indices lie within the safe limits of the pre-allocated buffers.

When a malformed MDL file defines index values larger than the actual array bounds, the application accesses memory outside the allocated block. This causes heap-out-of-bounds reads when reading bone transforms, and heap-out-of-bounds writes when writing calculated vertices back to memory buffers. This unchecked array indexing constitutes a classic CWE-122 (Heap-based Buffer Overflow) vulnerability, leading to memory corruption.

Code-Level Analysis

The vulnerability exists in assimp/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp inside the read_meshes function. An analysis of the vulnerable commit b3a47a68fa0a379b1fa0788e4a5f448111cd2012 highlights multiple critical lines where indices are dereferenced without validation.

For example, the loader retrieves a bone index via pvertbone[k] and uses it to reference temp_bones_:

// Vulnerable code in HL1MDLLoader.cpp
bind_pose_vertices[k] = temp_bones_[pvertbone[k]].absolute_transform * aiVector3D(vert[0], vert[1], vert[2]);

If the value of pvertbone[k] exceeds the bounds of the temp_bones_ vector, this operation triggers an out-of-bounds read, fetching a corrupted matrix that corrupts subsequent calculations. Similarly, normal bone arrays are processed without verification:

// Vulnerable code in HL1MDLLoader.cpp
const aiMatrix4x4 normal_matrix = aiMatrix4x4(temp_bones_[pnormbone[k]].absolute_transform).Inverse().Transpose();

In addition, skin references are read through nested indexing operations:

// Vulnerable skin reference resolution
float texcoords_s_scale = 1.0f / (float)ptexture[pskinref[pmesh->skinref]].width;

If pmesh->skinref or the resolved value inside pskinref is larger than the ptexture allocation limits, the system attempts to dereference an invalid memory address, causing an immediate crash or leaking adjacent heap memory structures.

Parser Execution and Data Flow

To trace the logical progression of the exploit, it is necessary to examine how Assimp structures its model loader sequence. The following diagram illustrates the flow of untrusted input data from the file stream into the heap buffers of the HL1MDLLoader class:

The parser begins by reading file headers to determine buffer sizes. It then allocates memory based on these dimensions. The failure occurs because individual element indices within the body of the MDL structure are not validated against the allocation sizes defined in the file headers.

Exploitation and Attack Scenarios

To execute an attack, a local adversary must construct a malformed Half-Life MDL file containing inconsistent internal headers. The exploit file defines a small number of bone elements to minimize heap allocation size while setting the bone indices of specific vertices to extremely large integer values. This misalignment ensures that when the file is processed, the memory access offset points outside the allocated boundaries.

An application utilizing Assimp must then ingest this file. Typical targets include asset conversion servers, local 3D model viewers, game development environments, or engine pipelines. When the application loads the file, the parser executes automatically, requiring no direct administrative privileges or authentication from the attacking entity.

Depending on the configuration of the heap and the precision of the index alignment, the out-of-bounds access can overwrite adjacent heap chunks. This can corrupt function pointers, virtual table pointers, or metadata belonging to neighboring objects. Successfully aligning and manipulating these structures can redirect execution flow to attacker-controlled memory, enabling arbitrary code execution under the permissions of the host process.

Remediation and Defense-in-Depth

The primary remediation strategy is upgrading the Assimp library. Since this vulnerability is tracked as part of a collective fuzzer issue, standard patches should be tracked directly via the project repository. If your application does not require importing Half-Life 1 MDL models, you should disable the vulnerable loader entirely during compilation.

To disable the legacy MDL importer, compile Assimp from source using the following CMake build configuration flag:

cmake -DASSIMP_BUILD_MDL_IMPORTER=OFF ..

This completely removes HL1MDLLoader and its associated attack surface from the compiled binary. For environments where the loader must remain active, implement robust sandboxing. Run the parsing process inside isolated sandboxes using gVisor, Docker, or systemd-seccomp profiles with restricted system call privileges to limit the impact of any potential sandbox escapes.

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L
EPSS Probability
0.21%
Top 89% most exploited

Affected Systems

Open Asset Import Library (Assimp) <= 5.4.3

Affected Versions Detail

Product
Affected Versions
Fixed Version
Assimp
Open Asset Import Library
<= 5.4.3Not explicitly patched (Tracking issue active)
AttributeDetail
CWE IDCWE-122 (Heap-based Buffer Overflow)
Attack VectorLocal / Client File Ingestion
CVSS v3.1 Score5.3 (Medium)
EPSS Score0.0021
Exploit StatusProof-of-Concept Available
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1203Exploitation for Client Execution
Execution
T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-122
Heap-based Buffer Overflow

A heap-based buffer overflow condition occurs when a buffer that is allocated on the heap portion of memory is written to with more data than the buffer can hold.

Known Exploits & Detection

GitHubPublic exploit reproduction archive containing test cases for read_meshes heap overflow

Vulnerability Timeline

Vulnerability identified and reported on Assimp's GitHub issue tracker by user Rulkallos
2025-06-05
CVE-2025-6120 assigned and published to the NVD and CVE databases
2025-06-16

References & Sources

  • [1]GitHub Issue Tracker - Bug Report #6220
  • [2]GitHub Issue Tracker - Maintainer Response Comment
  • [3]VulDB Entry for CVE-2025-6120
  • [4]VulDB CTI Indicators
  • [5]VulDB Submission Details

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-54639
8.8

CVE-2026-54639: Prototype Pollution and Patch Bypass in style-dictionary

A critical prototype pollution vulnerability (CVE-2026-54639) exists in style-dictionary versions 4.3.0 through 5.4.3 due to unsafe object traversal in the convertTokenData utility. Although a patch was released in version 5.4.4 targeting '__proto__', a complete bypass is possible using 'constructor.prototype', leading to persistent global prototype pollution and potential remote code execution.

Alon Barad
Alon Barad
2 views•6 min read
•about 2 hours ago•GHSA-6XX4-9WP6-65P7
6.5

GHSA-6XX4-9WP6-65P7: Arbitrary Local File Disclosure via UNIX Symlink Following in skilo

A local file disclosure vulnerability exists in the Rust-based package skilo. When copying files during skill installation, the application recursively traverses directories but dereferences symbolic links, resulting in unauthorized local file reading.

Amit Schendel
Amit Schendel
2 views•5 min read
•about 3 hours ago•CVE-2026-54659
6.9

CVE-2026-54659: Directory Traversal and File Existence Oracle in Pagy I18n module

Pagy, an agile pagination gem for plain Ruby, contains a directory traversal vulnerability in its internationalization (I18n) module prior to version 43.5.6. An unauthenticated remote attacker can exploit this flaw by submitting path traversal sequences to the locale setter, allowing them to probe the server filesystem. The resulting behavior creates a highly reliable file existence and readability side-channel oracle for YAML files.

Alon Barad
Alon Barad
2 views•6 min read
•about 4 hours ago•CVE-2026-66064
5.3

CVE-2026-66064: Incorrect Authorization and ACL Bypass via Trailing Slash in goshs

CVE-2026-66064 is an access control list (ACL) and blocklist bypass vulnerability in the goshs file server prior to version 2.1.5. Due to an inconsistency between uncleaned raw URI path evaluation and normalized file access, remote unauthenticated attackers can retrieve protected files, including the configuration file containing password hashes, by appending a trailing slash to the requested path.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 5 hours ago•CVE-2026-54719
7.5

CVE-2026-54719: Access Control List Authorization Bypass in goshs via bulk ZIP Download Route

CVE-2026-54719 is a high-severity Access Control List (ACL) authorization bypass vulnerability in goshs, a lightweight HTTPS-capable server used for file sharing. The issue allows unauthenticated network attackers to completely bypass file-level and directory-level authentication mechanisms and blocklists by requesting protected resources via the bulk ZIP-download route (?bulk). This vulnerability represents a residual flaw following a partial remediation attempt for CVE-2026-40189.

Alon Barad
Alon Barad
4 views•6 min read
•about 6 hours ago•CVE-2026-52888
6.8

CVE-2026-52888: Sensitive Data Exposure and Blacklist Bypass in NocoBase SQL Collection Plugin

NocoBase, an extensible low-code platform, was found to contain an information exposure vulnerability in its SQL Collection plugin. The validator designed to inspect SQL queries used an incomplete keyword-based blacklist, allowing users with administrative or collection creation privileges to bypass restrictions and execute arbitrary SELECT queries against PostgreSQL system catalogs. This flaw permits unauthenticated or privilege-escalated access to critical system files, active connection listings, and system user password hashes.

Alon Barad
Alon Barad
5 views•6 min read