問題
在 ASP.NET 預設狀態下,伺服器會自動加上多個回應標頭(response headers),例如:
- Server
- X-AspNet-Version
- X-AspNetMvc-Version
- X-Powered-By
這些標頭會暴露底層伺服器、框架版本,對攻擊者來說是寶貴的資訊,用來挑選攻擊手法。
儘管我們可以透過 web.config 配置或程式碼移除這些標頭,但 Checkmarx 是依它的檢查規則,不會理會實際該 Header 是否有被移除。
Checkmarx 掃描規則重點
根據 Checkmarx 的 Information_Exposure_via_Headers 規則,專案需要在以下位置明確處理標頭:Global.asax.cs
1.Application_PreSendRequestHeaders
Method ,使用 HttpContext.Current.Response.Headers.Remove
去移除 Server(請注意,Checkmarx 不認 Response.Headers.Remove
),如下,
1 | protected void Application_PreSendRequestHeaders(object sender, EventArgs e) |
2.Application_Start
Method,要加上 MvcHandler.DisableMvcResponseHeader = true;
,如下,
1 | protected void Application_Start() |
結論
Checkmarx 會檢查 Global.asax.cs 中的程式,依它的掃描規則去找,找到就會噴 Information_Exposure_via_Headers 的 issue
即使實際上網頁不會有這些 Header,但 Checkmarx 只會依它的規則去看,不會理會真實的狀況如何。
針對這種個 Issue 的解法有很多,如果要解 Checkmarx 的 Issue 就依上述說明的方式去調整。