cve-2020-0601 漏洞原理浅述

CVE-2020-0601漏洞

该漏洞是微软在2020年推出的第一批漏洞修复补丁中炒的最热闹的一个,新年将至,写一篇漏洞分析来凑个热闹,复现就算了,有缘人自会找到复现手段。

本篇简要讲述 CVE-2020-0601 漏洞的成因·

证书验证

我们先以SSL协议为例,来形容一下如何进行证书验证,以及该漏洞是在哪里产生:

例: 双十一来了,小明(m)在某电商(x)网站上购买了一本书,这时就调用了SSL协议进行通讯,建立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)
    Curve Types
  • 可以从上图看到,由于存在着许多种不同的 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 来决定,至于再往数学方向的原理就先不涉及了。我们现在需要知道的就是:有了这几参数,我们就可以通过私钥来计算公钥
    Curve Parameter
  • 到这里并有任何问题,但是使用 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 可以通过表达式 y 2 = x 3 + a x + b   ( m o d   p ) y^2 = x^3 + ax + b\ (mod\ p) 来表示,也可以通过下图的例子来表示:
    在这里插入图片描述
  • G为该椭圆曲线上任取的一点,不仅限于图上所取得值。
  • 当我们将G作为一个数值去进行计算时,2G = G + G 的值所代表的点依然坐落于该曲线上,网上可以自行搜索其原理,这里不做拓展。
    在这里插入图片描述
  • 我们可以进行多次的 nG + G 运算,可以发现所有得到的值3G, 4G, 5G, … 最后都坐落于这条曲线上。
    在这里插入图片描述
  • 当我们将运算停在一个点 xG 时,便会得到下面的等式:
    x     G = Q x\ ·\ G = Q
  • 其中 x 是我们设置的 私钥, 而求得的Q值则是我们的 公钥
    在这里插入图片描述
  • 其中,QG 都是曲线上的一点,而 x 则是一个整数。

注意: 这和我们小学学的简单乘除法不同,知道 Q 和 G 的值是无法算出 x 的。

  • 如果知道 P(公钥) 的值,则可通过上面的等式,简单的构造制造出能生成 Px(私钥)G 的值。
  • 最简单的方法: Q = x G Q = xG
    将 x 的值设为1, 则等式直接变为:
    Q = G Q = G
  • 这时需要做的,就是获取到 Q(公钥) 的值,赋值给 G, 再将 x(私钥)的值赋值为1。一个简单的同公钥的证书就制作完成了。

Windows 验证机制

这里讲述微软验证证书的机制, 以及其存在的逻辑漏洞

  • Windows 系统 访问一个网站(例: Github.com)时, 该网站会向 Windows 系统发送由 第三方权威机构(CA) 签署的网站证书
    conn1
  • 这时,Windows 系统 则会验证该证书是否由 CA 颁发,若验证通过,则 Windows 系统与网站成功建立TLS链接。
    conn2
  • 为了方便下一次更快的访问,Windows 将验证成功的证书放入内存中一块 Certificate Cache (证书缓存)中。在下一次校验时,如果该证书存在于缓存中,则直接取 缓存中 的值进行校验。
    conn3

    画重点!这里就是 CVE-2020-0601 利用的地方。

  • 在成功缓存证书数据后,根据下面描述的Windows 证书缓存机制,恶意网站可以伪造虚假的网站(例:github.com)证书且通过Windows验证,将自身伪装成合法网站。
    conn4

Windows 证书缓存机制

  • 当 Windows 接收到新的证书时,Windows 将新接收的证书与已缓存证书的证书的公钥进行遍历对比,寻找匹配的值。
    cache1
  • 伪造的恶意证书 与 Windows系统中的缓存证书有同样的公钥,但因为Curve项没有在校验范围内,所以可以通过构造 自定义 Curve 来伪造证书。使得证书验证流程依然成立,但通过验证的证书已经不是之前成功验证的安全证书。
    cache2

参考:

发布了5 篇原创文章 · 获赞 1 · 访问量 206

猜你喜欢

转载自blog.csdn.net/weixin_43899764/article/details/104029814
今日推荐