尊龙凯官网入口ADLab:VxWorks多个远程误差剖析

宣布时间 2019-08-02
? 误差配景

VxWorks是天下上使用最普遍的实时操作系统(RTOS) ,有凌驾20亿台装备正在使用 ,包括工业、电力、能源 ,航空航天等行业要害基础设施 。


克日 ,Armis研究团队Armis Labs在VxWorks中发明了11个0day误差被称为URGENT/11 ,其中6个误差为严重误差并可以远程执行代码(RCE) ,其余5个误差包括拒绝服务、信息泄露和逻辑缺陷误差 。这些误差能够使攻击者远程接受装备 ,而无需交互 ,甚至可以绕过防火墙等周边清静装备 。这些特征使这些误差“易于使用” ,这意味着它们可用于将恶意软件撒播到网络内部 ,这种攻击具有很大的潜力 ,类似于WannaCry恶意软件的撒播方法 ,尊龙凯官网入口ADLab强烈建议相关用户尽快举行装备版本升级并做好网络清静装备的规则升级事情 。

? 误差影响版本


URGENT/11误差影响自6.5版以来的险些所有VxWorks版本 ,不包括为认证而设计的产品版本 ,例如VxWorks 653和VxWorks Cert Edition 。


? VxWorks7(SR540和SR610)
? VxWorks6.5~6.9.4
? 使用IPNet网络协议栈的VxWorks版本

尊龙凯时 - 人生就是搏!
表1 误差影响列表

? 解决计划

? 防火墙和IDS产品添加规则 ,检测异常流量 。
? 使用最新误差扫描工具检测内部受误差影响的装备资产 。
? 风河(Wind River)公司已宣布相关版本更新和补丁信息 。
? 罗克韦尔(Rockwell)、Sonicwall、施乐(Xerox)等公司已宣布更新包 ,请实时更新 。

? 误差原理剖析

Armis Labs在VxWorks中共发明了11个0day误差 ,其中6个误差为严重误差并可以远程执行代码(RCE) ,其余5个误差为拒绝服务 ,信息泄露或逻辑缺陷误差 。详细如下表所示:

尊龙凯时 - 人生就是搏!
表2 误差形貌列表


尊龙凯官网入口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版本中 ,实现代码如下所示:

尊龙凯时 - 人生就是搏!
图1 iptcp_deliver中设置urg_ptr的代码


在以后socket执行recv()操作时 ,会挪用函数iptcp_usr_get_from_recv_queue ,该函数处置惩罚报文段时首先判断目今TCP数据段是否包括urgent标记 ,若是包括该标记 ,则检查是否会将目今TCP窗口中的urgent 数据读取出来(urgent数据不允许通过通例recv读� 。� 。检查方法如下图所示:


尊龙凯时 - 人生就是搏!
图2 检查读取数据是否会包括urgent data


其中 ,ugent_pointer是在函数iptcp_deliver中赋值的 ,len为recv函数参数 ,若是通过盘算发明读取len长度的数据会读取到urgent data数据 ,则重新对len赋值 ,以包管urgent 数据不被读取 。下面两张图展示了上述代码的效果 。


尊龙凯时 - 人生就是搏!
图3 recv请求的数据区域(泉源:URGENT/11手艺白皮书)

尊龙凯时 - 人生就是搏!
图4 重新修正len之后recv读取的数据区域(泉源:URGENT/11手艺白皮书)


若是吸收到的TCP段中的urgent_pointer字段设置为0 ,则iptcp_usr_get_from_recv_queue通过盘算获得修正后的len为-1 。由于len是无符号整数 ,即即是0xffffffff 。这导致recv()挪用中设置的读取长度限制失效 ,从而拷贝所有可读取的数据到用户缓冲区 ,造成溢出 。


误差验证:


该误差影响的版本包括VxWorks6.5到VxWorks 6.9.3 。
凭证误差原理 ,我们编写了该误差的POC验证程序 ,并在VxWorks6.8版本的系统上举行了验证 。通过直接发送urgent pointer为0的数据包 ,造成栈溢出后笼罩函数返回地址 ,如下图所示:

尊龙凯时 - 人生就是搏!
图5 CVE-2019-12255误差验证

▲ CVE-2019-12257误差剖析


此误差是VxWorks系统装备内置的ipdhcpc(VxWorks的内置DHCP客户端)在处置惩罚DHCP响应数据包时触发的堆溢出误差 。当ipdhcpc实验从DHCP服务器获取IP地址时 ,与目的装备位于统一子网中的攻击者可以通过特殊设计的DHCP响应数据包回复 ,使得VxWorks系统装备爆发堆溢出 ,从而可以在VxWorks系统装备上执行恣意代码 。


ipdhcpc守护历程启动后会进入ipdhcpc_daemon函数举行网络数据的循环监听 ,ipdhcpc_daemon函数主要流程有三步 ,第一步是通过挪用ipdhcpc_if_eventcb函数对DHCP客户端的handle举行初始化并发送DHCP广播请求 ,第二步是挪用ipcom_recvfrom吸收DHCP服务器回复的响应数据包 ,第三步是通过挪用ipdhcpc_replay_input对吸收到的响应数据包举行处置惩罚 。

尊龙凯时 - 人生就是搏!
图6 ipdhcpc_daemon函数流程示意


当通过挪用ipdhcpc_if_eventcb函数对dhcp客户端的handle举行初始化时 ,ipdhcpc_if_eventcb函数会挪用ipdhcpc_handle_malloc函数为dhcp客户端的handle分派空间 ,在ipdhcpc_handle_malloc函数中 ,该函数为handle->info.options分派了巨细为ipdhcpc.max_message_size-264字节的空间 。


尊龙凯时 - 人生就是搏!
图7 ipdhcpc_handle_malloc函数流程示意


当ipdhcpc_daemon的主循环内执行ipcom_recvfrom吸收响应数据包时:


此处吸收最多为ipdhcpc.max_message_size字节的数据包 ,ipdhcpc.in_pkt_len的最大长度为ipdhcpc.max_message_size 。

尊龙凯时 - 人生就是搏!
图8 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 。


尊龙凯时 - 人生就是搏!
图9 ipdhcpc_reply_input函数挪用示意


然后 ,在后续的挪用 ipdhcpc_offer_input(或ipdhcpc_ack_input) ,在这两个函数中会执行memcpy操作:


尊龙凯时 - 人生就是搏!
图10 ipdhcpc_reply_input流程示意


在上图中 ,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误差剖析


CVE-2019-12255误差是IPNet协议栈在处置惩罚TCP报文分片时的拒绝服务误差 。在受影响的VxWorks系统中Iptcp_input函数用于处置惩罚TCP分片的数据包 ,在剖析TCP头时 ,实现代码如下:

尊龙凯时 - 人生就是搏!
图11 Iptcp_input函数示意


Iptcp_input函数会挪用iptcp_process_options()函数处置惩罚TCP头的options数据域 。Iptcp_process_options()函数在判断options数据域类型时 ,实现代码如下:


尊龙凯时 - 人生就是搏!
图12 Iptcp_process_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 。


参考文献:


1.https://www.windriver.com/customers/
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/