Start Debugging

.NET 10.0.7 выходит out-of-band, чтобы закрыть CVE-2026-40372 в ASP.NET Core Data Protection

Дефект валидации HMAC в Microsoft.AspNetCore.DataProtection 10.0.0 до 10.0.6 позволяет атакующим подделывать ciphertexts. .NET 10.0.7 - обязательный фикс.

Microsoft сегодня выпустила .NET 10.0.7 out-of-band, чтобы закрыть CVE-2026-40372, баг elevation-of-privilege в Microsoft.AspNetCore.DataProtection, затрагивающий каждый релиз 10.0.x с 10.0.0 по 10.0.6. Если вы крутите ASP.NET Core на LTS-линии 10.0, это не апдейт “дождёмся Patch Tuesday”. Antiforgery tokens, auth cookies, TempData и всё остальное, что маршрутизируется через IDataProtector, живёт поверх этого компонента, так что радиус поражения покрывает большинство ASP.NET Core приложений в продакшне.

Как HMAC посчитался по не тем байтам

ASP.NET Core Data Protection использует authenticated encryption: ciphertexts несут HMAC-тег валидации, который framework проверяет на каждом вызове Unprotect. Managed-реализация в ManagedAuthenticatedEncryptor вычисляла этот тег по неправильному срезу payload и потом отбрасывала вычисленный хэш, что означает шаг валидации на самом деле не валидировал байты, которые контролирует атакующий. Это ломает обещание integrity конструкции и открывает дверь для того, чтобы подделанные токены принимались как настоящие.

Регрессия была внесена вместе с отдельным breaking change в servicing-релизе 10.0.6. Пользователи били в CryptographicException: The payload was invalid. при попытке расшифровать данные, защищённые на 10.0.5 или раньше, с ошибкой, всплывающей внутри ManagedAuthenticatedEncryptor.CalculateAndValidateMac. Пока команда гонялась за регрессией расшифровки отслеженной в aspnetcore#66335, они нашли более глубокий HMAC-баг, отсюда out-of-band релиз вместо того, чтобы вкатить это в майский servicing.

Двухслойный радиус поражения

Data Protection разведён почти в каждый сервис framework, которому нужно round-trip-ить непрозрачный state клиенту:

// 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
}

На 10.0.0 по 10.0.6 Unprotect - слабое звено. Сконструированный payload мог пройти проверку валидации, потому что encryptor не хэшировал те байты, которые утверждал, что хэширует. В сочетании с регрессией расшифровки 10.0.6 операторам оставался выбор между сломанным или уязвимым приложением. 10.0.7 убирает этот выбор.

Что сделать до закрытия вкладки

Обновите runtime и пакет вместе. Runtime везёт in-box encryptor, а NuGet-пакет везёт контракт для приложений, ссылающихся на него напрямую.

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

Несколько операционных заметок. Если вы задеплоили 10.0.6 и пользователи начали бить в CryptographicException: The payload was invalid., 10.0.7 восстанавливает совместимость с ciphertexts, написанными 10.0.5 и раньше, так что регрессия расшифровки разблокируется одновременно. Framework-dependent приложения подхватывают фикс при обновлении host runtime, но self-contained или AOT-опубликованные приложения требуют rebuild против 10.0.7. Если вы на 9.0.x или 8.0.x, этот CVE вас не затрагивает, но апрельский 2026 servicing-цикл всё равно применяется.

Out-of-band релизы .NET редки. Этот уже́ по scope, чем CVE-2025-55315, баг request-smuggling из прошлой осени, потому что эксплойт требует кода, вызывающего Unprotect на input, находящийся под влиянием атакующего. Это всё ещё описывает по сути каждое authenticated ASP.NET Core приложение. Патчите сегодня.

< Назад