微软字体解析服务远程代码执行漏洞分析

3月23日,微软公司发布了一份编号ADV200006的紧急漏洞通告,通告表示有在野攻击行动使用了位于Adobe Type Manager Library中的两个远程代码执行0Day漏洞,由于漏洞严重,发布该通告指导用户在补丁发布前规避风险。 4月15日的补丁日中,微软发布了针对此风险通告的补丁外,还对一个字体库漏洞CVE-2020-0687进行修复,诺亚实验室第一时间对补丁进行了比对分析,并确认了漏洞的利用性,两个漏洞均属于高危远程代码执行漏洞,由于CVE-2020-0938/CVE2020-1020已有安全团队验证并形成POC,本文将会着笔于vincss报告的CVE-2020-0687进行简要技术分析。 根本原因漏洞产生于字体处理库fontsub.dll的ReadTableIntoStructure中,由于循环逻辑中读取数据赋值检查不严格,在数据拷贝到目的堆后超过原申请的堆内存大小,形成堆溢出漏洞。 补丁细节分析通过补丁比对,我们很快确认了问题函数 __int64 __fastcall ReadTableIntoStructure(__int16 *a1, _WORD *a2, unsigned __int16 *a3) 通过前后差异判别,可以看出补丁代码将while循环的一个返回条件放到了循环入口处,其目的是为了防止当变量v5中的变量大于v3[4]中保存的的变量时,会执行一次while循环的第一句赋值代码。 故原始漏洞代码中存在判断不严谨的情况,将会导致ReadGeneric中读取到的4字节数据,放入至一个结构体数组中: 通过跟踪v3和v5返回上层调用函数可知,v3在上层函数MergeEblcEbdtTables中,是作为一个从新申请的堆内存的大小参数进行传递的;而v5则是作为ReadTableIntoStructure中第三个参数,可以理解为一个类似Table大小的变量。 而此处的堆空间大小则是由v92来决定,根据跟踪的情况,…