CVE-2025-21932 Vulnerability Analysis & Exploit Details

CVE-2025-21932
Vulnerability Scoring

7.0
/10
High Risk

If left unpatched, CVE-2025-21932 could lead to major system disruptions or data loss.

Attack Complexity Details

  • Attack Complexity: High
    Exploits require significant effort and special conditions.
  • Attack Vector: Local
    Vulnerability requires local system access.
  • Privileges Required: Low
    Some privileges are necessary to exploit the vulnerability.
  • Scope: Unchanged
    Exploit remains within the originally vulnerable component.
  • User Interaction: None
    No user interaction is necessary for exploitation.

CVE-2025-21932 Details

Status: Modified

Last updated: 🕕 30 Jul 2026, 06:21 UTC
Originally published on: 🕓 01 Apr 2025, 16:15 UTC

Time between publication and last update: 484 days

CVSS Release: version 3

CVSS3 Source

416baaa9-dc9f-4396-8d5f-8c081fb06d67

CVSS3 Type

Secondary

CVSS3 Vector

CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H

CVE-2025-21932 Vulnerability Summary

CVE-2025-21932: In the Linux kernel, the following vulnerability has been resolved: mm: abort vma_modify() on merge out of memory failure The remainder of vma_modify() relies upon the vmg state remaining pristine after a merge attempt. Usually this is the case, however in the one edge case scenario of a merge attempt failing not due to the specified range being unmergeable, but rather due to an out of memory error arising when attempting to commit the merge, this assumption becomes untrue. This results in vmg->start, end being modified, and thus the proceeding attempts to split the VMA will be done with invalid start/end values. Thankfully, it is likely practically impossible for us to hit this in reality, as it would require a maple tree node pre-allocation failure that would likely never happen due to it being 'too small to fail', i.e. the kernel would simply keep retrying reclaim until it succeeded. However, this scenario remains theoretically possible, and what we are doing here is wrong so we must correct it. The safest option is, when this scenario occurs, to simply give up the operation. If we cannot allocate memory to merge, then we cannot allocate memory to split either (perhaps moreso!). Any scenario where this would be happening would be under very extreme (likely fatal) memory pressure, so it's best we give up early. So there is no doubt it is appropriate to simply bail out in this scenario. However, in general we must if at all possible never assume VMG state is stable after a merge attempt, since merge operations update VMG fields. As a result, additionally also make this clear by storing start, end in local variables. The issue was reported originally by syzkaller, and by Brad Spengler (via an off-list discussion), and in both instances it manifested as a triggering of the assert: VM_WARN_ON_VMG(start >= end, vmg); In vma_merge_existing_range(). It seems at least one scenario in which this is occurring is one in which the merge being attempted is due to an madvise() across multiple VMAs which looks like this: start end |<------>| |----------|------| | vma | next | |----------|------| When madvise_walk_vmas() is invoked, we first find vma in the above (determining prev to be equal to vma as we are offset into vma), and then enter the loop. We determine the end of vma that forms part of the range we are madvise()'ing by setting 'tmp' to this value: /* Here vma->vm_start <= start < (end|vma->vm_end) */ tmp = vma->vm_end; We then invoke the madvise() operation via visit(), letting prev get updated to point to vma as part of the operation: /* Here vma->vm_start <= start < tmp <= (end|vma->vm_end). */ error = visit(vma, &prev, start, tmp, arg); Where the visit() function pointer in this instance is madvise_vma_behavior(). As observed in syzkaller reports, it is ultimately madvise_update_vma() that is invoked, calling vma_modify_flags_name() and vma_modify() in turn. Then, in vma_modify(), we attempt the merge: merged = vma_merge_existing_range(vmg); if (merged) return merged; We invoke this with vmg->start, end set to start, tmp as such: start tmp |<--->| |----------|------| | vma | next | |----------|------| We find ourselves in the merge right scenario, but the one in which we cannot remove the middle (we are offset into vma). Here we have a special case where vmg->start, end get set to perhaps unintuitive values - we intended to shrink the middle VMA and expand the next. This means vmg->start, end are set to... vma->vm_start, start. Now the commit_merge() fails, and vmg->start, end are left like this. This means we return to the rest of vma_modify() with vmg->start, end (here denoted as start', end') set as: start' end' |<-->| |----------|------| | vma | next | |----------|------| So we now erroneously try to split accordingly. This is where the unfortunate ---truncated---

