SJ blog
security
A

信頼度ランク

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アプリの認証基盤を根本から崩す重大なバグだ。

対応の優先順位:

  1. 即時: Microsoft.AspNetCore.DataProtectionを10.0.7以上に更新してアプリを再デプロイ
  2. 同日: DataProtection鍵リングをローテーション(全ユーザーの再ログインが必要)
  3. 翌日: 脆弱期間中に発行した長期トークン(パスワードリセット・APIキー)を監査・失効

参考リンク