Start Debugging

.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.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar