原文链接: https://go.armis.com/hubfs/White-papers/Urgent11%20Technical%20White%20Paper.pdf

漏洞介绍

CVE-2019-12256 漏洞是 'URGENT/11' 中的一个,漏洞成因是在解析 IPv4 数据包 IP 选项时的栈溢出。

漏洞分析

在 VxWorks 的 IPnet 堆栈中,IPv4 协议在模块ipnet2/src/ipnet_ip4.c 中实现。该函数 ipnet_ip4_input 是传入IPv4 数据包的入口点。该功能首先执行基本功能验证头,然后调用 ipnet_dst_cache_get。这将根据报文的源IP地址和目的IP地址执行查找处理程序回调。

例如,如果目标地址与本地地址匹配,将调用 ipnet_ip4_local_rx 处理程序。除此以外可以转发(路由)分组,或者可能是目的地不可达条件触发。

某些错误条件(例如 Destination Unreachable)将触发要发送的 ICMP 错误数据包调用 ipnet_icmp4_send。 当由于IP格式错误而发生错误时,也会调用此函数选项和 ICMP 参数,问题数据包将被发送。 这可以通过多个阶段发生正在解析哪些 IP 选项:在 ipnet_ip4_multiple_srr_opt_check 中,仅验证该选项字段或任何各种选项中存在 LSRR 或 SSRR 选项的一个实例解析函数 - ipnet_ip4opt * _ rx。 在 ipnet_icmp4_send 中,构造了一个错误包,并且传入(格式错误的)数据包中的某些选项字段将被复制。 这是 ipnet_icmp4_copyopts 的功能。 以上流程如下图所示:

如上所示,在解析传入的IPv4分组时,各种代码流可以导致ICMP消息被发送以响应错误的(格式错误的)数据包。 将使用 ipnet_icmp4_send 函数发送响应ICMP数据包,它将尝试从传入中复制某些 IP 选项使用函数 ipnet_icmp4_copyopts 将数据包发送到传出数据包。

在至少两个代码流中,在完全解析传入的数据包和传入的 IP 之前,将发送传出的 ICMP 数据包选项完全验证是合法的,或者即使它们已经未通过验证。这个设计缺陷可能会导致此 ipnet_icmp4_send 上下文中的堆栈溢出。

自VxWorks版本6.9.3起,此漏洞就存在。两个不同的流可能导致此漏洞:

  1. 发送到目标 MAC 地址但目标 IP 地址不是 a 的数据包目标的单播地址,并且无法访问它,这将导致调用
    ipnet_ip4_dst_unreachable。
  2. 通过其 MAC 和 IP 地址定向到目标的普通单播数据包。 这个将发生在 ipnet_ip4_multiple_srr_opt_check 函数中。当传入数据包的目标IP无法访问时,第一个流发生在 ipnet_ip4_input 中根据 ipnet_dst_cache_new 的返回值,它指示数据包应如何路由:

然后函数 ipnet_ip4_dst_unreachable 将调用 ipnet_icmp4_send 并附加原始数据包到 icmp_param 结构。 在 ipnet_icmp4_send 中,来自失败(传入)数据包的 IP 选项将是由将传递给 ipnet_icmp4_copyopts 的结构引用:

缺省情况下,options_to_copy 结构将指示 ipnet_icmp4_copyopts 复制 SSRR 和LSRR 从失败的数据包到输出数据包的选项。 当失败的数据包尚未验证时,包含有效的 IP 选项(与上述流程一样),可以强制执行 ipnet_icmp4_copyopts 功能
将故障数据包中的多个 SSRR 或 LSRR 选项复制到opts结构上,在 ipnet_icmp4_send 的堆栈上分配。 此外,这些复制的选项可能包含非法否则不允许的结构。 例如,发送IP数据包时在 IP 选项字段中包含以下字节,将发生堆栈溢出:

在此示例中,IP选项字段中包含两个LSRR选项。 这些LSRR选项不包含任何路由条目(每个选项长度只有3个字节),SRR-Pointer字段指向结束选项。如前所述,接收SRR选项的主机需要记录所有记录路由条目,反转它们的顺序,并使用它来创建一个新的SRR选项,该选项将添加到任何一个返回包。 可以在ipnet_icmp4_copyopts中查看此功能:

ipnet_icmp4_copyopts 中的代码将使用这些 SRR-Pointer 字段作为最终路由条目的偏移量在 SRR 选项中,将所有路由条目复制到传出数据包选项 opts,即在 ipnet_icmp4_send 的堆栈上分配。

输入缓冲区中的每个 LSRR 选项都是3个字节长,但它将生成一个43字节的复制输出选项(3个字节的标题,36个字节的路由条目,4个字节的a)。由于没有验证(在此上下文中)失败数据包不包含多个SSRR \ LSRR选项,将导致发送此类型的多个选项在opts的溢出中,这是在堆栈上分配的40字节数组。如上所述,当包含数据包的数据包时,此漏洞也可能由另一个流触发以上选项直接发送到目标设备,而不会导致目标无法访问条件。这是因为当各种ipnetopt * _ rx中的选项解析过程失败时函数,或在ipnet_ip4_multiple_srr_opt_check函数中,发送ICMP错误消息响应(通过ipnet_ip4_opt_icmp_param_prob)。发生这种情况时,剩下的选项不是由这些验证函数解析仍然可以包含非法值,例如多个SRR选项如上所述,这将导致所提到的堆栈溢出。由于溢出将包含来自输入数据包的攻击者控制的数据,这个漏洞可能导致远程代码执行两种流动。

总结

幸运的是,因为漏洞依赖于发送带有无效 IP 选项的数据包,所以它不可能通过互联网利用。遇到数据包的第一个路由器将丢弃它。因此,漏洞只能由 LAN 上的攻击者利用。

由于此漏洞在解析 IP 标头本身时,也可以通过发送一个特殊的 crash 包来触发在广播数据包中使用无效IP选项。这可以允许攻击者同时定位多个易受攻击的设备。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