Oct 14, 2026·5 min read·4 visits
Implicit type auto-conversion in WPF PresentationCore clipboard routines allowed untrusted data streams to be automatically deserialized, enabling arbitrary code execution upon accessing clipboard data.
A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.
A remote code execution vulnerability designated as CVE-2026-87697 affects Microsoft .NET runtimes and Windows Presentation Foundation (WPF) applications. The vulnerability carries a CVSS v3.1 base score of 8.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H) and is categorized under CWE-502 (Deserialization of Untrusted Data).
The impacted subsystem resides within System.Windows.Clipboard in the PresentationCore library. When a WPF application reads data from the system clipboard or processes typed data objects, implicit auto-conversion mechanisms force the framework to parse and coerce data formats. If an external or malicious process places a specially crafted serialized object stream onto the system clipboard, querying the clipboard triggers automatic deserialization within the target process context.
Because the deserialization occurs without explicit type checks or restrictions on format coercions, attackers capable of placing payloads onto the system clipboard or invoking automated data handling can achieve remote code execution in the context of the user running the application.
The root cause of CVE-2026-87697 lies in the default handling of the autoConvert parameter within data retrieval helper routines in PresentationCore/System/Windows/clipboard.cs. Specifically, the methods GetTypedDataIfAvailable and TryGetData explicitly invoked type retrieval methods using autoConvert: true when querying underlying ITypedDataObject or IDataObject implementations.
When autoConvert is set to true, the framework attempts to dynamically convert raw clipboard object streams into target application types. During this process, the .NET object deserialization pipeline processes raw binary streams or formatted object structures present on the system clipboard. Because deserialization occurs prior to type validation, standard object formatting channels invoke object constructor sequences and property setters on untrusted types.
Additionally, secondary root causes involve Windows Presentation Foundation (WPF) XPS document controls, where synthetic hyperlinks exposed through UI Automation (UIA) provider interfaces allowed automated tools or programmatic UI consumers to trigger navigation without applying strict origin or format sanitization checks.
The fix was applied in the dotnet/wpf repository under commit 0987b406ba6087cbe14fdff1c9b67dd0c83f9076. Analysis of the patch reveals that developers modified GetTypedDataIfAvailable to evaluate whether the requested format safely allows auto-conversion before passing the flag to the data object interface. Furthermore, TryGetData<T> was updated to explicitly pass autoConvert: false.
// File: src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/clipboard.cs
@@ -83,14 +83,16 @@ public static bool ContainsText(TextDataFormat format) => !DataFormats.IsValidTe
private static T? GetTypedDataIfAvailable<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(string format)
{
IDataObject? data = GetDataObject();
+ // Check if format permits auto-conversion explicitly
+ bool autoConvert = IsDataFormatAutoConvert(format);
if (data is ITypedDataObject typed)
{
- return typed.TryGetData(format, autoConvert: true, out T? value) ? value : default;
+ return typed.TryGetData(format, autoConvert, out T? value) ? value : default;
}
if (data is IDataObject dataObject)
{
- return dataObject.GetData(format, autoConvert: true) is T value ? value : default;
+ return dataObject.GetData(format, autoConvert) is T value ? value : default;
}
return default;
@@ -485,7 +487,7 @@ public static bool TryGetData<T>(
return false;
}
- // Enforce autoConvert: false for direct typed data extraction
- return dataObject.TryGetData(format, autoConvert: false, out data);
}The implementation flow transitions from unverified data object expansion to strict conversion boundary enforcement:
Unit tests added alongside the patch confirm that retrieving data in convertible formats without explicit format matching returns null rather than executing payload coercion routines.
Exploitation requires user interaction or automated clipboard polling within a vulnerable WPF host application. An attacker constructs a payload containing gadget chains compatible with standard .NET binary or object deserializers and writes this object to the system clipboard buffer.
When a user performs a paste action, or when the application programmatically calls Clipboard.GetText(), Clipboard.GetData(), or Clipboard.TryGetData(), PresentationCore reads the data object. Under the unpatched framework, the autoConvert: true flag instructs ITypedDataObject.TryGetData to deserialize the stream into the expected target type.
During deserialization, standard gadget chain mechanisms invoke arbitrary commands or arbitrary memory manipulation steps under the executing context of the logged-in user. Prerequisites include local or network delivery of payload data into the shared system clipboard or interaction with a WPF interface consuming clipboard contents.
Successful exploitation leads to full Unauthenticated Remote Code Execution (RCE) in the context of the user running the affected WPF application. If the application operates with administrative privileges, the attacker gains full system control, enabling persistence, data exfiltration, and lateral movement.
Confidentiality, Integrity, and Availability impacts are all rated High (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H). The vulnerability affects enterprise applications built on WPF running on Microsoft .NET 8.0, 9.0, 10.0, 11.0, and developer workstation instances hosted within Visual Studio 2022 and 2026.
No active public exploitation chains or CISA KEV entries are currently logged for this vulnerability, classifying its current exploit status as unproven (E:U).
To remediate CVE-2026-87697, software developers and system administrators must upgrade their .NET runtimes and SDKs to patched release versions. Microsoft has made updates available across all supported release channels.
In custom WPF application implementations that interact with IDataObject or ITypedDataObject directly, developers must review call sites and ensure autoConvert: false is explicitly specified when accepting object payloads from untrusted sources or clipboard handlers.
The patch effectively disables unintended object deserialization during generic type retrieval operations, providing complete remediation for the identified clipboard coercion vectors without breaking valid single-type extraction workflows.
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
.NET 8.0 Microsoft | >= 8.0.0, < 8.0.32 | 8.0.32 |
.NET 9.0 Microsoft | >= 9.0.0, < 9.0.21 | 9.0.21 |
.NET 10.0 Microsoft | >= 10.0.0, < 10.0.13 | 10.0.13 |
.NET 11.0 Microsoft | >= 11.0.0, < 11.0.0-rc.2 | 11.0.0-rc.2 |
Visual Studio 2022 Microsoft | >= 17.14.0, < 17.14.42 | 17.14.42 |
Visual Studio 2026 Microsoft | >= 18.10.0, < 18.10.4 | 18.10.4 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-502 |
| Attack Vector | Network (AV:N) |
| Attack Complexity | Low (AC:L) |
| Privileges Required | None (PR:N) |
| User Interaction | Required (UI:R) |
| CVSS v3.1 Score | 8.8 (HIGH) |
| Exploit Status | None / Unproven |
| CISA KEV Status | Not Listed |
The application deserializes untrusted data without sufficiently verifying that the resulting data will be valid.
An out-of-bounds write vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio allows unauthenticated remote attackers to execute arbitrary code via crafted pixel-shader bytecode or auto-converted clipboard payloads.
ASP.NET Core contains a thread deadlock vulnerability (CWE-833) that allows an unauthenticated remote attacker to cause a denial of service over the network by exhausting server thread pool resources.
CVE-2026-70035 is a high-severity Remote Code Execution (RCE) vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio caused by improper handling during the deserialization of untrusted data (CWE-502). An unauthenticated attacker can execute arbitrary code within the context of the affected process by delivering a crafted serialized payload.
An elevation of privilege vulnerability exists in ASP.NET Core and Microsoft Visual Studio due to improper synchronization during concurrent thread execution. Authenticated remote attackers with low privileges can exploit a timing window to manipulate shared resources and assume higher-level execution contexts.
A path traversal vulnerability (CWE-22) in Contao CMS allows unauthenticated remote attackers to bypass directory boundary restrictions in ImagesController and access files within the project directory.
Contao Open Source CMS versions 4.0.0 through 5.3.49 and 5.4.0-RC1 through 5.7.11 contain a Cross-Site Request Forgery (CSRF) vulnerability in backend parameter handling. The `RequestTokenListener` component validates anti-CSRF tokens solely for HTTP POST requests, while GET-based declarative guards run only when an `act` parameter is present in the query string. Consequently, custom backend actions dispatched via alternative parameters such as `key=` can execute without CSRF token verification when triggered by an authenticated user.