CVE-2026-58530 — Windows Resilient File System (ReFS) Remote Code Execution Vulnerability
Executive Summary
Heap-based buffer overflow in Windows Resilient File System (ReFS) allows an unauthorized attacker to execute code locally.
Overview
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C
EPSS Score
Affected Products
| Product | KB Article | Severity | Impact | Restart Required |
|---|---|---|---|---|
| Windows 10 Version 1607 for 32-bit Systems | 5099535 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 1607 for x64-based Systems | 5099535 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 1809 for 32-bit Systems | 5099538 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 1809 for x64-based Systems | 5099538 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for 32-bit Systems | 5099539 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for ARM64-based Systems | 5099539 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 21H2 for x64-based Systems | 5099539 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for 32-bit Systems | 5099539 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for ARM64-based Systems | 5099539 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 10 Version 22H2 for x64-based Systems | 5099539 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 11 Version 24H2 for ARM64-based Systems | 5101650 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 11 Version 24H2 for x64-based Systems | 5101650 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 11 Version 25H2 for ARM64-based Systems | 5101650 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 11 Version 25H2 for x64-based Systems | 5101650 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 11 Version 26H1 for ARM64-based Systems | 5101649 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows 11 version 26H1 for x64-based Systems | 5101649 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows Server 2016 | 5099535 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows Server 2016 (Server Core installation) | 5099535 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows Server 2019 | 5099538 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows Server 2019 (Server Core installation) | 5099538 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows Server 2022 | 5099540 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows Server 2025 | 5099536 (Security Update) |
Important | Remote Code Execution | Yes |
| Windows Server 2025 (Server Core installation) | 5099536 (Security Update) |
Important | Remote Code Execution | Yes |
Patches
| Article | Type | Restart |
|---|---|---|
5099535 |
Security Update | Yes |
5099538 |
Security Update | Yes |
5099539 |
Security Update | Yes |
5101650 |
Security Update | Yes |
5101649 |
Security Update | Yes |
5099540 |
Security Update | Yes |
5099536 |
Security Update | Yes |
Patch Diff
Kernel heap-based buffer overflow (CWE-122) in the Windows ReFS driver refs.sys checkpoint serialization, mount-time arbitrary code execution (Important, RCE, AV:L, UI:R, CVSS 7.8). A producer/consumer bug separated in time: a crafted ReFS checkpoint carries an excessive globalTableCount (DWORD at record + 0x90). PRE: CmsVolume::ValidateCheckpointRecord accepts the count as long as it is internally consistent with the INPUT record - the key check count <= size >> 2 && count > 4 bounds it only against the input checkpoint's own size (a larger crafted record raises the permitted count), plus offset-table-inside-record checks; nothing bounds it against the destination buffer. During mount, ReadLatestCheckpoint promotes it to persistent kernel state as volume + 478 = count - 13, losing its untrusted origin. Later CmsVolume::FormatCheckpointRecord restores count = volume[478] + 13 and writes that many offset-table entries and serialized roots into the fixed checkpoint record buffer with NO comparison of the final cursor against the buffer size - a kernel OOB write. Mounting a crafted ReFS image (AV:L, UI:R) reaches the path, yielding kernel code execution. Diff of refs.sys 10.0.20348.4893 -> .5386 (Jul 14 2026, KB5099540, Server 2022) confirms the fix: the formatter is logically unchanged (only relocated); the CVE-relevant delta is an ABSOLUTE count cap added to ValidateCheckpointRecord (ratio 0.37), gated behind CFR flags Feature_1337977145 / Feature_3102454072, rejecting the oversized globalTableCount before it is promoted to persistent state. Cross-checked against an independent writeup; functions (ValidateCheckpointRecord / FormatCheckpointRecord / ReadLatestCheckpoint) and offsets (+0x90 count, volume+478) match the ghidriff.
| Function | Address | Change | Note |
|---|---|---|---|
CmsVolume::ValidateCheckpointRecord |
code change |
code (absolute globalTableCount cap added, CFR-gated) | Pre (ratio 0.37): globalTableCount at record+0x90 checked only as count <= size>>2 && count > 4 (input-record-relative) plus offset-table-inside-record checks - not bounded to the destination buffer. Post (Feature_1337977145 / Feature_3102454072): adds an absolute cap that rejects an oversized count before it is promoted to volume+478 and later consumed by the formatter. |
CmsVolume::FormatCheckpointRecord |
sink (unchanged / relocated) |
note (the OOB-write sink; logically unchanged) | Restores count = volume[478] + 13 and serializes that many offset-table entries and roots into the fixed checkpoint buffer with no destination-size check. The formatter body is logically equivalent between builds (relocated); the fix is entirely in the validator. |
CmsVolume::ReadLatestCheckpoint |
code change |
code (promotes the validated count to persistent state) | Stores volume + 478 = globalTableCount - 13 (extended-root count) during mount; the untrusted value's origin is lost here, then restored later by FormatCheckpointRecord. |
Feature_1337977145 / Feature_3102454072 |
gate |
added (CFR gates) | CFR flags gating the count cap in ValidateCheckpointRecord; the original record-local-only validation ships when disabled. |
Attack Path
A crafted ReFS checkpoint globalTableCount passes record-local validation, then overflows the destination checkpoint buffer during formatting
Derived from the patch delta: the checks added by the vendor identify which fields crossed a trust boundary unvalidated. Reachability and privilege are taken from the call chain in the RCA report.
Exploits & PoC
Detection Rules
Acknowledgments
Donghyeon Oh
Jonghoi Kim
R4nger with Kunlun Lab & Zhiniang Peng with HUST