CVE-2026-58534 — Windows Input Method Editor (IME) Elevation of Privilege Vulnerability
Executive Summary
Heap-based buffer overflow in Microsoft Input Method Editor (IME) allows an authorized attacker to elevate privileges 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 | Elevation of Privilege | Yes |
| Windows 10 Version 1607 for x64-based Systems | 5099535 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 1809 for 32-bit Systems | 5099538 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 1809 for x64-based Systems | 5099538 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 21H2 for 32-bit Systems | 5099539 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 21H2 for ARM64-based Systems | 5099539 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 21H2 for x64-based Systems | 5099539 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 22H2 for 32-bit Systems | 5099539 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 22H2 for ARM64-based Systems | 5099539 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 22H2 for x64-based Systems | 5099539 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 24H2 for ARM64-based Systems | 5101650 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 24H2 for x64-based Systems | 5101650 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 25H2 for ARM64-based Systems | 5101650 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 25H2 for x64-based Systems | 5101650 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 26H1 for ARM64-based Systems | 5101649 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 version 26H1 for x64-based Systems | 5101649 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2016 | 5099535 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2016 (Server Core installation) | 5099535 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2019 | 5099538 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2019 (Server Core installation) | 5099538 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2022 | 5099540 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2025 | 5099536 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2025 (Server Core installation) | 5099536 (Security Update) |
Important | Elevation of Privilege | 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
Heap-based buffer overflow (CWE-122) in the Microsoft Japanese IME API imjpapi.dll (CLMParamSerializer, sflmelm MTF container converter), local EoP. CLMParamSerializer::Deserialize fetches a blob size from an IME property bag, allocates exactly that many bytes with operator new[], and parses the blob into a fixed 0x908-byte object. A DWORD entry count read from blob+0x128 is stored at dst+0x518 and used as the iteration count for a loop that writes 8-byte pointers beginning at dst+0x520; the next object field is at dst+0x848, giving capacity for exactly 101 (0x65) entries. PRE validates neither the blob size nor the count, so a count > 0x65 overruns the fixed object (index 124 reaches dst+0x900, past the 0x908-byte allocation) -> attacker-controlled pointer-array heap overflow. IN-HOUSE ghidriff of imjpapi.dll 10.0.26100.8521 -> .8875 (Jul 14 2026, KB5101650) confirms the fix: Deserialize is the only code-changed function and adds two independent bounds checks gated behind CFR flag Feature_801091896 - guard 1 rejects blob size < 0x178 (fully covers the fixed read at +0x174), guard 2 rejects entry count > 0x65 (the object capacity). Note: our x64 24H2 diff shows flag Feature_801091896 and guard1 < 0x178, differing from the circulated note's Feature_1069527352 / < 0x174 (build/arch difference); we ship what our diff shows.
| Function | Address | Change | Note |
|---|---|---|---|
CLMParamSerializer::Deserialize |
code change |
code (two blob bounds checks added, CFR-gated) | Pre: `operator new[](blob_size)` unvalidated; entry count = blob+0x128 stored at dst+0x518 drives an 8-byte-pointer write loop at dst+0x520 into a fixed 0x908-byte object, no upper bound -> heap overflow past dst+0x848 (capacity 101). Post (Feature_801091896 enabled): guard1 `local_res10[0] < 0x178` throw (min blob size, covers fixed read at +0x174); guard2 `0x65 < puVar10[0x146]` throw (entry count <= 101). Both throw from mtfcontainerconverter.cpp (0x573 / 0x59d). |
Feature_801091896 |
gate |
added (CFR gate) | New Controlled Feature Rollout flag gating both bounds checks; the original unchecked parse still ships in .8875. |
Attack Path
An unbounded blob entry-count drives Deserialize's pointer loop past the fixed 0x908-byte object for a heap overflow
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.
Known Exploits
Acknowledgments
Pwnforr777