You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:47:13