中国母婴网 > 资讯 > 正文

CVE-2020-0601缝隙详细分析

放大字体  缩小字体 2020-01-22 15:56:03  阅读:1226 来源:自媒体 作者:黑客与极客

原标题:CVE-2020-0601缝隙详细剖析0×00 缝隙描绘 2020年1月15日,微软发布了1月份的补丁更新列表,其间存在一个坐落CryptoAPI

原标题:CVE-2020-0601缝隙详细剖析

0×00 缝隙描绘

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签名

在未打补丁的机器上,可执行文件CVE20200601.exe的数字签名校验经过

打完补丁后,可执行文件CVE20200601.exe的数字签名信息无法验证。

0×05 参考资料

*本文作者:奇安信代码卫兵,转载请注明来自FreeBuf.COM

责任编辑: