尊龙凯官网入口ADLab:VxWorks多个远程误差剖析
宣布时间 2019-08-02VxWorks是天下上使用最普遍的实时操作系统(RTOS),有凌驾20亿台装备正在使用,包括工业、电力、能源,航空航天等行业要害基础设施。
? 误差影响版本
URGENT/11误差影响自6.5版以来的险些所有VxWorks版本,不包括为认证而设计的产品版本,例如VxWorks 653和VxWorks Cert Edition。
? VxWorks6.5~6.9.4
? 使用IPNet网络协议栈的VxWorks版本
? 解决计划
? 防火墙和IDS产品添加规则,检测异常流量。
? 使用最新误差扫描工具检测内部受误差影响的装备资产。
? 风河(Wind River)公司已宣布相关版本更新和补丁信息。
? 罗克韦尔(Rockwell)、Sonicwall、施乐(Xerox)等公司已宣布更新包,请实时更新。
? 误差原理剖析
Armis Labs在VxWorks中共发明了11个0day误差,其中6个误差为严重误差并可以远程执行代码(RCE),其余5个误差为拒绝服务,信息泄露或逻辑缺陷误差。详细如下表所示:
尊龙凯官网入口ADLab选取了三个较量典范的误差CVE-2019-12255、CVE-2019-12257、CVE-2019-12258举行剖析。它们涉及到了IPNet协议栈及DHCP协议处置惩罚实现。
▲ CVE-2019-12255误差剖析
CVE-2019-12255误差是IPNet协议栈在处置惩罚TCP报文urg标记时的整数溢出误差。在受影响版本的VxWorks TCP协议栈实现中,若是一个TCP报文设置了urg标记,那么该TCP报文的urgent pointer字段会在iptcp_deliver函数中用于变量tcb-> recv.urg_ptr的赋值。在VxWorks版本6.8版本中,实现代码如下所示:
在以后socket执行recv()操作时,会挪用函数iptcp_usr_get_from_recv_queue,该函数处置惩罚报文段时首先判断目今TCP数据段是否包括urgent标记,若是包括该标记,则检查是否会将目今TCP窗口中的urgent 数据读取出来(urgent数据不允许通过通例recv读�。�。检查方法如下图所示:
其中,ugent_pointer是在函数iptcp_deliver中赋值的,len为recv函数参数,若是通过盘算发明读取len长度的数据会读取到urgent data数据,则重新对len赋值,以包管urgent 数据不被读取。下面两张图展示了上述代码的效果。
若是吸收到的TCP段中的urgent_pointer字段设置为0,则iptcp_usr_get_from_recv_queue通过盘算获得修正后的len为-1。由于len是无符号整数,即即是0xffffffff。这导致recv()挪用中设置的读取长度限制失效,从而拷贝所有可读取的数据到用户缓冲区,造成溢出。
误差验证:
凭证误差原理,我们编写了该误差的POC验证程序,并在VxWorks6.8版本的系统上举行了验证。通过直接发送urgent pointer为0的数据包,造成栈溢出后笼罩函数返回地址,如下图所示:
▲ CVE-2019-12257误差剖析
此误差是VxWorks系统装备内置的ipdhcpc(VxWorks的内置DHCP客户端)在处置惩罚DHCP响应数据包时触发的堆溢出误差。当ipdhcpc实验从DHCP服务器获取IP地址时,与目的装备位于统一子网中的攻击者可以通过特殊设计的DHCP响应数据包回复,使得VxWorks系统装备爆发堆溢出,从而可以在VxWorks系统装备上执行恣意代码。
当通过挪用ipdhcpc_if_eventcb函数对dhcp客户端的handle举行初始化时,ipdhcpc_if_eventcb函数会挪用ipdhcpc_handle_malloc函数为dhcp客户端的handle分派空间,在ipdhcpc_handle_malloc函数中,该函数为handle->info.options分派了巨细为ipdhcpc.max_message_size-264字节的空间。
当ipdhcpc_daemon的主循环内执行ipcom_recvfrom吸收响应数据包时:
ipdhcpc_daemon函数吸收后数据后,会挪用ipdhcpc_reply_input函数对吸收到的dhcp协议数据举行处置惩罚,其中handle->priv->in_optlen 的长度基于ipdhcpc.in_pkt_len盘算,handle->priv->in_optlen=ipdhcpc.in_pkt_len-240,也就是说handle->priv->in_optlen的最大值为ipdhcpc.max_message_size-240。
然后,在后续的挪用 ipdhcpc_offer_input(或ipdhcpc_ack_input),在这两个函数中会执行memcpy操作:
在上图中,handle-> priv-> in_optlen的最大值可以是ipdhcpc.max_message_size - 240,它大于为handle-> info.options分派的空间,为ipdhcpc.max_message_size - 264。在vxwroks中ipdhcpc.max_message_size值默以为576,攻击者在局域网中通过结构长度为576的恶意dhcp响应数据就可以使得被攻击装备中的vxworks系统爆发24字节的堆溢出。
▲ CVE-2019-12258误差剖析
Iptcp_input函数会挪用iptcp_process_options()函数处置惩罚TCP头的options数据域。Iptcp_process_options()函数在判断options数据域类型时,实现代码如下:

该switch凭证options数据域的类型举行分发,这个case分支是设置MSS的,行80并判断该类型的options数据域长度必需为4,若是不即是4,就判断MSS不法,直接退出。返回到iptcp_input函数中,由于返回值小于0,就进入if分支,挪用iptcp_send_reset()函数,该函数功效是重置并断掉目今TCP毗连。若是攻击者发送恶意options的TCP数据包,将导致毗连断开。此误差可以允许攻击者强制重置毗连到受影响的VxWorks装备的任何TCP会话,造成拒绝服务攻击。
? ABB公司工业自动化产品
? 通用电气工业自动化产品? 艾默生(Emerson)公司工业控制装备
? 日立(HITACHI)公司医疗装备
? 百通(Belden)工业装备
? 德尔格(Dr?ger)公司医疗装备
? 施耐德(Schneider)公司PLC
? 三菱(Mitsubishi)公司工业控制器
? 飞利浦(Philips)公司医疗装备
? 库卡(KUKA)公司工业机械人
? 史陶比尔(St?ubli)公司工业机械人
? 安川(Yaskawa)电机工业机械人
除了以上装备,尚有大宗使用VxWorks的装备,详细列表请参照参考文献链接1和2。
参考文献:
2.https://en.wikipedia.org/wiki/VxWorks#Notable_uses
3.https://armis.com/urgent11/
4.https://rockwellautomation.custhelp.com/app/answers/detail/a_id/1088561
5.https://www.sonicwall.com/support/product-notification/?sol_id=190717234810906
6.https://security.business.xerox.com/en-us/
7.https://www.windriver.com/security/announcements/tcp-ip-network-stack-ipnet-urgent11/


京公网安备11010802024551号