經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header

 
接續前幾篇系列






最近又遇到被若安掃描到高風險要修正的程式碼啦....
一看這還真是搞不懂該怎麼修呢



HSTS(HTTP Strict Transport Security) 
主要是一份國際標準規格 (RFC 6797) 的網際網路瀏覽安全機制,
用於宣告瀏覽器與伺服器之間通訊方式必須強制採用 TLS/SSL 加密通道。
只要從伺服器端送出一個 Strict-Transport-Security 標頭 (Header) 給瀏覽器,即可告知瀏覽器於未來的某段時間內一律使用 SSL 來和該網站連接 (設定可涵蓋所有子域名網站),
一旦發生憑證失效情況,使用者將無法再瀏覽該網站,如此一來便可大幅減少中間人攻擊的問題發生。

再更白話一點
HSTS Header 就是負責將 http 強制轉為 https


CheckMarx掃碼報告給的說明
============================================================
風險:
如果web config沒有設置HSTS表頭、"max-age"(有效期)不足一年,
或沒有設定"includeSubDomains"(包含所有子網域),可能會使用戶容易遭受中間人攻擊。



發生原因:
許多使用者只要在瀏覽器的網址列輸入網域名稱(Domain Name)即可瀏覽網站,
並沒有輸入協定(Protocol)的名稱。

瀏覽器會自動假設使用者使用的是HTTP協定而不是有加密機制的HTTPS協定。
在第一次發出前往特定網站的請求時,攻擊者可以執行中間人攻擊並將用戶轉址到攻擊者選擇的惡意網站。

為了保護用戶避免受到這種事件的影響,可以幫網站加上 HSTS header(HTTP強制安全傳輸技術),HSTS 會要求用戶的瀏覽器禁止使用不安全的HTTP協定來連接網站。

當支援HSTS功能的瀏覽器訪問了有設置 header 的網站,就不會透過HTTP與該網站通訊。
一旦為特定網站設定了HSTS header,只要還在“maxage”的期間內,HSTS的設定就依然有效,瀏覽器也會被要求阻擋用戶手動覆蓋和接受不受信任的SSL證書。建議“max-age”值(以秒為單位)的設定至少要一年(31536000秒)以上。

如何避免:
在設定 HSTS header 前 - 請先考慮設定後的影響:
  • 強制使用https會阻檔某些需要使用HTTP的狀況,例如功能測試
  • 關閉HSTS並不容易,除了替網站關閉HSTS,客戶的瀏覽器上也要關閉,才能再次使用http連線

在應用程式的程式碼中明確設定HSTS header,或是設定在web config檔中。

確認HSTS表頭的“max-age”值設置為31536000(含)以上,保證HSTS的有效期至少有一年。

一旦使用HSTS表頭並將網頁應用程式的地址提交到HSTS preload list,能夠確保即使使用者是第一次訪問這個網頁應用程式,支援HSTS preload list的瀏覽器會直接將使用者導入到Https協定。但需要注意的是,想要使用HSTS preload list服務,需要有受信任的SSL證書並且設定“max-age”至少1年(31536000秒)的HSTS標頭。

注意, 這個弱點判斷程式碼中沒有設定 HSTS header時,會從全部的 response中,標記第一個案例作為弱點代表。所以如果只針對指出的案例進行修復,下一次掃描還會再顯示第二個案例,因此建議針對整個應用程式的安全性進行 HSTS header的部署。

在程式碼中設定HSTS時,需要確認整個應用程式都有一併設定完成;若是設定在config檔中則要確保設定是適用於整個應用程式。

若IIS版本為IIS 10.0 Version 1709 之前,無法支援在web.config 上設定HSTS
Header時,可以參考https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10-version -
1709/iis-10-version-1709-hsts#solution-2-url-rewrite-module在 IIS 中使用URL
Rewrite的方式處理,設定後Checkmarx 8.8.0版會視為已消毒。

============================================================


所以解方通常可以類似直接在web.config做全域設定

1
2
3
4
5
6
7
<system.webServer>
   <httpProtocol>
     <customHeaders>
      <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
     </customHeaders>
   </httpProtocol>
</system.webServer>

max-age=31536000:
告訴瀏覽器將域名緩存到STS list裏面,時間是一年。 


max-age=31536000; includeSubDomains:
告訴瀏覽器將域名緩存到STS list裏面並且包含所有的子域名,時間是一年。




或者手動用code添加

1
Response.AddHeader("Strict-Transport-Security", "max-age=31536000");








Ref:
HTTP Strict Transport Security Cheat Sheet
Strict-Transport-Security

ASP.NET HTTPS redirect & HSTS headers

Adding "<add name="Strict-Transport-Security" value="max-age=31536000"/> is giving ERROR 403- Access Denied

Custom Headers <customHeaders>

修正 ASP.NET MVC 常見 Checkmarx 原碼檢測漏洞 (Fix ASP.NET MVC Common Vulnerability Scan by Checkmarx)


AppScan扫描.NET站点漏洞及修复

留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念