.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 приложение. Патчите сегодня.