# Windows CryptoAPI欺骗漏洞 CVE-2020-0601 ## 漏洞描述 1月15日,微软发布了针对CVE-2020-0601的安全补丁,该漏洞是微软在实现椭圆曲线加密算法数字证书验证时产生,可被利用于伪造来自可信任来源的签名或证书,并且因其业务特性会衍生出多种攻击向量,具有极高的可利用价值和极大的潜在破坏力,Win 10和windows server 2016 & 2019也都在其影响范围内。该漏洞由美国NSA国家安全局发现后汇报给微软公司,也被认为是第一个NSA公开披露的软件系统漏洞,当然也有可能存在其特殊的战术目的。绿盟科技M01N攻击安全研究团队对此漏洞原理进行了详细分析并复现了多种可能的攻击方法,提出了详细的检测及整改方案。 ## 漏洞影响 ``` 带有指定参数的ECC密钥的证书的Microsoft Windows版本 依赖于Windows CryptoAPI的应用程序 ``` ## 漏洞复现 CVE-2020-0601的根源是微软的加密库crypt32.dll中椭圆曲线加密算法的实现问题,首先我们来了解一下椭圆加密算法的基本原理。 要形象地理解椭圆曲线加密算法,可以结合图形来看,以下是一个符合椭圆曲线的方程y2 = x3 + ax + b,图像如下: ![img](./images/1627101188845-6100b223-a454-4b62-8b99-0cfde7484043.png) 椭圆曲线具有的一些独特的性质使它适合用于加密算法: 1. 椭圆曲线关于x轴对称 2. 任何一条非垂直的线与曲线最多有三个点相交 1. 曲线是光滑的,即曲线的所有点都没有两个或者两个以上的不同的切线 在椭圆曲线上任意两点A、B(若A、B重合则作A的切线),作直线交于椭圆曲线另一点C,过C做y轴的平行线与椭圆曲线交于C点,定义A+B=C。椭圆曲线的加法符合交换律和结合律。 ![img](./images/1627101188846-38d85bdc-e314-422b-826d-597e6f35fda9.png) 如果A、B是同一个点,则过A作椭圆曲线的切线,以同样的方法得到对应的结果 C=2A 。 ![img](./images/1627101188928-956200fe-d824-4bde-be56-dbcbb3740e57.png) 接下来是椭圆曲线加密相关的重点,如果对多个A进行累加,则可依次累加连线得到nA的值 。 起点为A,终点D=3A,阶为3 。 ![img](./images/1627101188932-083630f6-6c3c-4da7-8142-a54838c38b89.png) 起点为A,终点G=4A,阶为4。 ![img](./images/1627101188945-38394fea-10dd-4468-bd53-6e84eb6ee92e.png) 椭圆曲线加密 ![img](./images/1627101189394-c354d5af-7667-43da-8502-abfe660cc187.png) 考虑K=kG,其中K、G为椭圆曲线Ep(a,b)上的点,n为G的阶。k为小于n的整数。则给定k和G,根据加法法则,计算K很容易(只要逐次求解)但反过来,给定K和G,求k就非常困难。因为实际使用中的ECC原则上把私钥k取得相当大,n也相当大,且椭圆曲线不再连续而是在实数内离散的值,要把n个解点逐一算出几乎是不可能的。这就是椭圆曲线加密算法的数学依据 。 - 点G称为基点 - k(k