信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
CVE-2026-40372(CVSS 9.1):ASP.NET Core Data ProtectionのHMACバグが全認証Cookieを偽造可能にした——.NET 10.0.0〜10.0.6が対象、即時10.0.7へ更新+鍵ローテーション必須
Microsoft.AspNetCore.DataProtection 10.0.0〜10.0.6に存在するHMACの計算誤りにより、攻撃者がゼロバイトHMACで認証Cookieを偽造できる。CVSS 9.1、主にLinux/macOS上の.NET 10アプリが対象。10.0.7へのアップグレードに加え、DataProtection鍵リングのローテーションが必須。
一言結論
CVE-2026-40372はASP.NET Core Data ProtectionのHMAC実装バグで、攻撃者がオールゼロHMACの認証Cookieを偽造しアプリへの不正アクセスが可能。.NET 10.0.7への即時アップグレードと鍵リングのRevokeAllKeys()によるローテーションが必要で、脆弱期間中に発行されたAPIキーやパスワードリセットリンクの監査も行うべきだ。
概要
2026年4月21日、MicrosoftはASP.NET Coreのリリースサイクル外の緊急パッチとして**.NET 10.0.7をリリースした。対象はCVE-2026-40372**(CVSS 9.1 CRITICAL)——Microsoft.AspNetCore.DataProtectionのHMAC計算に含まれるリグレッションバグで、攻撃者がペイロードのHMACを偽造して認証済みユーザーとしてアプリケーションにアクセスできる。
影響を受けるNuGetパッケージバージョンは10.0.0〜10.0.6。10.0.7で修正済み。
技術的な根本原因
ASP.NET Core Data Protection APIは認証Cookie・アンチフォージェリトークン・Blazorサーバーの状態・セッションデータなど「改ざんを検知すべきデータ」をHMAC-SHA256で保護している。
ところがDataProtection 10.0.0のリリース時に混入したリグレッションにより、マネージドAE暗号化エンクリプタがHMACを計算する対象がペイロードの誤った部分になり、場合によってはHMAC値を完全に破棄していた。
正常動作:
HMAC = HMAC-SHA256(key, plaintext_payload + IV + ciphertext)
protected = IV + ciphertext + HMAC
リグレッション後:
HMAC = HMAC-SHA256(key, <誤った範囲> or <空バッファ>)
→ 検証時に "ゼロバイトHMAC" でも有効と判定される場合がある
弱点分類はCWE-347: Improper Verification of Cryptographic Signature。MS10-070のpadding oracle攻撃と同様の構造で、署名検証の欠陥を突く攻撃だ。
攻撃者が実行できること
1. 任意のユーザーID・ロールを含む認証ペイロードを構築
2. HMACをゼロバイト(または特定パターン)で埋めて Cookie を偽造
3. その Cookie を使って対象アプリに管理者・特権ユーザーとしてリクエスト
4. アプリが Cookie を正規と判定し、セッションを開始
5. セッションリフレッシュにより正規署名のトークンが発行される(パッチ後も有効)
さらに深刻なのは、脆弱期間中に攻撃者が取得したトークンは正規のDataProtection鍵で署名されているため、10.0.7へのアップグレードだけでは無効化できない点だ。鍵リングのローテーションまで、盗まれたセッションは継続して有効なままになる。
影響を受ける構成
| 条件 | 影響 |
|---|---|
| .NET 10.0.0〜10.0.6 + Linux/macOS | 主要な影響あり |
| .NET 10.0.0〜10.0.6 + Windows + net462 / netstandard2.0 | 影響あり |
| .NET 8・.NET 9・それ以前 | 影響なし |
| .NET 10.0.7以降 | 影響なし |
Data Protection APIを使用するコンポーネントの例:
app.UseAuthentication()/ Cookie認証ミドルウェアIAntiforgeryサービス(ASP.NET MVCのCSRF保護)- Blazor Server(サーキットステート暗号化)
IDataProtectorを直接使うカスタムコード
修正手順
1. NuGetパッケージを10.0.7へアップグレード
# .csprojでバージョン確認
grep -r "AspNetCore.DataProtection" *.csproj
# アップデート
dotnet add package Microsoft.AspNetCore.DataProtection --version 10.0.7
# すべてのプロジェクトを更新
dotnet list package --outdated | grep DataProtection
2. DataProtection鍵リングをローテーション
アップグレードだけでは不十分。脆弱期間(10.0.0リリース日〜パッチ適用日)に発行されたすべての保護済みデータが無効化されるまで攻撃者のセッションは有効のままだ。
// スタートアップ時またはメンテナンスウィンドウ中に実行
using var scope = app.Services.CreateScope();
var keyManager = scope.ServiceProvider.GetRequiredService<IKeyManager>();
// 既存の全鍵を失効させ、新しい鍵で置き換え
keyManager.RevokeAllKeys(DateTimeOffset.UtcNow, "CVE-2026-40372 emergency rotation");
⚠️ 鍵ローテーション後はすべての既存セッションが無効になり、ユーザーは再ログインが必要になる。メンテナンス計画が必要だ。
3. 長期有効トークンの監査と失効
パスワードリセットリンク・APIキー・メール確認リンクなどDataProtectionで保護された長期トークンが発行されていた場合、それらも攻撃者が偽造している可能性がある。
-- 例: パスワードリセットトークンのログを確認
SELECT user_id, created_at, used_at
FROM password_reset_tokens
WHERE created_at BETWEEN '2026-XX-XX' AND '2026-04-21'
AND used_at IS NULL;
タイムライン
| 日付 | イベント |
|---|---|
| 2026年4月21日 | Microsoftがアドバイザリ公開、.NET 10.0.7リリース |
| 2026年4月29日 | BleepingComputerなどが広く報道、緊急対応勧告 |
| 2026年5月1日(現在) | パッチ適用率が低い状態が継続 |
落とし穴・注意点
- Docker/コンテナデプロイ: ベースイメージを更新するだけでなく、アプリのNuGetパッケージ自体を更新してリビルドする必要がある
- 複数プロジェクトのソリューション:
Microsoft.AspNetCore.DataProtectionが推移的依存で入っているプロジェクトも確認する - Azure App ServiceのSCM(Kudu): App Serviceのランタイム更新とアプリのパッケージ更新は別。両方必要。
- 鍵の保存場所: ファイルシステム(デフォルト)・Redis・Azure Blob Storageなどに保存された鍵は
RevokeAllKeys()では削除されないが、失効フラグが立ち使用不可になる
まとめ
CVE-2026-40372は.NET 10アプリの認証基盤を根本から崩す重大なバグだ。
対応の優先順位:
- 即時:
Microsoft.AspNetCore.DataProtectionを10.0.7以上に更新してアプリを再デプロイ - 同日: DataProtection鍵リングをローテーション(全ユーザーの再ログインが必要)
- 翌日: 脆弱期間中に発行した長期トークン(パスワードリセット・APIキー)を監査・失効