您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何進行CVE-2020-0601漏洞的詳細分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
2020年1月15日,微軟公布了1月份的補丁更新列表,其中存在一個位于CryptoAPI橢圓曲線密碼(ECC)證書檢測繞過相關的漏洞(CVE-2020-0601),該漏洞為NSA發現并匯報給微軟。攻擊者可以利用這個漏洞,使用偽造的代碼簽名證書對惡意的可執行文件進行簽名,并以此惡意文件來進行攻擊。
從微軟的官方介紹上可知,此漏洞存在于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)。
在2009年修訂的FIPS 186加入了基于橢圓曲線密碼的數字簽名方法,稱其為橢圓曲線數字簽名算法(ECDSA)。由于橢圓曲線密碼效率方面的優勢,ECDSA的應用越來越廣泛。
ECDSA算法過程如下:
參與數字簽名的所有方都使用相同的全局域參數,用于定義橢圓曲線以及曲線上的基點。
簽名者首先需要生成一對公鑰、私鑰。簽名者可以選擇一個隨機數作為私鑰,使用隨機數和基點,可以計算橢圓曲線上的另一個解點,作為公鑰。
對于待簽名的消息計算其Hash值。簽名者使用私鑰、全局域參數、Hash值產生簽名,包括兩個整數r和s。
驗證者使用簽名者的公鑰、全局域參數、整數s作為輸入,計算v,并與r比較。如果兩者相等,則簽名通過。
通常,簽名者產生一對公私鑰后,要去證書中心(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,從而完成攻擊。
提取ECC根證書公鑰信息
生成偽造的ECC根證書
生成代碼簽名用的證書,并用偽造的ECC根證書做簽名
打包數字簽名證書
對可執行文件CVE20200601.exe簽名
在未打補丁的機器上,可執行文件CVE20200601.exe的數字簽名校驗通過
打完補丁后,可執行文件CVE20200601.exe的數字簽名信息無法驗證。
上述就是小編為大家分享的如何進行CVE-2020-0601漏洞的詳細分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。