Windows DHCP Server远程代码执行误差剖析(CVE-2019-0626)

宣布时间 2019-02-19
误差配景

2月12日,微软宣布2月份月度例行清静通告,修复了多个高危误差,其中包括Windows DHCP Server远程代码执行误差CVE-2019-0626 。当攻击者向DHCP服务器发送全心设计的数据包并乐成使用后,就可以在DHCP服务中执行恣意代码,误差影响规模较大 。针对此误差,尊龙凯官网入口ADLab第一时间对其举行了详细剖析 。

误差影响版本

Windows 7
Windows 8.1
Windows 10 
Windows Server 2008
Windows Server 2012
Windows Server 2016

Windows Server 2019


协议简介


DHCP,动态主机设置协议,前身是BOOTP协议,是一个局域网的网络协议 。DHCP通常用于集中管理分派IP地址,使client动态地获得IP地址、Gateway地址、DNS服务器地址等信息 。DHCP客户端和DHCP服务端的交互历程如下图所示 。


尊龙凯时 - 人生就是搏!


传输的DHCP协议报文需遵照以下名堂:


尊龙凯时 - 人生就是搏!


DHCP包括许多类型的Option,每个Option由Type、Length和Data三个字段组成 。


尊龙凯时 - 人生就是搏!


Type取值规模1~255,部分Type类型如下图所示 。


尊龙凯时 - 人生就是搏!


DHCP服务在处置惩罚Vendor Specific 类型(Type=43)的Option结构保存清静误差 。首先看下DHCP服务程序对Option的处置惩罚历程, ProcessMessage函数认真处置惩罚收到的DHCP报文,挪用ExtractOptions函数处置惩罚DHCP的Option字段,传入函数ExtractOptions的参数1(v7)为DHCP报文指针,参数3(*(unsigned int *)(v5 + 16))对应指针偏移位置+16的数据,即Len字段 。


尊龙凯时 - 人生就是搏!


ExtractOption函数如下所示 。 v6 = (unsigned __int64)&a1[a3 - 1];指向报文末尾位置;v10=a1+240;指向报文中Option结构 。在for循环中处置惩罚差别类型的Option结构,当type=43(Vendor Specific Information),传入指针v10和指针v6作为参数,挪用ParseVendorSpecific函数举行处置惩罚 。


尊龙凯时 - 人生就是搏!


尊龙凯时 - 人生就是搏!


ParseVendorSpecific函数内部挪用UncodeOption函数 。UncodeOption函数参数a1指向option起始位置,a2指向报文的末尾位置 。UncodeOption函数保存清静误差,下面团结POC和补丁比对举行剖析 。


误差剖析

结构一个DHCP Discovery报文,POC如下所示,POC包括两个vendor_specific 类型的Option结构 。vendor_specific1是正当的Option结构,Length取值0x0a即是Data的现实长度(0x0a),vendor_specific2是不正当的Option结构, Length取值0x0f大于Data的现实长度(0x0a) 。


尊龙凯时 - 人生就是搏!


DHCP服务器收到Discovery请求报文,对数据包举行处置惩罚 。首先执行ExtractOptions处置惩罚Options,当处置惩罚vendor_specific类型的Option时,进入到ParseVendorSpecific举行处置惩罚 。POC中结构一个正当的vendor_specific1,目的是为了绕过84~85行的校验代码,使程序顺遂执行到ParseVendorSpecific函数 。


尊龙凯时 - 人生就是搏!


ParseVendorSpecific挪用UncodeOption函数,详细如下:


32~43行在do-while循环中盘算Option结构的 Length值之和,生涯到v13,作为分派堆内存长度 。POC中包括两个vendor_specific结构,首先处置惩罚vendor_specific1,盘算v13,即vendor_specific1长度a,并且使v12指向下一个Option结构vendor_specific2,当进入43行while条件判断,由于vendor_specific2长度不正当,do-while循环竣事 。

48行挪用HeapAlloc分派堆内存,分派的内存巨细v13=a 。


51~58行在for循环中依次将vendor_specific结构中的Data拷贝到分派的堆内存中 。进入第一次循环时,v1指向vendor_specific1,v8指向末尾位置,知足条件v1
尊龙凯时 - 人生就是搏!

补丁比对

补丁后的版本添加了对Length字段的有用性判断 。


尊龙凯时 - 人生就是搏!


清静建议

实时装置清静补� 。篽ttps://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0626


尊龙凯时 - 人生就是搏!