觀點 · 資訊分享
ASP.NET Core DataProtection 爆 9.1 分漏洞:登入 cookie 可能被偽造,升 10.0.7 還要評估換金鑰環
微軟公布 CVE-2026-40372:Microsoft.AspNetCore.DataProtection 10.0.0 到 10.0.6 在特定環境下,攻擊者可能偽造登入 cookie。修正版是 10.0.7,但官方提醒升版不等於結束,已簽發的憑證還要檢查。
- 發布
- 2026-04-22
- 篇幅
- 約 6 分鐘 · 2,815 字
- 結構
- 8 節 + 4 題常見問題
- 標籤

一句話看懂:ASP.NET Core 的
Microsoft.AspNetCore.DataProtection10.0.0 到 10.0.6 有個 9.1 分漏洞,在特定環境下攻擊者可能偽造登入 cookie;升到 10.0.7 之後,官方還要求評估是否輪替金鑰環。

先用白話講:DataProtection 是什麼?
ASP.NET Core 網站有個內建元件叫 DataProtection,負責把登入 cookie、防偽造 token(antiforgery)、重設密碼連結這類東西加密,再蓋上一個「防偽章」(簽章,技術上是 HMAC)。
像寄掛號信:信封要封好,還要蓋只有你才有的騎縫章。伺服器收到信,先驗章,章對才相信裡面的內容。
這次出問題的就是「驗章」那一步。官方說,被偽造的內容帶的防偽章欄位全是 0,在受影響的環境下卻可能被當成真的。
發生什麼事
- 微軟在 dotnet/announcements 發布安全公告,公告記載的日期是 2026 年 4 月 21 日(台灣時間約 4 月 22 日凌晨)
- 編號 CVE-2026-40372,類型是權限提升(Elevation of Privilege),CVSS 3.1 分數 9.1,嚴重度 Important
- 向量是 AV:N/AC:L/PR:N/UI:N:從網路就能打、難度低、不需要先登入、也不需要使用者配合
- 受影響:
Microsoft.AspNetCore.DataProtection10.0.0 到 10.0.6;修正版:10.0.7 - 後果:攻擊者可能偽造驗證 cookie,也可能解密部分受保護的內容
更麻煩的是後續效應。官方說,如果攻擊者用偽造身分登入成高權限使用者,可能誘使網站簽發出合法簽章的憑證,例如刷新 session、API Key、重設密碼連結。這些憑證在升級到 10.0.7 後依然有效,除非輪替 DataProtection 的金鑰環。
後續:GitHub 的安全公告 GHSA-9mv3-2cwr-p262 在 2026 年 4 月 23 日才公開;NVD 的 CVE 紀錄發布時間則在 2026 年 4 月 21 日。
我有沒有中?
不是用了 10.0 就一定中。公告把條件拆得很細:
| 情境 | 是否受影響 |
|---|---|
| 參考 10.0.6,實際載入的是 NuGet 那份,且跑在 Linux、macOS 等非 Windows 系統 | 受影響(官方列為主要情境) |
| 參考 10.0.0 到 10.0.6,但專案不是 net10.0(例如 net8.0、net9.0),建置時用到 net462 或 netstandard2.0 的版本 | 受影響,不分作業系統(次要情境,官方認為數量少很多) |
| 主要情境,但跑在 Windows | 不受影響 |
| net10.0 框架相依部署,且主機上 ASP.NET Core 共享框架版本不低於套件版本 | 不受影響(共享框架 10.0.6 搭配套件 10.0.6 安全;共享框架 10.0.5 搭配套件 10.0.6 則不安全) |
| 用的是 8.0.x 或 9.0.x 版套件 | 不受影響 |
另外公告提醒,套件可能是間接參考進來的,例如 .StackExchangeRedis、.EntityFrameworkCore、.AzureKeyVault、.AzureStorage 這些延伸套件。
該怎麼做
官方列出三個必做、兩個建議:
- 升級到 10.0.7 或更新並重新部署:修正後,帶著全 0 防偽章的偽造內容會被拒絕
- 輪替金鑰環:如果受影響的站台在這段期間對網際網路開放,要把金鑰環撤銷,讓攻擊者可能拿到的合法簽章憑證失效。代價是所有使用者都要重新登入,antiforgery token 也會重新簽發。若能確定哪些金鑰是在受影響期間使用的,也可以只撤銷那幾把
- 盤點長效憑證:金鑰輪替擋不到已經存進資料庫的東西,包括 API Key、refresh token、access token,以及還沒過期的重設密碼與信箱驗證連結,要在應用程式層自己作廢。如果你的網站不會經由登入後的端點簽發這類長效物件,只輪替金鑰環就夠了
- (建議)檢查有沒有把長效機密(連線字串、第三方 API Key)放進
Protect的輸出裡;有的話,視為可能外洩,到來源端換掉 - (建議)查伺服器日誌:這類攻擊每還原一個位元組都要送很多請求,所以會看到針對某個需驗證端點、cookie 或查詢參數不斷變動的大量請求
給開發者的技術細節
我自己的做法(不是公告內容):先在方案根目錄列出所有相依,包含間接參考:
dotnet list package --include-transitive
找 Microsoft.AspNetCore.DataProtection 開頭的套件,確認版本是否落在 10.0.0 到 10.0.6。再看部署環境是 Linux 容器還是 Windows,以及執行時的共享框架版本。
官方示範的撤銷作法,是在能存取同一份金鑰環的程式裡跑一次 IKeyManager:
var keyManager = services.GetRequiredService<IKeyManager>();
// 撤銷目前金鑰環內所有金鑰,下次加密時會自動產生新金鑰
keyManager.RevokeAllKeys(DateTimeOffset.UtcNow, "CVE-2026-40372 輪替");
要更精準,可用 RevokeKey(Guid keyId, string reason) 只撤銷受影響期間使用的金鑰。
官方沒有說明的事:是否已有實際被利用的案例;自包含(self-contained)部署算不算受影響;輪替後,以前用 Protect 加密存起來的資料還能不能解開。這些建議先在測試環境確認,不要憑感覺。
我的看法
對接案或維護中小企業網站的人,我覺得這則有三個重點:
- 先分辨自己是哪一種。多數網站用的是共享框架,只要主機上的執行環境夠新,載入的就是框架那份;真正危險的是套件版本被釘在 10.0.6、但容器映像或主機的執行環境比它舊。映像檔很久沒更新的站台要特別看
- 升版只是第一步。這類漏洞麻煩在於可能已經簽出合法憑證。對小型網站來說,輪替金鑰環的代價多半是「大家重新登入一次」,比起被冒充管理員,這個成本我覺得可以接受
- 向客戶說明時別只講版本號。要一併講清楚:升級日期、是否輪替、哪些憑證被作廢,這樣對方才知道事情處理到哪
名詞小辭典
- DataProtection:ASP.NET Core 內建的加密與簽章元件,登入 cookie 等資料靠它保護
- HMAC:用金鑰算出來的防偽章,用來確認內容沒被改過
- 金鑰環(key ring):DataProtection 用來加密與簽章的一組金鑰,輪替它等於換鎖
- 權限提升(Elevation of Privilege):原本沒資格的人,取得更高的權限