在密碼學(xué)和計(jì)算機(jī)安全領(lǐng)域中,中間人攻擊 ( Man-in-the-middle attack,通常縮寫為MITM )是指攻擊者與通訊的兩端分別創(chuàng)建獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通訊的兩端認(rèn)為他們正在通過一個(gè)私密的連接與對(duì)方直接對(duì)話,但事實(shí)上整個(gè)會(huì)話都被攻擊者完全控制。在中間人攻擊中,攻擊者可以攔截通訊雙方的通話并插入新的內(nèi)容。
1. 沒有對(duì)SSL證書進(jìn)行校驗(yàn);
2. 沒有對(duì)域名進(jìn)行校驗(yàn);
3. 證書頒發(fā)機(jī)構(gòu)(Certification Authority)被攻擊導(dǎo)致私鑰泄露等。攻擊者可通過中間人攻擊,盜取賬戶密碼明文、聊天內(nèi)容、通訊地址、電話號(hào)碼以及信用卡支付信息等敏感信息,甚至通過中間人劫持將原有信息替換成惡意鏈接或惡意代碼程序,以達(dá)到遠(yuǎn)程控制、惡意扣費(fèi)等攻擊意圖。
在各大漏洞平臺(tái)上,有大量存在HTTPS證書不校驗(yàn)漏洞,例如國內(nèi)絕大部分Android APP存在信任所有證書漏洞、亞馬遜最新官方Android版存在一處信任所有證書漏洞、Yahoo雅虎在國內(nèi)訪問遭遇SSL中間人攻擊、攜程旅游網(wǎng)最新Android客戶端https未校驗(yàn)證書導(dǎo)致https通信內(nèi)容完全被捕獲。
Android系統(tǒng)
1)中間人攻擊漏洞位置:
X509TrustManager 、HostnameVerifier 、 setHostnameVerifier (X509HostnameVerifier hostnameVerifier)
2) 漏洞觸發(fā)前提條件:
自定義的X509TrustManager不校驗(yàn)證書;
或?qū)崿F(xiàn)的自定義HostnameVerifier不校驗(yàn)域名接受任意域名;
或使用setHostnameVerifier (ALLOW_ALL_HOSTNAME_VERIFIER);
3) 漏洞原理:
由于客戶端沒有校驗(yàn)服務(wù)端的證書,因此攻擊者就能與通訊的兩端分別創(chuàng)建獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通訊的兩端認(rèn)為他們正在通過一個(gè)私密的連接與對(duì)方直接對(duì)話,但事實(shí)上整個(gè)會(huì)話都被攻擊者完全控制。在中間人攻擊中,攻擊者可以攔截通訊雙方的通話并插入新的內(nèi)容。
4.Android HTTPS中間人攻擊漏洞證明
1) 客戶端不校驗(yàn)SSL證書(包含簽名CA是否合法、域名是否匹配、是否自簽名證書、證書是否過期)包含以下幾種編碼錯(cuò)誤情況:
a. 自實(shí)現(xiàn)的不校驗(yàn)證書的X509TrustManager接口的Java代碼片段 (其中的checkServerTrusted()方法實(shí)現(xiàn)為空,即不檢查服務(wù)器是否可信):
b. 不檢查站點(diǎn)域名與站點(diǎn)證書的域名是否匹配的Java代碼片段:
c. 接受任意域名的Java代碼片段:
SSLSocketFactory sf;
……
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
2)針對(duì)某個(gè)不校驗(yàn)SSL證書的客戶端進(jìn)行中間人攻擊演示如下圖所示,可通過中間人劫持獲取到登錄用戶名和密碼(該密碼參數(shù)只是對(duì)明文密碼進(jìn)行了一次MD5):
對(duì)SSL證書進(jìn)行強(qiáng)校驗(yàn)
出于安全考慮,建議對(duì)SSL證書進(jìn)行強(qiáng)校驗(yàn)(簽名CA是否合法、證書是否是自簽名、主機(jī)域名是否匹配、證書是否過期等),詳細(xì)修復(fù)方案請(qǐng)參照Google官方關(guān)于SSL的安全建議。
文章來源:FreeBuf黑客與極客(FreeBuf.COM)