<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    原文地址: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

    97av