HTTPS 降級攻擊的場景剖析與解決之道
HTTPS 一定安全麼
HTTP 協議,本身是明文傳輸的,沒有經過任何安全處理。那麼這個時候就很容易在傳輸過程中被中間者竊聽、篡改、冒充等風險。這裡提到的中間者主要指一些網路節點,是使用者資料在瀏覽器和伺服器中間傳輸必須要經過的節點,比如 WIFI 熱點,路由器,防火牆,反向代理,快取伺服器等。HTTP 協議,中間者可以竊聽隱私,使使用者的敏感資料暴露無遺;篡改網頁,例如往頁面插的廣告內容,甚至進行流量劫持,比如有的時候你會發現域名沒輸錯,結果卻跑到了一個釣魚網站上,因為被它劫持了。
此時,HTTPS 的價值就體現出來了。HTTPS 協議在應用層的 HTTP 協議和以及傳輸層 TCP 協議之間的會話層加入了 SSL/TLS 協議,用作加密資料包。在真正資料傳輸之前,進行握手通訊,握手的資訊交換主要包括:雙方確認加密協議的版本,確認身份(其中瀏覽器客戶端的身份有時是不需要確認的),確認傳輸真正資料的加密密碼(對稱加密)。在用作資訊傳輸的加密密碼確認之後,接下來的通訊資料都會加密後再傳輸,從而達到防竊取的作用。原理剖析,可以參考我之前的文章
那麼,使用了 HTTPS 就能確保安全傳輸了嗎?理論上,是的,但是,現實卻不是如此。
設計和實現 SSL/TLS 協議出現了漏洞,導致攻擊者同樣可以攻擊一些舊版本的 SSL/TLS 協議。這其中就包括 SSL 3.0。
什麼是 HTTPS 降級攻擊
攻擊者可利用 SSL 3.0 漏洞獲取安全連線當中某些是SSL3.0加密後的明文內容。因為相容性問題,當瀏覽器進行 HTTPS 連線失敗的時候,將會嘗試使用舊的協議版本,於是,加密協議由更加安全的協議,比如 TLS 1.2降級成 SSL 3.0。
如果伺服器提供有漏洞的 SSL 3.0 協議的支援,同時,攻擊者又能作為中間人控制被攻擊者的瀏覽器發起漏洞版本的 HTTPS 請求,那雖然攻擊者監聽到的也是加密過的資料,但因為加密協議有漏洞,可以解密這些資料。攻擊者可以利用此漏洞,截獲使用者的隱私資料,比如 Cookie,這樣攻擊者就可以拿到這些隱私資料,進行更深層次的攻擊,進而造成了使用者隱私的洩漏。
解決之道
目前,唯一解決問題的方法是禁用 SSL 3.0 加密協議,防止TLS 1.2 或者 TLS 1.1 或者 TLS 1.0降級到 SSL 3.0 加密協議。
禁用的策略有很多,這裡主要講解下 Nginx 如何防止 TLS 降級到 SSL 3.0 以下版本,從而防止 HTTPS 降級攻擊。
原先的配置如下。值得注意的是,隱性預設是SSLv3 TLSv1 TLSv1.1 TLSv1.2。
- ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
禁用的操作很簡單,現在改成這樣即可。
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
總結
HTTPS 能確保安全傳輸了嗎?答案是,不一定,因為舊的版本存在安全漏洞,可能會被攻擊者進行 HTTPS 的降級攻擊。所以,SSL 3.0 協議以下版本並不安全,因此,為了防止 HTTPS 的降級攻擊,我們需要禁用它。