该漏洞是微软在2020年推出的第一批漏洞修复补丁中炒的最热闹的一个,新年将至,写一篇漏洞分析来凑个热闹,复现就算了,有缘人自会找到复现手段。html
本篇简要讲述 CVE-2020-0601
漏洞的成因·git
咱们先以
SSL协议
为例,来形容一下如何进行证书验证,以及该漏洞是在哪里产生:github
例: 双十一来了,小明(m)
在某电商(x)
网站上购买了一本书,这时就调用了SSL协议
进行通信,创建SSL协议的步骤总结为下图:
web
打招呼
。ECC 加密算法
公钥
的 证书。该证书由权威的第三方证书机构(CA
)颁发。CA
的公开验证密钥 验!证! 证书中对PK的签名。这里是触发漏洞的地方, 记住这里算法
MS
,该密钥用于生成对双方传输的信息进行对称加密的K1与K2。MS
由小明得到的公钥
进行加密并交给 电商。私钥
解密得到 MS
。电商
一方被要求提供证书,小明
可能根本没有公钥(或证书)。这和咱们平时去小卖部买东西同样,销售方 须要提供销售许可, 而 你,只须要付钱就能够了。步骤②
验证证书时产生的逻辑漏洞,使得攻击者能够经过 伪造证书 将自身假装成 电商
, 与 小明
进行通信。从而达到骗财骗色骗信息的目的。这里咱们讲一下CA证书都包含什么信息,以及为何攻击者能够经过
CVE-2020-0601
漏洞伪造CA证书。缓存
- Subject : Microsoft - Valid Between : 1992 - 2099 - Public Key : 0x123456789A... - Algorithm : Elliptic Curve/RSA/...
Algorithm(算法)
为 Elliptic Curve 的证书, 也就是咱们上面提到的 ECC 加密算法
。Algorithm
的部分提供的是一串表明RSA算法的OID数据串。而当算法为 ECC 时,证书则会提供更多数据(见下)。secp xxxxx
都表明一条不一样的 椭圆曲线(Elliptic Curve)Elliptic Curve
,CA证书须要在肯定算法后添加继续肯定具体所使用的为哪个 Curve
, 因此,对于算法为Elliptic Curve的证书在Algorithm
的后面又添加了Curve
项。- Subject : Microsoft - Valid Between : 1992 - 2099 - Public Key : 0x123456789A... - Algorithm : Elliptic Curve - Curve : secp256k1
Elliptic Curve
由如下几个参数: p
, a
, b
, G
, n
, h
来决定,至于再往数学方向的原理就先不涉及了。咱们如今须要知道的就是:有了这几参数,咱们就能够经过私钥
来计算公钥
。ECC 算法
的证书中的 Curve
项还有另外一个特色:你可使用 自定义Curve。也就是说:Curve
项能够不是 secp xxxxx
,而是 p/a/b/G/n/h
各自的值。- Subject : Microsoft - Valid Between : 1992 - 2099 - Public Key : 0x123456789A... - Algorithm : Elliptic Curve - Curve : p/a/b/G/n/h
自定义的Curve
就为绕过Windows验证,伪造证书提供了基础。公钥
和 私钥
的取值取决于 Elliptic Curve
的参数,那么什么是 Elliptic Curve
呢?Elliptic Curve
能够经过表达式
来表示,也能够经过下图的例子来表示:G
为该椭圆曲线上任取的一点,不只限于图上所取得值。G
做为一个数值去进行计算时,2G = G + G
的值所表明的点依然坐落于该曲线上,网上能够自行搜索其原理,这里不作拓展。nG + G
运算,能够发现全部获得的值3G
, 4G
, 5G
, … 最后都坐落于这条曲线上。xG
时,便会获得下面的等式:x
是咱们设置的 私钥
, 而求得的Q值则是咱们的 公钥
。Q
和 G
都是曲线上的一点,而 x
则是一个整数。注意: 这和咱们小学学的简单乘除法不一样,知道 Q 和 G 的值是没法算出 x 的。安全
P(公钥)
的值,则可经过上面的等式,简单的构造制造出能生成 P
的 x(私钥)
和 G
的值。Q(公钥)
的值,赋值给 G
, 再将 x(私钥)
的值赋值为1。一个简单的同公钥的证书就制做完成了。这里讲述微软验证证书的机制, 以及其存在的逻辑漏洞app
Windows 系统
访问一个网站(例: Github.com)时, 该网站会向 Windows 系统发送由 第三方权威机构(CA) 签署的网站证书
。Windows 系统
则会验证该证书是否由 CA
颁发,若验证经过,则 Windows 系统与网站成功创建TLS连接。Windows
将验证成功的证书放入内存中一块 Certificate Cache
(证书缓存)中。在下一次校验时,若是该证书存在于缓存中,则直接取 缓存中
的值进行校验。画重点!这里就是 CVE-2020-0601 利用的地方。svg
Windows 证书缓存机制
,恶意网站能够伪造虚假的网站(例:github.com)证书且经过Windows验证,将自身假装成合法网站。公钥
进行遍历对比,寻找匹配的值。恶意证书
与 Windows系统中的缓存证书
有一样的公钥
,但由于Curve
项没有在校验范围内,因此能够经过构造 自定义 Curve
来伪造证书。使得证书验证流程依然成立,但经过验证的证书已经不是以前成功验证的安全证书。