关于CVE-2019-0704(BlueKeep)中PDU与RDP交互及代码注入的深层技术问询
CVE-2019-0704(BlueKeep)技术拆解
PDU协议与RDP通道交互机制
- RDP通道模型:RDP通过虚拟通道(Virtual Channel)实现多数据流并行传输,BlueKeep针对的是RDPEUDP通道(UDP扩展的RDP传输通道),该通道的PDU处理逻辑存在未校验的输入漏洞。
- PDU结构与交互流程:RDP PDU包含固定头部(含通道ID、负载长度、类型标识)和可变负载。客户端发起连接时,先通过X.224协议建立会话,随后发送Connection Sequence PDU协商通道参数——BlueKeep的核心触发点就在服务端rdpdr.sys驱动对这类PDU的长度校验逻辑上:恶意构造的PDU会伪造负载长度,绕过服务端的边界检查,直接写入堆内存。
- 通道内存管理:每个RDP通道对应内核堆中的
CHANNEL_DEF结构体,PDU的负载数据会被写入该结构体关联的缓冲区,未校验的长度会导致缓冲区溢出,覆盖结构体本身及相邻堆内存。
BlueKeep代码注入原理
- 堆溢出触发:服务端处理恶意PDU时,未限制写入缓冲区的字节数,导致
CHANNEL_DEF结构体中的函数指针(如通道回调函数)被覆盖为攻击者可控的地址。 - 代码执行路径:
- 直接覆盖函数指针:当服务端后续调用通道回调时,会跳转到攻击者预先注入的shellcode。
- 堆喷射辅助:通过多次发送包含shellcode的PDU,在内存中布局大量重复的shellcode块,利用溢出后的EIP/RIP随机指向喷射区域的概率,实现代码执行。
- 防护绕过:针对DEP(数据执行保护),利用ROP链将内存标记为可执行;针对ASLR,通过PDU交互中的信息泄露(如服务端返回的模块版本信息)计算内核模块基址,再配合固定偏移定位ROP gadget。
底层数学原理支撑
- 堆喷射的概率模型:堆喷射依赖均匀分布概率,通过在内存中连续布局相同的shellcode块,使得溢出后的指令指针有极高概率落在shellcode区域,计算公式为:
命中概率 = 喷射内存大小 / 进程可用内存范围。 - ASLR地址计算:内核模块基址是随机的,但模块内函数/gadget的偏移固定,通过泄露的已知地址(如某函数的内存地址),利用线性运算
模块基址 = 泄露地址 - 已知偏移,即可推算出所有gadget的实际地址。 - 缓冲区溢出的边界计算:恶意PDU的长度需要精确匹配
CHANNEL_DEF结构体的大小与缓冲区的差值,涉及内存对齐规则(如结构体成员的字节对齐)和结构体大小的精确计算,确保溢出刚好覆盖关键指针而不破坏其他核心内存区域。
注:常规RDP/PDU研究论文多聚焦协议规范与正常交互逻辑,BlueKeep属于协议实现层面的内核驱动漏洞,需结合rdpdr.sys的具体代码实现分析,而非单纯依赖协议文档。
内容的提问来源于stack exchange,提问作者X the Mystic
相关产品推荐
相关产品推荐

