OpenSSL CVE-2016-2107 漏洞分析
一. 前言
最近360信息安全部的戰友們夠辛苦的,連夜修復漏洞,外部漏洞(ImageMagick)太兇殘了,以致于連OpenSSL的洞都沒有泛起多少波瀾。
目前為外部企業服務的360天眼團隊和360安服團隊還在一線為企業救火。
回到這個OpenSSL的漏洞上,我們關注了下OpenSSL在5月份公布的 CVE-2016-2107。
然并卵,CVE-2016-2107卻是個現實幾乎無法利用的漏洞。
hf!
二.技術分析
攻擊者需要(苛刻的):
1、能控制受害者進行多次通信連接
2、能在受害者明文頭部添加數據(加密前)
3、能修改受害者明文數據(加密前)
4、能截斷和修改受害者發送的密文
5、能獲得服務器返回的數據
(有這些能力直接讀到明文好不好)
相關攻擊測試程序截圖:
服務器端 :
服務器端(當服務器那邊出:data length too long 那行就是成功測出1個字節 )
攻擊原理:
openssl 開啟 AES-NI 后,對 CBC 模式填充檢測邏輯存在漏洞,且握手未完成時服務器報錯信息以明文返回,
令攻擊者可利用(根據服務器不同響應)來探測特定位置的字節。
攻擊過程示例(以 AES-128-CBC 為例):
如用戶請求的秘密信息明文為“GET #/”,
那么加密包大概是這個樣子(不包含SSL頭):
31 81 3b 3d e3 54 cd fc 38 53 9c a5 61 de 42 ce
6a 98 94 b0 a2 40 ff 53 54 46 6a ea 47 0d 83 31
4a 55 04 86 a6 f4 8c 40 14 a5 5e 48 70 1d bf 90
加密前:
c5 cf b7 73 7c ec c4 70 b3 ce 78 7c 25 72 aa 6a
47 45 54 20 33 36 30 2e 63 6e 2f a5 f1 dc 9e 94
26 7a da 99 b4 88 34 e8 3a b8 92 b7 55 bc 3b 00
“47 45 54 20 33 36 30 2e 63 6e 2f”即為“GET #/”
假如攻擊者不能直接讀取到秘密信息明文,但其可以:
令用戶多次建立連接,在握手過程中,客戶端完成 “ChangeCipherSpec” 后,攻擊者令用戶發送秘密信息。
選擇此時,是因為握手尚未完成,服務器此時返回報錯信息是明文形式的,攻擊者可分辨。
首先,攻擊者以 31 個 0x?? 相同字節覆蓋加密前數據包后 31 字節:
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
47 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
不超過 256 次,當覆蓋 31 個 0x47 時:
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
收到服務器返回報錯信息為“02 16”(RECORD_OVERFLOW),否則收到報錯“02 14”(BAD_RECCORD_MAC),
由此可知用戶的秘密信息第一個字節為 0x47 (G)。
接著,攻擊者在加密前用戶秘密信息前插入 15 字節任意內容,并在尾部補 1 字節任意內容。
以 32 個 0x?? 相同字節覆蓋后 32字節,像這樣:
4f ee df 83 37 27 59 ee 6b 30 e7 94 dd df 87 cf
xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx <– 插入 15 任意字節
47 45 54 20 33 36 30 2e 63 6e 2f a5 f1 dc 9e 94
26 7a da 99 b4 88 34 e8 3a b8 92 b7 55 bc 3b 00
xx <– 補充 1 任意字節對齊
整理下:
4f ee df 83 37 27 59 ee 6b 30 e7 94 dd df 87 cf
xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 47
45 54 20 33 36 30 2e 63 6e 2f a5 f1 dc 9e 94 26
7a da 99 b4 88 34 e8 3a b8 92 b7 55 bc 3b 00 xx
覆蓋后:
4f ee df 83 37 27 59 ee 6b 30 e7 94 dd df 87 cf
xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 47
45 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
此時,要對加密后發送出的數據做截斷處理,僅發送后 48 字節(當然SSL頭也要修改 length 域,0x40 改為 0x30)
同樣,不超過 256 次,當覆蓋 ?? 值為 0x45 時,會收到報錯信息為 RECORD_OVERFLOW。
由此知用戶的秘密信息第二個字節為 0x45 (E)。
重復這個過程,即可解出其余秘密信息內容。
三.最后
希望360信息安全部、內部運營的OPS、Hulk平臺的各位同學身體健康,當然還有各位看客!
gl!
來自: http://blogs.#/blog/openssl-cve-2016-2107-漏洞分析/