cve-2020-0601 漏洞原理浅述

CVE-2020-0601漏洞

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

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

证书验证

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

例: 双十一来了,小明(m)在某电商(x)网站上购买了一本书,这时就调用了SSL协议进行通信,创建SSL协议的步骤总结为下图:
SSLweb

步骤①:
  • 由小明和电商互相介绍本身,这里被称为 打招呼
  • 这时,小明 和 电商 协商好之后的步骤里将使用到的特定密码算法。在本漏洞中,该算法为 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 验证机制

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

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

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

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

Windows 证书缓存机制

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

参考: