CVE-2020-0601漏洞
该漏洞是微软在2020年推出的第一批漏洞修复补丁中炒的最热闹的一个,新年将至,写一篇漏洞分析来凑个热闹,复现就算了,有缘人自会找到复现手段。
本篇简要讲述 CVE-2020-0601
漏洞的成因·
证书验证
我们先以
SSL协议
为例,来形容一下如何进行证书验证,以及该漏洞是在哪里产生:
例: 双十一来了,小明(m)
在某电商(x)
网站上购买了一本书,这时就调用了SSL协议
进行通讯,建立SSL协议的步骤总结为下图:
步骤①:
- 由小明和电商互相介绍自己,这里被称为
打招呼
。 - 这时,小明 和 电商 协商好以后的步骤里将使用到的特定密码算法。在本漏洞中,该算法为
ECC 加密算法
- 这一步没有利用密码工具。
步骤②:
- 电商 向 小明 验证自己的身份,电商 发送包含自己的
公钥
的 证书。该证书由权威的第三方证书机构(CA
)颁发。 - 小明使用
CA
的公开验证密钥 验!证! 证书中对PK的签名。
这里是触发漏洞的地方, 记住这里
步骤③:
- 由 小明 生成一个随机的密钥
MS
,该密钥用于生成对双方传输的信息进行对称加密的K1与K2。 MS
由小明获得的公钥
进行加密并交给 电商。- 电商 通过手中的
私钥
解密获得MS
。 - 这时双方都获得了用于进行加密通讯的密钥。
注意:
- 在SSL会话过程中,只有
电商
一方被要求提供证书,小明
可能根本没有公钥(或证书)。这和我们平时去小卖部买东西一样,销售方 需要提供销售许可, 而 你,只需要付钱就可以了。 - 该漏洞的触发点在于第三方权威机构(Windows)在
步骤②
验证证书时产生的逻辑漏洞,使得攻击者可以通过 伪造证书 将自身伪装成电商
, 与小明
进行通讯。从而达到骗财骗色骗信息的目的。 - 通过及时更新微软补丁包可以有效防止上述情况的发生。
第三方机构证书(CA证书)
这里我们讲一下CA证书都包含什么信息,以及为什么攻击者可以通过
CVE-2020-0601
漏洞伪造CA证书。
- CA证书中包含很多信息,我们列举出即将用到的一些重要信息:
- Subject : Microsoft
- Valid Between : 1992 - 2099
- Public Key : 0x123456789A...
- Algorithm : Elliptic Curve/RSA/...
- 该漏洞仅适用于
Algorithm(算法)
为 Elliptic Curve 的证书, 也就是我们上面提到的ECC 加密算法
。 - 当算法为 RSA 时,证书中
Algorithm
的部分提供的是一串代表RSA算法的OID数据串。而当算法为 ECC 时,证书则会提供更多数据(见下)。
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验证,伪造证书提供了基础。
ECC 算法 与 公钥私钥
- 通过上一节的内容,我们知道
公钥
和私钥
的取值取决于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
的值。 - 最简单的方法:
将 x 的值设为1, 则等式直接变为:
- 这时需要做的,就是获取到
Q(公钥)
的值,赋值给G
, 再将x(私钥)
的值赋值为1。一个简单的同公钥的证书就制作完成了。
Windows 验证机制
这里讲述微软验证证书的机制, 以及其存在的逻辑漏洞
- 在
Windows 系统
访问一个网站(例: Github.com)时, 该网站会向 Windows 系统发送由 第三方权威机构(CA) 签署的网站证书
。
- 这时,
Windows 系统
则会验证该证书是否由CA
颁发,若验证通过,则 Windows 系统与网站成功建立TLS链接。
- 为了方便下一次更快的访问,
Windows
将验证成功的证书放入内存中一块Certificate Cache
(证书缓存)中。在下一次校验时,如果该证书存在于缓存中,则直接取缓存中
的值进行校验。
画重点!这里就是 CVE-2020-0601 利用的地方。
- 在成功缓存证书数据后,根据下面描述的
Windows 证书缓存机制
,恶意网站可以伪造虚假的网站(例:github.com)证书且通过Windows验证,将自身伪装成合法网站。
Windows 证书缓存机制
- 当 Windows 接收到新的证书时,Windows 将新接收的证书与已缓存证书的证书的
公钥
进行遍历对比,寻找匹配的值。
- 伪造的
恶意证书
与 Windows系统中的缓存证书
有同样的公钥
,但因为Curve
项没有在校验范围内,所以可以通过构造自定义 Curve
来伪造证书。使得证书验证流程依然成立,但通过验证的证书已经不是之前成功验证的安全证书。
参考:
- Douglas R. Stinson 著 冯国登 等译《密码学原理与实践》 (第三版) - 中国工信出版集团
- 《STANDARDS FOR EFFICIENT CRYPTOGRAPHY - SEC 2: Recommended Elliptic Curve Domain Parameters》 Last Updated: September 20, 2000