2016
Oct
01

網頁好讀版

很多系統與軟體都會使用 Secure Socket Layer (SSL) 3.0 中的 cipher-block chaining (CBC) 模式來做資料 的加解密,而這套演算法已經被發現漏洞,其中 POODLE 是最出名的攻擊方式, POODLE 全名 Padding Oracle On Downgraded Legacy Encryption ,它可以破解 web server 跟 web browser 之間的 SSLv3 傳輸加密。


SSL 3.0 是一種很舊的加密演算法,很早就已經要被 TLS 這個新的演算法取代了,只是有些舊的瀏覽器還在支援,例如 IE 6,7 ,即使 user 已經改用新版的瀏覽器,但是大部分的 Server 都很貼心,如果 client 只支援 SSLv3 演算法,那麼 server 就會自動改變加密方式,配合 client 使用舊的演算法 SSLv3 來加密,駭客可以利用這點來攻擊 Server。

POODLE 攻擊方式,駭客必須要有辦法控制 client side 送出 HTTPS Request,並有能力修改 Request (header) 的長度,簡單的說,駭客建一個 WIFI 的環境,讓 User 登入駭客所建立的 WIFI ,而這個 WIFI 機器會塞一段 JavaScript 程式到 user 正在看的網頁,透過 JavaScript 來送出 HTTPS Request ,等 WIFI 機器收到 HTTPS 加密過的 Request 後,再修改 Request 的長度送到網頁 Server Side ,這段訊息的傳送都有用 SSL 加密過,到這裡還是很安全的,但是 POODLE 有能力破解 SSL 加密機制,將透過 SSL 加密過的 Cookie 解開,這個駭客攻擊方式也是 Man-in-the-Middle 的一種。

以上雖看起來不是這麼容易達成,表面上很安全,不過現在免費 Wifi 非常流行,駭客只要把中繼站偽裝成免費的 Wifi 欺騙 User 來使用,那麼就可以很輕易的用 POODLE 盜取 User Cookie,而我們也非常習慣到處去連免費的 Wifi ,而且 Wifi 的名稱都是可以自由定義,駭客只要建一個 Wifi 叫 "Taiwan Free Wifi" ,我想應該會有一堆人登入吧。

解決方案

要停用網頁伺服器的 SSLv3/SSLv2 這兩種加密方式,你的伺服器有可能同時支援 TLS 與 SSL 兩種加密方式,或許你會認為現今的瀏覽器都會自動使用新版的 TLS 的來做 HTTPS 加密,所以我們的網站還是很安全的,不過現實是殘酷的,駭客只要故意偽裝成看不懂 TLS Protocol, TLS 會啟動另一個 Downgrade 機制,把加密方式降為舊版,所以停用 SSLv3/SSLv2 是必要的。

如果你的伺服器是使用 apache 支援 HTTPS ,那麼只要在 apache 設定補上下面兩行,禁止使用 SSLv3 與 SSLv2 即可。

httpd.conf
  1. SSLProtocol all -SSLv3 -SSLv2
  2. SSLCipherSuite HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!SSLv2:!SSLv3

Nginx 則是加入下面這行設定

Nginx
  1. ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

Node.js: Node v0.10.33 這一版已經移除 SSLv3 跟 SSLv2 ,所以只要你的 Node.js 版本大於 0.10.33 就不用擔心 POODLE 攻擊,但若是你的 Node.js 版本太舊,就必須加入下面這個設定顧用 SSLv3 。

Node Server
  1. var https = require("https");
  2. var constants = require('constants');
  3. var options = {
  4. secureProtocol: 'SSLv23_method',
  5. secureOptions: constants.SSL_OP_NO_SSLv3,
  6. }
  7. var server = https.createServer(options, app);

使用 cloudflare 來做 HTTPS

另一個方案是使用 cloudflare ,cloudflare 可以幫我們申請一個合法的 HTTPS Certificate ,並且它本身就是一個網頁中繼站,我們只要 HTTPS 加解密的處理邏輯交給 cloudflare ,cloudflare 再以 HTTP 的方式存取我們背後的真實伺服器,這樣 HTTPS 的安全問題就交給 cloudflare 就好囉。

  • User -> HTTPS request -> cloudflare -> HTTP request -> our web service

參考資料

網頁好讀版