<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/12729

            Author:[email protected]

            0x00 前言


            2016年1月28日,OpenSSL官方發布了編號為?CVE-2016-0701?的漏洞。該漏洞發生在OpenSSL?1.0.2?版本中(OpenSSL?1.0.2f和以后版本不受影響),在使用DH算法時對不同客戶端使用了相同私鑰和不安全的大素數,導致攻擊者可以通過降階的攻擊方式(或者是秘鑰恢復估計)來獲取服務器端的私鑰,從而解密tls。

            360云安全團隊的au2o3t對官網和發現者Antonio?Sanso提供的實現存在疑惑,并提供了一份我們認為是正確的漏洞分析(歡迎反饋)。

            hf

            0x01 分析


            p1 ^領導說了必須得有圖^

            看了CVE-2016-0701?發現者Antonio?Sanso的博文(參考1),?對其中的攻擊步驟“calculate?yb?=?g*xa?(mod?p)?*?B”和“yb^xa?*?B^xa?(mod?p)”的由來百思而始終不得其解,并且一直對文檔中以及openssl官方中所描述需要“多次握手”頗有疑惑(參考2)。

            經過一番研究,總算實現了攻擊并找到了理論證明。

            事實上,攻擊者并不需要多次握手。只要握手一次,獲得服務器公鑰即可。

            而Antonio?Sanso文中出現的“calculate?yb?=?g*xa?(mod?p)?*?B”和“yb^xa?*?B^xa?(mod?p)”依舊不知所云,似是毫無用處。 ? 所謂私鑰恢復攻擊,實質上是對不安全素數的降階攻擊。

            安全素數也叫蘇菲·姬曼(Sophie?Germain)素數,如果?p1?是素數,p2?=?p1*2+1?也是素數,那么?p2?就是安全素數,反之則是不安全的。 ? DH密鑰交換算法的安全性基于有限域上離散對數的難解性,而其保障正是強素數模。 ? 服務器隨機產生私鑰?xb,計算公鑰?yb?=?g^xb?mod?p?(DH中,素數?p?和?g?是公開的)。

            若其中?p?不夠強(不是安全素數),則?p-1?可被分解為若干素因子,這正是攻擊者可利用之處。

            攻擊者已知?g,p,yb?的情況:

            若p-1可被因式分解為若干小因子,則可進行降階攻擊。 ? 原式(yb?=?g^xb?mod?p)中,由于?orb(g)?值很大,難以暴力破解。

            但?p-1?可分解的情況,可對其降階:

            令?g’?=?g^((p-1)/q)?mod?p,其中?q?是?p-1?的一個素因子,則?g’?的階降低為?q,

            那么?g’^xb?mod?p?=?g’^(xb?mod?q)?mod?p?=?yb^((p-1)/q)。 ? 至多?q?次,可以暴力得到?x’?=?xb?mod?q?值(其實至多?q^(1/2)次可得), ? 按此法,若能得到?p-1?的若干素因子?q1,q2,q3。。。

            則同理可得,g1,g2,g3。。。及?y1,y2,y3。。。

            即可以較低復雜度計算出?x1?=?xb?mod?q1,x2?=?xb?mod?q2,x3?=?xb?mod?q3。。。 ? 于是由中國剩余定理可得:

            xb?= (?x1*q1’*q2*q3*...+?x2*q1*q2’*q3*...+?x3*q1*q2*q3’...+?...?)?mod?q1*q2*q3*....

            q1’*q2*q3*...=?1?mod?q1,q1*q2’*q3*...?=?1?mod?q2?...?見“中國剩余定理”)

            實現攻擊的時間復雜度取決于?p-1?分解出的最大素因子長度。

            驗證:

            為方便快速驗證原理,不妨取一較小?p?值,如?p?=?192271,g?=?2。

            易知,p-1?可分解為?2?*?3?*?5?*?13?*?17?*?29。 ? 假設服務器取隨機私鑰?xb?=?34567,那么其公鑰?yb?=?2^34566?mod?192271?=?44402。 ?

            則攻擊方已知量為?p?=?192271,g?=?2,?yb?=?44402,由此3量我們來嘗試計算其私鑰?xb: ? 由于?p-1?可分解為?2?*?3?*?5?*?13?*?17?*?29

            設?q1?=?2,q2?=?3,q3?=?5,q4?=?13,q5?=?17,q6?=?29。 ? 依上面公式?g’?=?g^((p-1)/q)?mod?p,可計算:

            g1?=?g^((p-1)/q1)?mod?p?=?2^(192270/2)?mod?192271?=?1,同理:
            g2?=?2^(192270/3)?mod?192271?=?136863,
            g3?=?2^38454?mod?192271?=?118548,
            g4?=?2^14790?mod?192271?=?95011,
            g5?=?2^11310?mod?192271?=?141591,
            g6?=?2^6630?mod?192271?=?148926,
            

            ? ? 同樣計算?y’?=?yb^((p-1)/q)?可得:

            y1?=?1,
            y2?=?136863,
            y3?=?156372,
            y4?=?1,
            y5?=?188120,
            y6?=?190612,
            

            ? ? 根據?g’^(xb?mod?q)?mod?p?=?yb^((p-1)/q)?即:

            g1^(xb?mod?q1)?mod?p?=?y1,
            g2^(xb?mod?q2)?mod?p?=?y2,
            g3^(xb?mod?q3)?mod?p?=?y3,
            ……
            

            ? 即可算出:

            x1?=?xb?mod?2?=?1,
            x2?=?xb?mod?3?=?1,
            x3?=?xb?mod?5?=?2,
            x4?=?xb?mod?13?=?0,
            x5?=?xb?mod?17?=?6,
            x6?=?xb?mod?29?=?28,
            

            ? ? 由中國剩余定理:

            #!bash
            xb?=?x1*q1’*q2*q3*q4*q5*q6?+?x2*q1*q2’*q3*q4*q5*q6?+?x3*q1*q2*q3’*q4*q5*q6?+?x4*q1*q2*q3*q4’*q5*q6?+ x5*q1*q2*q3*q4*q5’*q6?+?x6*q1*q2*q3*q4*q5*q6′?mod?(q1*q2*q3*q4*q5*q6)
            

            ? 易算得:

            q1’=1,
            q2’=1,
            q3’=4,
            q4’=3,
            q5’=7,
            q6’=21,
            

            ? 則?xb?=?1*96135?+?1*64090?+?2*4*38454?+?0?+?6*7*11310?+?28*21*6630?mod?192270
            =?4841317?mod?192270
            =?34567

            即實現了已知?p,g,yb,求?xb。

            0x02 寫在最后


            如前言所述,我們在堅信自己認為是正確的路上前進著。

            gl

            0x03 參考


            1. http://intothesymmetry.blogspot.com/2016/01/openssl-key-recovery-attack-on-dh-small.html
            2. https://openssl.org/news/secadv/20160128.txt

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线