openssl 签发sm2证书_首个NSA公开披露的软件系统漏洞——CVE20200601数字证书验证漏洞分析与实验...
文/林璟鏘?劉廣祺 孟令佳 萬會慶 王瓊霄 王偉 王文杰 徐博文
中國科學(xué)院數(shù)據(jù)與通信保護(hù)研究教育中心
中國科學(xué)院信息工程研究所?信息安全國家重點實驗室
1.
CVE-2020-0601漏洞
2020年1月15日,微軟公布了1月份的補丁更新列表,其中包括有CVE-2020-0601,是Windows操作系統(tǒng)CryptoAPI (Crypt32.dll)的橢圓曲線密碼(Elliptic Curve Cryptography, ECC)數(shù)字證書驗證相關(guān)的漏洞;該漏洞會導(dǎo)致Windows操作系統(tǒng)將攻擊者偽造的數(shù)字證書誤判為由操作系統(tǒng)預(yù)置信任的根CA所簽發(fā)。該漏洞由美國國家安全局(National Security Agency, NSA)發(fā)現(xiàn)并匯報給微軟公司;這一漏洞被認(rèn)為是第一個NSA公開披露的軟件系統(tǒng)漏洞。
2.
?影響
基于該漏洞,攻擊者可以基于某一張Windows操作系統(tǒng)預(yù)置信任的根CA證書、偽造任意虛假信息的數(shù)字證書,而且會被Windows操作系統(tǒng)誤判為“該證書沒有問題”、誤判為是由操作系統(tǒng)預(yù)置信任的根CA所簽發(fā)。進(jìn)一步,攻擊者能夠(結(jié)合其它的攻擊手段)任意創(chuàng)建可被驗證通過的代碼簽名證書、安裝惡意可執(zhí)行代碼,創(chuàng)建任意域名的服務(wù)器TLS證書、發(fā)起TLS中間人攻擊,創(chuàng)建可被驗證通過的電子郵件證書、以其它人名義發(fā)送安全電子郵件。
只有支持“定制參數(shù)的ECC數(shù)字證書”的Windows操作系統(tǒng)版本會受到影響。這一機制最早在Windows 10引入,所以該漏洞只影響Windows 10和Windows Server 2016/2019、以及各種依賴于Windows操作系統(tǒng)數(shù)字證書驗證功能的應(yīng)用程序。2020年1月14日起停止維護(hù)的Windows 7和Windows Server 2008不支持“定制參數(shù)的ECC數(shù)字證書”,不受影響。
3.
漏洞基本原理
Windows操作系統(tǒng)CryptoAPI的CertGetCertificateChain()函數(shù),在構(gòu)建證書鏈過程中,對ECDSA (Elliptic Curve Digital Signature Algorithm)算法的公鑰參數(shù)驗證存在漏洞。構(gòu)建證書鏈、判定是否由操作系統(tǒng)預(yù)置信任的根CA所簽發(fā),過程如下:先逐層驗證輸入者提供的各數(shù)字證書的CA數(shù)字簽名是否正確有效、直至輸入者提供的根CA自簽名證書,然后比較輸入者提供的根CA自簽名證書與操作系統(tǒng)預(yù)置信任的根CA證書列表。如果CA數(shù)字簽名全部正確有效、且輸入者提供的根CA自簽名證書在Windows操作系統(tǒng)預(yù)置信任列表中,則判定該證書鏈“該證書沒有問題”。
其中,Windows操作系統(tǒng)CryptoAPI在比較輸入者提供的根CA自簽名證書與操作系統(tǒng)預(yù)置信任的根CA證書列表過程中,存在缺陷。攻擊者可以自己生成惡意的根CA自簽名證書,滿足:(a)ECC公鑰坐標(biāo)點與某一張Windows操作系統(tǒng)預(yù)置信任的根CA證書的ECC公鑰坐標(biāo)點完全一致,(b)但是二者ECC曲線參數(shù)不一致,即橢圓曲線基點不一致,(c)且攻擊者能夠自動擁有該根CA自簽名證書的私鑰。然后,Windows操作系統(tǒng)CryptoAPI會將攻擊者偽造的根CA自簽名證書誤判為是操作系統(tǒng)預(yù)置信任的根CA證書(只是比較ECC公鑰坐標(biāo)點、沒有比較所有的ECC曲線參數(shù);因為ECC公鑰坐標(biāo)點相同,所以Subject Key Identifier擴展值相同)。
對于ECDSA算法,ECC曲線參數(shù)包括素域p、方程參數(shù)a和b、基點G、階n和cofactor系數(shù)h,私鑰d是隨機數(shù),公鑰P = [d]G、是橢圓曲線的點坐標(biāo)。美國NIST已經(jīng)標(biāo)準(zhǔn)化地確定了多條橢圓曲線(也就是,確定了各條曲線的p、a、b、G、n和h參數(shù));所以,在X.509數(shù)字證書中,ECC曲線參數(shù)可以直接以O(shè)ID的形式表示、不需要一一列出各參數(shù),例如,曲線secp224k1的OID就是1.3.132.0.32。同時,X.509數(shù)字證書也允許以定制參數(shù)的方式來給出ECC曲線參數(shù),也就是,在X.509數(shù)字證書中,直接一一列出曲線的p、a、b、G、n和h參數(shù)。
攻擊者偽造數(shù)字證書的過程如下。對于某一張Windows操作系統(tǒng)預(yù)置信任的根CA證書,已有公鑰P = [d]G;攻擊者生成隨機數(shù)r,計算G’ = [R]P,其中R是r的逆元,則有[r]G’ = [r*R]P = P。也就是,對于基點為G’的橢圓曲線,攻擊者擁有公鑰P對應(yīng)的私鑰r,甚至r可以等于1。注意:對于基點為G的橢圓曲線,公鑰P對應(yīng)的私鑰是d、攻擊者并不知道。基于以上原理,攻擊者就可以任意偽造Windows操作系統(tǒng)CryptoAPI驗證通過的證書鏈。
4.
?實驗
我們基于Microsoft ECC Product Root Certificate Authority 2018(使用NIST P384曲線,OID是1.3.132.0.34)生成了用于攻擊測試的根CA自簽名證書,然后簽發(fā)了用于代碼簽名攻擊測試的終端證書,進(jìn)行代碼數(shù)字簽名,結(jié)果如下(在未安裝補丁的Windows操作系統(tǒng)):
?相應(yīng)的證書路徑如下(注意,左圖的頒發(fā)者是xu,右圖的證書路徑則顯示是頒發(fā)者M(jìn)icrosoft ECC Product Root Certificate Authority 2018):
?在已經(jīng)安裝了補丁的Windows操作系統(tǒng)上,則顯示如下、驗證不通過:?
?類似的,我們也生成了用于HTTPS攻擊測試的服務(wù)器證書,在Edge瀏覽器上顯示如下(瀏覽器有警告提示“不安全”、但是Windows操作系統(tǒng)的證書路徑顯示成功):?
?瀏覽器應(yīng)該在Windows操作系統(tǒng)CryptoAPI之外,有進(jìn)一步的額外處理。注意:按照Internet公開的其它攻擊測試,有些瀏覽器沒有警告提示。
5.
討論
CVE-2020-0601數(shù)字證書驗證漏洞涉及ECC橢圓曲線密碼的基礎(chǔ)知識,否則難以發(fā)現(xiàn)漏洞;同時,Windows操作系統(tǒng)CryptoAPI在比較根CA證書時,只處理了公鑰坐標(biāo)點(或者,可能是Subject Key Identifier擴展值),也是實現(xiàn)上的常見疏忽。
對于國產(chǎn)公鑰密碼算法SM2,有不同的情況。目前SM2算法只支持唯一的一條ECC曲線,實現(xiàn)中出現(xiàn)類似漏洞的可能性很小;但是,也不能完全排除可能性:如果系統(tǒng)支持“定制參數(shù)的ECC數(shù)字證書”,就有可能會有類似問題。
參考資料
https://research.kudelskisecurity.com/2020/01/15/cve-2020-0601-the-chainoffools-attack-explained-with-poc/
https://github.com/ollypwn/CVE-2020-0601
https://securityaffairs.co/wordpress/96414/security/microsoft-cve-2020-0601-flaw-nsa.html
https://github.com/kudelskisecurity/chainoffools
總結(jié)
以上是生活随笔為你收集整理的openssl 签发sm2证书_首个NSA公开披露的软件系统漏洞——CVE20200601数字证书验证漏洞分析与实验...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @order注解_Spring Boot
- 下一篇: python常用单词汇总_在.txt文件