歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

CVE-2020-0601漏洞詳細分析

來源:本站整理 作者:佚名 時間:2020-01-23 TAG: 我要投稿

2020年1月15日,微軟公布了1月份的補丁更新列表,其中存在一個位于CryptoAPI橢圓曲線密碼(ECC)證書檢測繞過相關的漏洞(CVE-2020-0601),該漏洞為NSA發現并匯報給微軟。攻擊者可以利用這個漏洞,使用偽造的代碼簽名證書對惡意的可執行文件進行簽名,并以此惡意文件來進行攻擊。
0×01 補丁分析
從微軟的官方介紹上可知,此漏洞存在于crypt32.dll文件。在官方網站下載了補丁文件升級更新后,新的crypt32.dll與未更新的版本對比如下:

從圖中可以看出,CertDllVerifyMicrosoftRootCertificateChainPolicy函數存在改動,查看引用該函數的地方:

從圖可知,函數CertVerifyCertificateChainPolicy中有兩處調用了CertDllVerifyMicrosoftRootCertificateChainPolicy函數,查看CertVerifyCertificateChainPolicy的代碼:

從上圖代碼可知,函數CertVerifyCertificateChainPolicy將四個參數pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus直接傳遞給了CertDllVerifyMicrosoftRootCertificateChainPolicy,并未做處理。接著查看CertDllVerifyMicrosoftRootCertificateChainPolicy的代碼。

注意到CertDllVerifyMicrosoftRootCertificateChainPolicy函數中有多處形如memcmp(v16, &pbComputedHash, 0x20u)的內存對比代碼,其中v16是crypt32.dll某處固定的數據,pbComputedHash是由CryptHashCertificate2函數計算過的hash值,0x20u是指對比的內存長度,剛好是ECC數字簽名證書的指紋hash長度,這可以通過查看ECC根證書的詳細信息可知。

而CryptHashCertificate2函數傳入的值由CertDllVerifyMicrosoftRootCertificateChainPolicy的參數解析而來,并且只包含了公鑰信息。由此可以判斷,雖然函數CertVerifyCertificateChainPolicy將參數pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus都傳遞給了CertDllVerifyMicrosoftRootCertificateChainPolicy函數,但CertDllVerifyMicrosoftRootCertificateChainPolicy函數只利用了其中的公鑰信息,存在參數校驗不全的邏輯缺陷。至于為什么只校驗公鑰信息就會被偽造的數字簽名繞過檢查,在介紹CVE-2020-0601漏洞原理之前,我們先來簡單介紹下橢圓曲線數字簽名算法(ECDSA)。
0×02 橢圓曲線數字簽名算法(ECDSA)
在2009年修訂的FIPS 186加入了基于橢圓曲線密碼的數字簽名方法,稱其為橢圓曲線數字簽名算法(ECDSA)。由于橢圓曲線密碼效率方面的優勢,ECDSA的應用越來越廣泛。
ECDSA算法過程如下:
參與數字簽名的所有方都使用相同的全局域參數,用于定義橢圓曲線以及曲線上的基點。
簽名者首先需要生成一對公鑰、私鑰。簽名者可以選擇一個隨機數作為私鑰,使用隨機數和基點,可以計算橢圓曲線上的另一個解點,作為公鑰。
對于待簽名的消息計算其Hash值。簽名者使用私鑰、全局域參數、Hash值產生簽名,包括兩個整數r和s。
驗證者使用簽名者的公鑰、全局域參數、整數s作為輸入,計算v,并與r比較。如果兩者相等,則簽名通過。
0×03 漏洞原理
通常,簽名者產生一對公私鑰后,要去證書中心(certificate authority,簡稱CA),為公鑰做認證,以此來證明簽名者本身身份。證書中心用自己的私鑰,對簽名者的公鑰和一些相關信息一起做簽名,生成數字證書(DigitalCertificate)。由補丁分析部分可知,微軟在對數字簽名做合法校驗時,支持橢圓曲線參數的自定義輸入,又只對公鑰信息做校驗,存在嚴重缺陷。
攻擊者可以傳入自定義的全局域參數、簽名信息s,只需要公鑰信息與系統ECC根證書Microsoft ECC Product Root Certificate Authority 2018的公鑰保持一致,就可以繞過校驗邏輯,讓數字簽名信息看起來就是ECC根證書簽發的一樣。而這,是很容易做到的。
假設ECC根證書的私鑰是d(對攻擊者未知),基點是G,公鑰是Q=dG。攻擊者可以選擇跟ECC根證書一樣的橢圓曲線,只需d’=1(單位元),G‘=Q,則Q‘=d’G'=Q,從而完成攻擊。
0×04 漏洞驗證
提取ECC根證書公鑰信息

生成偽造的ECC根證書

生成代碼簽名用的證書,并用偽造的ECC根證書做簽名

打包數字簽名證書

對可執行文件CVE20200601.exe簽名

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 体彩459组选前后关系 今天辽宁35选7中奖号码的真实规律 模拟炒股的app 极速赛车网登录 一个人能开几个股票 手机填大坑真赢钱的 北京赛车pk开奖记录 麻将高手打牌思路 福建36选7开奖11056 女性色体验特殊服务 贵州快三走势图手机版 股票交易规则 下载吉祥棋牌游戏? 新疆11选5推荐 麻将怎么玩视频教学 最新股市行情分析