Repository navigation
Description
Executive summary
A buffer overflow vulnerability exists in the Brotli decompression library used by .NET. This vulnerability may allow an unauthenticated attacker to read or corrupt process memory. This could lead to information disclosure, denial of service, or elevation of privilege.
ASP.NET Core and HttpClient do not automatically decompress Brotli data in their default configurations. Applications are exposed when they enable Brotli decompression or explicitly use Brotli decompression APIs to process attacker-controlled data, as described below. .NET Framework is not affected.
Announcement
Announcement for this issue can be found at dotnet/announcements#494
CVSS Details
- Version: 3.1
- Severity: High
- Score: 8.1
- Vector:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C - Weakness: CWE-787 (Out-of-bounds Write)
Affected Platforms
- Platforms: All
- Architectures: All
Mitigations
ASP.NET Core request decompression and HttpClient automatic response decompression are not enabled by default. An application is not exposed merely because an affected .NET package is installed. Exposure requires the application to decompress attacker-controlled Brotli data through one of these paths:
- Enable ASP.NET Core automatic request decompression with Brotli (
br) support. - Enable HttpClient automatic response decompression by configuring HttpClientHandler.AutomaticDecompression or SocketsHttpHandler.AutomaticDecompression to include DecompressionMethods.Brotli or
DecompressionMethods.All. - Explicitly use Brotli decompression APIs in
System.IO.Compression, such asBrotliStreamorBrotliDecoder.
Until the update can be deployed, avoid decompressing attacker-controlled Brotli data.
The following examples show how to disable Brotli decompression if you are already using it.
Warning: Do not use these code snippets if you are not already using decompression. Do not introduce a call to
AddRequestDecompressionif your application does not already call it. Similarly, do not introduce anAutomaticDecompressionproperty assignment if your application does not already set that property. Modify only your existing decompression configuration. Enabling automatic decompression can introduce denial-of-service risks even when Brotli is excluded.
If you are already using Brotli request decompression in ASP.NET Core, exclude it by removing the br entry from your existing decompression configuration. This retains the default gzip and deflate providers:
builder.Services.AddRequestDecompression(options =>
{
options.DecompressionProviders.Remove("br");
});If your application already enables HttpClient automatic response decompression, disable Brotli by updating the flags on your existing handler so they do not include DecompressionMethods.Brotli:
var handler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
var httpClient = new HttpClient(handler);Applications that directly use Brotli decompression APIs must stop passing untrusted Brotli data to those APIs until updated. Ensure that other application code does not continue to decompress the same untrusted Brotli data. These changes can affect normal request and response handling and should be tested before deployment. Installing the security update remains the recommended fix.
Affected Packages
The vulnerability affects .NET applications using an affected Brotli decoder in the runtime or NativeAOT packages listed below.
.NET 8
.NET 9
.NET 10
.NET 11 previews
| Package name | Affected version | Patched version |
|---|---|---|
| Microsoft.DotNet.ILCompiler | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.android-arm | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.android-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.android-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.ios-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.iossimulator-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.iossimulator-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-arm | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-bionic-arm | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-bionic-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-bionic-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-musl-arm | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-musl-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-musl-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.linux-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.maccatalyst-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.maccatalyst-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.osx-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.osx-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.tvos-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.tvossimulator-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.tvossimulator-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.win-arm64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.win-x64 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.NativeAOT.win-x86 | >= 11.0.0-preview.1.26104.118, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.android-arm | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.android-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.android-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.android-x86 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.browser-wasm | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.ios-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.iossimulator-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.iossimulator-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.maccatalyst-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.maccatalyst-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.tvos-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.tvossimulator-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.tvossimulator-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.Mono.wasi-wasm | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.android-arm | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.android-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.android-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.browser-wasm | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.ios-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.iossimulator-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.iossimulator-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.linux-arm | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.linux-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.linux-bionic-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.linux-bionic-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.linux-musl-arm | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.linux-musl-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.linux-musl-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.linux-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.maccatalyst-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.maccatalyst-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.osx-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.osx-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.tvos-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.tvossimulator-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.tvossimulator-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.win-arm64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.win-x64 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
| Microsoft.NETCore.App.Runtime.win-x86 | >= 11.0.0-preview.1, < 11.0.0-rc.3.26522.148 | 11.0.0-rc.3.26522.148 |
Advisory FAQ
How do I know if I am affected?
You are affected if your application uses an affected Brotli decoder included in a package listed in affected packages, including a decoder linked into a NativeAOT application, to decompress attacker-controlled data. See mitigations for the affected usage paths and default settings.
How do I fix the issue?
Install the updated runtime or SDK for the .NET version used by your application. If your application directly references an affected package, update that reference to the patched version listed above.
| .NET release | Runtime | SDK versions |
|---|---|---|
| .NET 8 | 8.0.33 | 8.0.133, 8.0.427 |
| .NET 9 | 9.0.22 | 9.0.123, 9.0.320 |
| .NET 10 | 10.0.14 | 10.0.114, 10.0.403 |
| .NET 11 previews | 11.0.0-rc.3.26522.148 | 11.0.100-rc.3.26522.148 |
Download .NET from https://dotnet.microsoft.com/download/dotnet.
- If you're using .NET 8.0, you should download and install .NET 8.0.33 Runtime or .NET 8.0.133 or 8.0.427 SDK from https://dotnet.microsoft.com/download/dotnet-core/8.0.
- If you're using .NET 9.0, you should download and install .NET 9.0.22 Runtime or .NET 9.0.123 or 9.0.320 SDK from https://dotnet.microsoft.com/download/dotnet-core/9.0.
- If you're using .NET 10.0, you should download and install .NET 10.0.14 Runtime or .NET 10.0.114 or 10.0.403 SDK from https://dotnet.microsoft.com/download/dotnet-core/10.0.
- If you're using .NET 11.0, you should download and install .NET 11.0.0-rc.3.26522.148 Runtime or .NET 11.0.100-rc.3.26522.148 SDK from https://dotnet.microsoft.com/download/dotnet-core/11.0.
Once you have installed the updated runtime or SDK, restart your apps for the update to take effect.
If you have deployed self-contained applications, rebuild and redeploy those applications with the updated runtime.
For NativeAOT applications, update the SDK and any explicit compiler or runtime-pack references to patched versions, then republish and redeploy the application. Updating the machine's shared runtime alone does not replace a decoder already linked into a NativeAOT executable.
Other Information
Reporting Security Issues
If you have found a potential security issue in a supported version of .NET, please report it to the Microsoft Security Response Center (MSRC) via the MSRC Researcher Portal. Further information can be found in the MSRC Report an Issue FAQ.
Security reports made through MSRC may qualify for the Microsoft .NET Bounty. Details of the Microsoft .NET Bounty Program including terms and conditions are at https://aka.ms/corebounty.
Support
You can ask questions about this issue on GitHub in the .NET GitHub organization. The main repos are located at https://github.com/dotnet/runtime. The Announcements repo (https://github.com/dotnet/Announcements) will contain this bulletin as an issue and will include a link to a discussion issue. You can ask questions in the linked discussion issue.
Disclaimer
The information provided in this advisory is provided "as is" without warranty of any kind. Microsoft disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. In no event shall Microsoft Corporation or its suppliers be liable for any damages whatsoever including direct, indirect, incidental, consequential, loss of business profits or special damages, even if Microsoft Corporation or its suppliers have been advised of the possibility of such damages. Some states do not allow the exclusion or limitation of liability for consequential or incidental damages so the foregoing limitation may not apply.
External Links
Revisions
V1.0 (10/25/2026): Initial advisory.
Activity
dotnet-policy-service commentedon Oct 25, 2026
Tagging subscribers to this area: @dotnet/area-meta
See info in area-owners.md if you want to be subscribed.
earbona23 commentedon Nov 7, 2026
Retracted. Both points I posted here were wrong, and I am withdrawing them. I am leaving this note rather than deleting, so the record and the correction stay together.
1. I claimed no NuGet-ecosystem advisory existed for this CVE, so scanners report clean. False.
GHSA-p3jp-9v83-76w9is a NuGet advisory for this CVE, published 2026-11-03, covering 225 packages with explicit ranges —>= 10.0.0, < 10.0.14forMicrosoft.NETCore.App.Runtime.win-x64, and the matching ranges for 8.0, 9.0 and the 11.0 previews. It was sitting inside the OSV output I pasted as my own evidence, and I misread it as unrelated. Scanners that match on the GHSA id, which is what Dependabot and OSV do, flag this correctly.2. I claimed the patch is on
mainonly and absent from the public source of every release branch. False. I checked branch heads and not release tags, which is where serviced source lands:The
v9.0.22blob containsBROTLI_SAFE_WITH_STATUSfour times,BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCHonce, and the post-fixstatic BROTLI_INLINE BrotliDecoderErrorCode DecodeBlockTypeAndLength(signature. The fix is in the public source at the fixed tags. My branch-head comparison measured the wrong refs, and my assertion about how distribution packagers build was unverified and is withdrawn with the rest.The one narrow thing that does hold, stated as the much smaller observation it is: that NuGet advisory carries
cve_id: null, so a lookup keyed on the CVE id does not reach it.The sibling advisory from the same release,
GHSA-4mpw-cpwj-hxxj, does have itscve_idpopulated. That is the only difference I can still stand behind, it is a GitHub Advisory Database linkage question rather than a .NET one, and it is not worth this issue's attention.Sorry for the noise on a security advisory thread.