1. 程式人生 > >HTTPS 降級攻擊的場景剖析與解決之道

HTTPS 降級攻擊的場景剖析與解決之道

HTTPS 一定安全麼

HTTP 協議,本身是明文傳輸的,沒有經過任何安全處理。那麼這個時候就很容易在傳輸過程中被中間者竊聽、篡改、冒充等風險。這裡提到的中間者主要指一些網路節點,是使用者資料在瀏覽器和伺服器中間傳輸必須要經過的節點,比如 WIFI 熱點,路由器,防火牆,反向代理,快取伺服器等。HTTP 協議,中間者可以竊聽隱私,使使用者的敏感資料暴露無遺;篡改網頁,例如往頁面插的廣告內容,甚至進行流量劫持,比如有的時候你會發現域名沒輸錯,結果卻跑到了一個釣魚網站上,因為被它劫持了。

此時,HTTPS 的價值就體現出來了。HTTPS 協議在應用層的 HTTP 協議和以及傳輸層 TCP 協議之間的會話層加入了 SSL/TLS 協議,用作加密資料包。在真正資料傳輸之前,進行握手通訊,握手的資訊交換主要包括:雙方確認加密協議的版本,確認身份(其中瀏覽器客戶端的身份有時是不需要確認的),確認傳輸真正資料的加密密碼(對稱加密)。在用作資訊傳輸的加密密碼確認之後,接下來的通訊資料都會加密後再傳輸,從而達到防竊取的作用。原理剖析,可以參考我之前的文章

《HTTPS原理剖析與專案場景》

那麼,使用了 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。

  1. ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

禁用的操作很簡單,現在改成這樣即可。

  1. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

總結

HTTPS 能確保安全傳輸了嗎?答案是,不一定,因為舊的版本存在安全漏洞,可能會被攻擊者進行 HTTPS 的降級攻擊。所以,SSL 3.0 協議以下版本並不安全,因此,為了防止 HTTPS 的降級攻擊,我們需要禁用它。