CVE-2026-50648
This Vulnerability has been fixed in the Never-Ending Support (NES) version offered by HeroDevs.
Overview
.NET is a free, open-source, cross-platform framework for building modern apps and powerful cloud services. It consists of a runtime and a developer platform made up of tools, programming languages, and libraries for building many different types of applications.
A Denial of Service (DoS) vulnerability (CVE-2026-50648) has been identified in the transform-chain processing of the System.Security.Cryptography.Xml component, which allows attackers to exhaust memory on an application that processes attacker-influenced XML. Each transform in a chain keeps its per-transform working state alive until the whole chain finishes, so a crafted document driving a long transform chain accumulates unbounded memory.
Per CWE-770: Allocation of Resources Without Limits or Throttling, the product allocates a reusable resource or group of resources on behalf of an actor without imposing any restrictions on the size or number of resources that can be allocated, in violation of the intended security policy for that actor.
This issue affects .NET 6. On .NET 6, System.Security.Cryptography.Xml is not part of the shared framework; it ships as an opt-in NuGet package (https://www.nuget.org/packages/System.Security.Cryptography.Xml), so only applications that add an explicit package reference to it are exposed.
Details
Module Info
- Product: .NET
- Affected packages: System.Security.Cryptography.Xml
- Affected versions: System.Security.Cryptography.Xml >= 6.0.0 < 6.0.2
- GitHub repository: https://github.com/dotnet/runtime
- Published packages: Download .NET (Linux, macOS, and Windows)
- Package manager: NuGet
- Fixed in: NES for .NET 6.0.43
Vulnerability Info
This High-severity vulnerability is found in the System.Security.Cryptography.Xml package as shipped for .NET 6. TransformChain.TransformToOctetStream pumps the input through each transform in turn, reading the result of one transform as the input to the next. After a transform produces its output, its retained working state (canonicalized documents, crypto streams, node lists, licenses) is never released:
foreach (Transform transform in _transforms)
{
if (currentInput == null || transform.AcceptsType(currentInput.GetType()))
{
transform.Resolver = resolver;
transform.BaseURI = baseUri;
transform.LoadInput(currentInput);
currentInput = transform.GetOutput();
}
// ...
}
Any application that verifies a signature with SignedXml or decrypts a document with EncryptedXml funnels transform processing through this method and runs every transform in the attacker-controlled chain. Because each transform holds its intermediate state until the entire chain completes, a document driving a long chain accumulates memory in proportion to the chain length, independent of any per-chain transform-count limit. No privileges or user interaction are required, and the impact is availability only.
The fixed releases release each transform's retained state as soon as the chain moves past it, so working memory no longer grows with the length of the chain.
This vulnerability has been present since at least .NET 6.0 and likely earlier.
Mitigation
.NET 6 is End-of-Life and will not receive any updates to address this issue. For more information see .NET and .NET Core official support policy.
Users of the affected components should apply one of the following mitigations:
- Upgrade affected applications to one of:
- System.Security.Cryptography.Xml >= 8.0.4
- System.Security.Cryptography.Xml >= 9.0.18
- System.Security.Cryptography.Xml >= 10.0.10
- Leverage a commercial support partner like HeroDevs for post-EOL security support, including NES for .NET 6.0.43 or later.
Credits
Microsoft did not publicly credit an individual finder for this vulnerability in its security advisory.