CVE-2026-50491 — Code Integrity DLL (ci.dll) Elevation of Privilege Vulnerability
Executive Summary
Out-of-bounds read in Code Integrity DLL (ci.dll) 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 2012 | 5099445 (Monthly Rollup) |
Important | Elevation of Privilege | Yes |
| Windows Server 2012 (Server Core installation) | 5099445 (Monthly Rollup) |
Important | Elevation of Privilege | Yes |
| Windows Server 2012 R2 | 5099444 (Monthly Rollup) |
Important | Elevation of Privilege | Yes |
| Windows Server 2012 R2 (Server Core installation) | 5099444 (Monthly Rollup) |
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 |
5099445 |
Monthly Rollup | Yes |
5099444 |
Monthly Rollup | Yes |
5099540 |
Security Update | Yes |
5099536 |
Security Update | Yes |
Patch Diff
Out-of-bounds read (CWE-125) with type confusion (CWE-843) in the Windows Code Integrity driver ci.dll SIPolicy version-block parser, local EoP to SYSTEM. To match Windows Defender Application Control (WDAC / System Integrity) policy rules that key on an image's file version and OriginalFilename, ci.dll parses the image's VS_VERSIONINFO resource via SIPolicyGetOriginalFilenameAndVersionFromImageBase -> SIPolicyGetVersionInfo / SIPolicyCheckVerBlock / SIPolicyQuerySubVerBlock / SIPolicyQueryVersionFields, walking the nested block tree (VS_FIXEDFILEINFO, StringFileInfo/VarFileInfo/Translation). PRE: these parsers trusted each block's declared wLength / value length / node type without validating them against the parent block bounds or verifying the VS_FIXEDFILEINFO signature, so a crafted version resource yields (a) an out-of-bounds read when a child block's length/offset runs past the parent block (CWE-125), and (b) type confusion when a node is consumed as VS_FIXEDFILEINFO / the wrong record type without the 0xFEEF04BD signature check (CWE-843). Because code-integrity/WDAC evaluation runs in kernel context, and exploitation requires winning a race (AC:H), the malformed-parse is an EoP-to-SYSTEM primitive. Diff of ci.dll 10.0.26100.8737 -> .8875 (Jul 14 2026, KB5101650) confirms the fix: gated behind CFR flags Feature_1311764795 / Feature_2390291770, the version-block parsers add bounds and structure validation at each descent - SIPolicyGetVersionInfo now requires the block to be >=0x5b bytes with the declared length within the available size and checks the VS_FIXEDFILEINFO signature (*(int*)(base+0x14) == 0xFEEF04BD); SIPolicyCheckVerBlock/QuerySubVerBlock validate each sub-block's aligned length+offset against the parent size and enforce even alignment before reading.
| Function | Address | Change | Note |
|---|---|---|---|
SIPolicyGetVersionInfo |
code change |
code (VS_FIXEDFILEINFO signature + length validation added, CFR-gated) | Post adds: require (0x5b < param_2) && (0x5b < *param_1) && (*param_1 <= param_2) && (*(int*)(param_1+0x14) == 0xFEEF04BD) before reading the fixed-file-info fields, so an undersized/misaligned or non-VS_FIXEDFILEINFO block is rejected (blocks OOB read + type confusion). |
SIPolicyCheckVerBlock |
code change |
code (sub-block length/offset bounded against parent) | Post: requires 7 < param_2, 7 < uVar1 <= param_2, validates the string length via RtlStringCbLengthW, and checks aligned(length)+child-offset <= parent length and param_2 >= that computed size before descending. |
SIPolicyQuerySubVerBlock |
code change |
code (alignment + bounds checks on the block walk) | Post adds even-alignment ((*param_1 & 1)==0), range ((ushort)(*param_1-8) < 0x7ff9), value-length bound (uVar4 <= uVar1*2) and pointer bound (puVar13 <= param_1) while walking the block tree. |
SIPolicyQueryVersionFields |
code change |
code (length validation on extracted fields) | Post adds signed-length checks and a <0xffff length bound plus RtlStringCbLengthW validation on the extracted version strings. |
Feature_1311764795 / Feature_2390291770 |
gate |
added (CFR gate) | CFR flags gating the hardened version-block validation; the original under-validating parser still ships when disabled. |
Attack Path
A crafted image version resource is walked by the kernel Code Integrity policy parser without bounds/type checks, causing OOB read and type confusion
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.