.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 приложение. Патчите сегодня.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.