經得起原始碼資安弱點掃描的程式設計習慣培養(五)_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站点漏洞及修复
留言
張貼留言