Assessing the Risk of CVE-2025-21932

Access Complexity Graph

The exploitability of CVE-2025-21932 depends on two key factors: attack complexity (the level of effort required to execute an exploit) and privileges required (the access level an attacker needs).

Exploitability Analysis for CVE-2025-21932

This vulnerability, CVE-2025-21932, requires a high level of attack complexity and low privileges, making it difficult but not impossible to exploit. Organizations should ensure robust security configurations to mitigate risks.

Understanding AC and PR

A lower complexity and fewer privilege requirements make exploitation easier. Security teams should evaluate these aspects to determine the urgency of mitigation strategies, such as patch management and access control policies.

Attack Complexity (AC) measures the difficulty in executing an exploit. A high AC means that specific conditions must be met, making an attack more challenging, while a low AC means the vulnerability can be exploited with minimal effort.

Privileges Required (PR) determine the level of system access necessary for an attack. Vulnerabilities requiring no privileges are more accessible to attackers, whereas high privilege requirements limit exploitation to authorized users with elevated access.

CVSS Score Breakdown Chart

Above is the CVSS Sub-score Breakdown for CVE-2025-21932, illustrating how Base, Impact, and Exploitability factors combine to form the overall severity rating. A higher sub-score typically indicates a more severe or easier-to-exploit vulnerability.

CIA Impact Analysis

Below is the Impact Analysis for CVE-2025-21932, showing how Confidentiality, Integrity, and Availability might be affected if the vulnerability is exploited. Higher values usually signal greater potential damage.

  • Confidentiality: High
    Exploiting CVE-2025-21932 can result in unauthorized access to sensitive data, severely compromising data privacy.
  • Integrity: High
    CVE-2025-21932 could allow unauthorized modifications to data, potentially affecting system reliability and trust.
  • Availability: High
    CVE-2025-21932 can disrupt system operations, potentially causing complete denial of service (DoS).

CVE-2025-21932 References

External References

CWE Common Weakness Enumeration

NVD-CWE-noinfo

Vulnerable Configurations

  • cpe:2.3:o:linux:linux_kernel:6.12:-:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12:-:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.1:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.1:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.2:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.2:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.3:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.3:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.4:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.4:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.5:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.5:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.6:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.6:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.7:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.7:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.8:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.8:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.9:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.9:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.10:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.10:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.11:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.11:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.12:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.12:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.13:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.13:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.14:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.14:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.15:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.15:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.16:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.16:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.17:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.17:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.12.18:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.12.18:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.13:-:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.13:-:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.13.1:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.13.1:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.13.2:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.13.2:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.13.3:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.13.3:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.13.4:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.13.4:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.13.5:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.13.5:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.13.6:*:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.13.6:*:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.14:rc1:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.14:rc1:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.14:rc2:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.14:rc2:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.14:rc3:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.14:rc3:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.14:rc4:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.14:rc4:*:*:*:*:*:*
  • cpe:2.3:o:linux:linux_kernel:6.14:rc5:*:*:*:*:*:*
    cpe:2.3:o:linux:linux_kernel:6.14:rc5:*:*:*:*:*:*

Protect Your Infrastructure against CVE-2025-21932: Combat Critical CVE Threats

Stay updated with real-time CVE vulnerabilities and take action to secure your systems. Enhance your cybersecurity posture with the latest threat intelligence and mitigation techniques. Develop the skills necessary to defend against CVEs and secure critical infrastructures. Join the top cybersecurity professionals safeguarding today's infrastructures.

Other 5 Recently Published CVEs Vulnerabilities

  • CVE-2026-90474 – MCPHub before 1.0.32 contains an authentication bypass vulnerability in its embedded OAuth 2.0 authorization server where client authentication is ...
  • CVE-2026-90473 – msgpack-java through 0.9.12 contains an integer overflow vulnerability in MessageUnpacker.skipValue() when processing MAP32 containers with large e...
  • CVE-2026-90472 – msgpack-java through 0.9.12 contains a stack overflow vulnerability in MessageUnpacker.unpackValue() that recursively deserializes arrays and maps ...
  • CVE-2026-89172 – Improper protection of physical side channels vulnerability in Microchip AN1044, Microchip AN953, and Microchip SW300052. This issue affects AN104...
  • CVE-2026-85200 – The GEO my WP plugin for WordPress is vulnerable to Local File Inclusion in all versions up to, and including, 4.5.5.3 via the gmw_posts_locator_aj...