.NET 10.0.7 sai out-of-band para consertar CVE-2026-40372 no ASP.NET Core Data Protection
Uma falha de validação HMAC no Microsoft.AspNetCore.DataProtection 10.0.0 até 10.0.6 permite que atacantes forjem ciphertexts. .NET 10.0.7 é o fix obrigatório.
A Microsoft lançou .NET 10.0.7 out-of-band hoje para corrigir CVE-2026-40372, um bug de elevation-of-privilege no Microsoft.AspNetCore.DataProtection que afeta toda release 10.0.x do 10.0.0 ao 10.0.6. Se você roda ASP.NET Core na linha LTS 10.0, essa não é uma atualização de “espere o Patch Tuesday”. Antiforgery tokens, auth cookies, TempData, e qualquer coisa roteada por IDataProtector vive em cima desse componente, então o raio de explosão cobre a maioria das apps ASP.NET Core em produção.
Como o HMAC foi computado sobre os bytes errados
ASP.NET Core Data Protection usa criptografia autenticada: os ciphertexts carregam uma tag de validação HMAC que o framework checa a cada chamada Unprotect. A implementação managed em ManagedAuthenticatedEncryptor estava computando essa tag sobre a fatia errada do payload e depois descartando o hash computado, o que significa que o passo de validação não estava de fato validando os bytes que o atacante controla. Isso quebra a promessa de integridade da construção e abre porta para tokens forjados serem aceitos como genuínos.
A regressão foi introduzida junto com uma breaking change separada na release de servicing 10.0.6. Usuários batiam em CryptographicException: The payload was invalid. tentando descriptografar dados que haviam sido protegidos no 10.0.5 ou anterior, com o erro subindo dentro de ManagedAuthenticatedEncryptor.CalculateAndValidateMac. Enquanto o time perseguia a regressão de descriptografia rastreada em aspnetcore#66335, acharam o bug HMAC mais profundo, daí a release out-of-band em vez de jogar no servicing de maio.
O raio de explosão em duas camadas
Data Protection está fiado em quase todo serviço do framework que precisa fazer round-trip de estado opaco para o cliente:
// Antiforgery, auth cookies, TempData, BearerToken, OpenIdConnect state,
// and your own IDataProtector consumers all flow through the same pipeline.
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"/var/keys"))
.ProtectKeysWithCertificate(cert);
public class TokenService(IDataProtectionProvider provider)
{
private readonly IDataProtector _protector =
provider.CreateProtector("TokenService.v1");
public string Protect(string userId) => _protector.Protect(userId);
public string Unprotect(string token) => _protector.Unprotect(token); // trusts the MAC
}
Do 10.0.0 ao 10.0.6, Unprotect é o elo fraco. Um payload bem feito poderia passar a validação porque o encryptor não estava hasheando os bytes que alegava hashear. Combinado com a regressão de descriptografia 10.0.6, operadores ficaram com uma escolha entre uma app quebrada ou uma vulnerável. O 10.0.7 remove essa escolha.
O que fazer antes de fechar a aba
Atualize o runtime e o pacote juntos. O runtime embarca o encryptor in-box, e o pacote NuGet embarca o contrato para apps que o referenciam diretamente.
# 1. Install the 10.0.7 SDK or runtime from the download page,
# then verify:
dotnet --info
# 2. Bump the package if your project pins it explicitly:
dotnet add package Microsoft.AspNetCore.DataProtection --version 10.0.7
# 3. Rebuild and redeploy. Existing key rings stay valid; this fix
# does not force a key rotation.
Algumas notas operacionais. Se você deployou 10.0.6 e usuários começaram a bater em CryptographicException: The payload was invalid., o 10.0.7 restaura compatibilidade com ciphertexts escritos por 10.0.5 e anteriores, então a regressão de descriptografia desbloqueia ao mesmo tempo. Apps framework-dependent pegam o fix quando o runtime do host é atualizado, mas apps self-contained ou AOT-publicadas precisam de um rebuild contra o 10.0.7. Se você está no 9.0.x ou 8.0.x, não está afetado por esse CVE, mas o ciclo de servicing de abril 2026 ainda se aplica.
Releases out-of-band do .NET são raras. Essa é mais estreita em escopo do que CVE-2025-55315, o bug de request-smuggling do outono passado, porque exploração precisa de código que chame Unprotect em input influenciado por atacante. Isso ainda descreve essencialmente toda app ASP.NET Core autenticada. Patch hoje.