很多系统与软体都会使用 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 即可。
- SSLProtocol all -SSLv3 -SSLv2
- SSLCipherSuite HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!SSLv2:!SSLv3
Nginx 则是加入下面这行设定
- ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
Node.js: Node v0.10.33 这一版已经移除 SSLv3 跟 SSLv2 ,所以只要你的 Node.js 版本大於 0.10.33 就不用担心 POODLE 攻击,但若是你的 Node.js 版本太旧,就必须加入下面这个设定顾用 SSLv3 。
- var https = require("https");
- var constants = require('constants');
- var options = {
- secureProtocol: 'SSLv23_method',
- secureOptions: constants.SSL_OP_NO_SSLv3,
- }
- 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