Nov 11, 2026·10 min read·1 visit
A heap-based buffer overflow in Microsoft.DiaSymReader.Native allows remote code execution when Microsoft Visual Studio or .NET processes parse maliciously crafted Program Database (.pdb) debug symbol files.
CVE-2026-118745 is a high-severity remote code execution vulnerability affecting Microsoft Visual Studio 2026 and multiple supported versions of the .NET runtime (8.0, 9.0, 10.0, and 11.0) on Windows systems. The flaw is a heap-based buffer overflow (CWE-122) located within the native symbol reading library, Microsoft.DiaSymReader.Native, specifically in the routines responsible for extracting and parsing Program Database (.pdb) line number metadata. An attacker can exploit this vulnerability by supplying a crafted .pdb file alongside a repository, project, or compiled binary. When a developer or automated diagnostic process parses the malformed debug symbols, an out-of-bounds heap write occurs, permitting arbitrary code execution within the security context of the active user process.
CVE-2026-118745 is a heap-based buffer overflow vulnerability (CWE-122) affecting Microsoft Visual Studio 2026 and supported .NET runtimes (versions 8.0, 9.0, 10.0, and 11.0) on Windows platforms. The flaw resides in Microsoft.DiaSymReader.Native, a foundational native C++ dynamic link library used across the Microsoft developer ecosystem to read and interpret Windows Program Database (.pdb) debug symbol files. Because both the Visual Studio IDE and the core .NET runtime diagnostic subsystems rely on this binary to map compiled intermediate language (IL) and native instructions back to source code lines, the vulnerability exposes a broad attack surface across development and build environments.
The component is invoked automatically during routine software development lifecycle tasks. These tasks include opening a solution in Visual Studio, stepping through code in an interactive debugger, profiling execution performance, or generating stack traces with source line numbers during unhandled exception processing in a .NET application. When the symbol reader processes a .pdb file, it parses internal data streams containing module information, public symbols, and source line number tables.
Due to improper validation of header metadata within the line table stream, an attacker can construct a malformed .pdb file that triggers an out-of-bounds write on the process heap. Successful exploitation enables arbitrary code execution within the security context of the user running Visual Studio or the host .NET process. While user interaction is required to initiate the loading of the untrusted project or binary, the parsing routine itself executes automatically without additional prompts once symbol resolution begins.
The root cause of CVE-2026-118745 is an allocation size miscalculation resulting from missing integer arithmetic checks and inadequate bounds validation within Microsoft.DiaSymReader.Native. In the Microsoft PDB format (specifically MSF/PDB v7.0), debug information for individual compilation units (modules) is stored inside dedicated module streams. Each module stream contains C13 line number subsections (DEBUG_S_LINES) that map instruction offsets to source file identifiers, line numbers, and column positions.
When Microsoft.DiaSymReader.Native loads line table metadata, it reads the subsection headers to determine the total number of sequence points and line records present in the stream. The parser uses these untrusted count values from the file header to calculate the byte size required for a dynamic heap buffer allocation. However, the calculation fails to guard against integer arithmetic overflow or truncation when multiplying the record count by the internal structure size, and fails to verify that the declared record count aligns with the actual remaining bytes in the stream.
When an attacker supplies a .pdb stream containing an artificially large or mismatched line record count, the arithmetic calculation wraps around or truncates, resulting in the allocation of an undersized heap chunk. Subsequently, the deserialization loop iterates through the stream data based on the unvalidated record count or stream boundary, copying unpacked line table structures directly into the undersized buffer.
This discrepancy produces a linear or indexed out-of-bounds write past the end of the allocated heap chunk. The overflow corrupts adjacent heap metadata structures, vtable pointers, or C++ object instances residing in the process heap of devenv.exe (Visual Studio) or dotnet.exe (.NET host).
The vulnerable component, Microsoft.DiaSymReader.Native, is distributed as a compiled native binary (Microsoft.DiaSymReader.Native.amd64.dll, Microsoft.DiaSymReader.Native.x86.dll, and Microsoft.DiaSymReader.Native.arm64.dll) via NuGet packages and bundled directly inside the .NET SDK, .NET runtime shared frameworks, and Visual Studio installation directories. Because the native PDB reader implementation is maintained as a closed-source binary dependency that is ingested into the open-source dotnet/runtime and dotnet/symreader repositories during build servicing, source-level diffs of the underlying C++ parser are not publicly exposed in the GitHub release trees.
We can reconstruct the structural mechanics of the vulnerability and the corresponding logic fix by examining how C13 line subsections are processed in standard DIA symbol reader implementations:
// Conceptual representation of the vulnerable PDB line record parsing logic
HRESULT ParseLineRecords(StreamReader* pStream, uint32_t cbSubsection) {
LineBlockHeader header;
if (!pStream->Read(&header, sizeof(LineBlockHeader))) {
return E_FAIL;
}
// VULNERABLE: Untrusted header.numLines is multiplied by sizeof(LineRecord)
// without checking for 32-bit integer overflow or validating against cbSubsection.
uint32_t allocSize = header.numLines * sizeof(InternalLineRecord);
InternalLineRecord* pRecords = (InternalLineRecord*)HeapAlloc(GetProcessHeap(), 0, allocSize);
if (!pRecords) {
return E_OUTOFMEMORY;
}
// The loop reads up to header.numLines entries, writing past the end of pRecords
// if allocSize wrapped around to a small integer.
for (uint32_t i = 0; i < header.numLines; ++i) {
RawLineEntry rawEntry;
if (!pStream->Read(&rawEntry, sizeof(RawLineEntry))) {
break;
}
UnpackLineEntry(&rawEntry, &pRecords[i]); // Out-of-bounds heap write
}
return S_OK;
}To remediate this class of vulnerability in the November 2026 servicing update, the binary patch enforces safe integer arithmetic prior to heap allocation and validates header counts against the physical boundaries of the substream:
// Conceptual representation of the remediated bounds-checked parsing logic
HRESULT ParseLineRecordsFixed(StreamReader* pStream, uint32_t cbSubsection) {
if (cbSubsection < sizeof(LineBlockHeader)) {
return COR_E_BADIMAGEFORMAT;
}
LineBlockHeader header;
if (!pStream->Read(&header, sizeof(LineBlockHeader))) {
return E_FAIL;
}
// FIX 1: Validate that the remaining bytes in the stream can physically hold the declared entries
uint32_t remainingStreamBytes = cbSubsection - sizeof(LineBlockHeader);
if (header.numLines > (remainingStreamBytes / sizeof(RawLineEntry))) {
return COR_E_BADIMAGEFORMAT;
}
// FIX 2: Use safe integer multiplication (e.g., UInt32Mult / SizeTMult) to prevent overflow
size_t allocSize = 0;
if (FAILED(SizeTMult((size_t)header.numLines, sizeof(InternalLineRecord), &allocSize))) {
return COR_E_BADIMAGEFORMAT;
}
InternalLineRecord* pRecords = (InternalLineRecord*)HeapAlloc(GetProcessHeap(), 0, allocSize);
if (!pRecords) {
return E_OUTOFMEMORY;
}
for (uint32_t i = 0; i < header.numLines; ++i) {
RawLineEntry rawEntry;
if (!pStream->Read(&rawEntry, sizeof(RawLineEntry))) {
HeapFree(GetProcessHeap(), 0, pRecords);
return E_FAIL;
}
UnpackLineEntry(&rawEntry, &pRecords[i]);
}
return S_OK;
}> [!NOTE]
> In the .NET open-source repositories (dotnet/runtime), the remediation is delivered by updating the dependency version references for Microsoft.DiaSymReader.Native across the servicing branches (release/8.0, release/9.0, release/10.0, and release/11.0), corresponding to release tags v8.0.34, v9.0.23, v10.0.15, and v11.0.0.
Regarding fix completeness, enforcing both safe multiplication (SizeTMult) and physical stream size validation prior to allocation eliminates the integer wrap-around vector for line record arrays. However, because .pdb files use a complex multi-stream directory architecture with numerous cross-referenced index tables (such as frame data, inlinee line tables, and column records), defense-in-depth requires applying identical bounds verification across all subsection deserializers in Microsoft.DiaSymReader.Native.
Exploiting CVE-2026-118745 requires an attacker to deliver a crafted .pdb file to a target system and trigger symbol resolution within a vulnerable process. Because .pdb files are standard artifacts in software development, multiple delivery vectors exist that do not raise suspicion during normal workflows.
.pdb file in the bin/, obj/, or lib/ directories. When a developer clones the repository and opens or debugs the solution in Visual Studio, the IDE automatically scans and loads available symbol files..nupkg or symbol packages .snupkg) containing embedded or adjacent .pdb files. When a consuming .NET project builds, executes tests, or throws an exception during local development, the runtime loads the symbol file to resolve stack trace line numbers._NT_SYMBOL_PATH), an attacker capable of intercepting traffic or hosting a malicious symbol server can serve crafted .pdb files on demand when the debugger queries for matching GUID/Age signatures.Once the malicious .pdb is delivered, the attack progresses through four stages:
devenv.exe, msvsmon.exe, or dotnet.exe) loads Microsoft.DiaSymReader.Native.amd64.dll via COM interop (SymBinder / ISymUnmanagedReader) to inspect debug symbols for a loaded module..pdb file, an attacker can first allocate and free controlled blocks of memory to arrange the Windows Low Fragmentation Heap (LFH) into a predictable layout before triggering the vulnerable line table allocation.vptr) of an adjacent ISymUnmanagedMethod or ISymUnmanagedDocument instance on the heap, subsequent COM interface method calls made by the symbol reader redirect execution flow to attacker-controlled ROP gadgets, bypassing Data Execution Prevention (DEP) and executing arbitrary shellcode.CVE-2026-118745 is rated at a CVSS v3.1 base score of 8.8 (High) with the vector CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H. Although exploitation requires user interaction (UI:R) in most scenarios—such as cloning a project or opening a binary—the technical impact is a complete compromise of the user environment (C:H/I:H/A:H).
Developer workstations and Continuous Integration / Continuous Deployment (CI/CD) build agents represent high-value targets within enterprise networks. A successful exploit executing inside Visual Studio or a .NET build process inherits the full permissions of the developer or build service account. On a developer workstation, this grants the attacker access to proprietary source code, local SSH keys, cloud provider credentials (e.g., Azure CLI tokens, AWS credentials), and code-signing certificates.
In automated CI/CD environments where build scripts execute unit tests, code coverage analysis, or crash dump symbolication on untrusted pull requests or third-party artifacts, the vulnerability can be triggered without interactive human intervention. Compromising a build runner enables supply chain poisoning through the injection of unauthorized code into production build artifacts.
At the time of disclosure, there are no reports of active exploitation in the wild, and the vulnerability is not listed in the CISA Known Exploited Vulnerabilities (KEV) catalog. Microsoft classifies the Exploit Code Maturity as Unproven (E:U).
Microsoft addressed CVE-2026-118745 in the November 2026 Patch Tuesday security updates by releasing updated versions of Visual Studio 2026 and the .NET runtime packages containing the patched Microsoft.DiaSymReader.Native binaries. Organizations must apply the relevant updates across all developer workstations, build servers, and production Windows hosts running .NET applications.
> [!IMPORTANT]
> Applications that self-contain the .NET runtime or explicitly reference the Microsoft.DiaSymReader.Native NuGet package in their dependency tree (such as custom diagnostic tools, compilers, or crash analyzers) must update their package references and rebuild to incorporate the patched native DLLs.
Where immediate patching is not feasible, security teams and developers should implement the following controls to reduce exposure:
.pdb files from untrusted source repositories before opening them in an IDE or building them in CI pipelines._NT_SYMBOL_PATH environment variable and Visual Studio debugging options to ensure symbols are only resolved from authenticated, internal symbol servers or the official Microsoft public symbol server over HTTPS.CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Microsoft Visual Studio 2026 version 18.11 Microsoft | >= 18.11.0, < 18.11.4 | 18.11.4 |
Microsoft Visual Studio 2026 version 18.12 Microsoft | < 18.12.0 | 18.12.0 |
.NET 8.0 Microsoft | >= 8.0.0, < 8.0.34 | 8.0.34 |
.NET 9.0 Microsoft | >= 9.0.0, < 9.0.23 | 9.0.23 |
.NET 10.0 Microsoft | >= 10.0.0, < 10.0.15 | 10.0.15 |
.NET 11.0 Microsoft | >= 11.0.0-preview.1, < 11.0.0 | 11.0.0 |
| Attribute | Detail |
|---|---|
| Vulnerability Class | CWE-122: Heap-based Buffer Overflow |
| Affected Component | Microsoft.DiaSymReader.Native (PDB Symbol Reader) |
| CVSS v3.1 Score | 8.8 High (AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H) |
| Attack Vector | Network / Crafted Program Database (.pdb) File |
| Security Impact | Remote Code Execution (RCE) in User Context |
| Exploit Status | Unproven (No Public PoC) |
| CISA KEV Status | Not Listed |
A heap overflow condition is a buffer overflow, where the buffer that can be overwritten is allocated in the heap portion of memory, generally meaning that the buffer was allocated using a routine such as malloc().
CVE-2026-109481 is a high-severity Cross-Site Request Forgery (CSRF) vulnerability in the ASP.NET Core Blazor Server and interactive component architecture. The flaw exists within the internal circuit state synchronization endpoint (`/_blazor/refresh`), which fails to enforce antiforgery token validation or verify cross-origin request headers. By inducing an authenticated victim to issue a cross-site request targeting a pre-allocated circuit identifier, an unauthenticated attacker can bind the victim's security principal to the attacker's active SignalR circuit, resulting in full privilege elevation within the application scope.
A critical deserialization vulnerability exists in React Server Components (RSC) packages (`react-server-dom-webpack`, `react-server-dom-parcel`, and `react-server-dom-turbopack`) across versions 19.0.0 through 19.3.0. The flaw occurs during the processing of React Flight protocol streams when handling multiple typed arrays sharing a backing ArrayBuffer alongside attacker-controlled inputs. By combining byte-stream buffer detachment semantics with unvalidated thenable invocation and exposed internal response states, an unauthenticated attacker can achieve remote code execution on server runtimes supporting React Server Components.
An improper output neutralization vulnerability (CWE-117 / CWE-150) exists in compose-lint version 0.31.0. When compose-lint is invoked on untrusted file paths without a preceding '--' option delimiter, Python's standard argparse module rejects malformed or dash-prefixed paths and writes them directly to standard error without passing through the application's output sanitizer. An attacker submitting a pull request containing crafted directory or file names with carriage returns or Unicode whitespace can inject arbitrary CI workflow commands into GitHub Actions or Azure Pipelines job logs.
CVE-2026-125116 (GHSA-wr5m-5jph-8m96) is a type confusion vulnerability (CWE-843) in Mongoose, the MongoDB object modeling library for Node.js. When resolving discriminator models or schemas via user-supplied discriminator keys (defaulting to `__t`), Mongoose performs direct property indexing on plain JavaScript registry objects without verifying own-property ownership. Supplying inherited `Object.prototype` property names such as `'constructor'` causes Mongoose to resolve built-in functions rather than valid Mongoose constructors, resulting in unhandled runtime exceptions, schema validation bypasses, and persistent collection query denial of service.
A flaw in Mongoose's query condition casting pipeline causes the `sanitizeFilter` configuration option to be silently ignored when defined at the connection level via `mongoose.connect()` or `mongoose.createConnection()`. Because internal query methods inspect `Connection.options` rather than `Connection.config`, applications relying on connection-scoped filter sanitization remain vulnerable to NoSQL query selector injection (CWE-943), permitting authentication bypass and unauthorized data access across Mongoose versions 6.x through 9.x.
CVE-2026-125110 is a path canonicalization mismatch vulnerability in Rack (specifically within the Rack::Static middleware component). When serving static files, Rack normalizes the requested URL path to resolve the physical file on disk, but evaluates configured path-specific header rules against an unnormalized, raw path that has only undergone URL percent-decoding. Unauthenticated remote attackers can exploit this discrepancy by injecting raw or percent-encoded dot-segments into HTTP requests, causing Rack to serve restricted static assets without their intended security headers.