8827太阳集团ADLab:VxWorks多个远程缝隙分析

颁布功夫 2019-08-02
? 缝隙布景

VxWorks是世界上使用最宽泛的实时操作系统(RTOS),,,,,有超过20亿台设备在使用,,,,,蕴含工业、电力、能源,,,,,航空航天等行业关键基础设施 。 。 。。 。。。


近日,,,,,Armis钻研团队Armis Labs在VxWorks中发现了11个0day缝隙被称为URGENT/11,,,,,其中6个缝隙为严沉缝隙并能够远程执行代码(RCE),,,,,其余5个缝隙蕴含回绝服务、信息泄露和逻辑缺点缝隙 。 。 。。 。。。这些缝隙可能使攻击者远程收受设备,,,,,而无需交互,,,,,甚至能够绕过防火墙等周边安全设备 。 。 。。 。。。这些特点使这些缝隙“易于使用”,,,,,这意味着它们可用于将恶意软件传布到网络内部,,,,,这种攻击拥有很大的潜力,,,,,类似于WannaCry恶意软件的传布方式,,,,,8827太阳集团ADLab强烈建议有关用户尽快进行设备版本升级并做好网络安全设备的规定升级工作 。 。 。。 。。。

? 缝隙影响版本


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


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

8827太阳集团(Macau)股份有限公司-Official website
表1 缝隙影响列表

? 解决规划

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

? 缝隙道理分析

Armis Labs在VxWorks中共发现了11个0day缝隙,,,,,其中6个缝隙为严沉缝隙并能够远程执行代码(RCE),,,,,其余5个缝隙为回绝服务,,,,,信息泄露或逻辑缺点缝隙 。 。 。。 。。。具体如下表所示:

8827太阳集团(Macau)股份有限公司-Official website
表2 缝霞述列表


8827太阳集团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版本中,,,,,实现代码如下所示:

8827太阳集团(Macau)股份有限公司-Official website
图1 iptcp_deliver中设置urg_ptr的代码


在尔后socket执行recv()操作时,,,,,会挪用函数iptcp_usr_get_from_recv_queue,,,,,该函数处置报文段时首先判断当前TCP数据段是否蕴含urgent标志,,,,,若是蕴含该标志,,,,,则查抄是否会将当前TCP窗口中的urgent 数据读取出来(urgent数据不允许通过通例recv读� 。 。 。。 。。。� 。 。 。。 。。。查抄方式如下图所示:


8827太阳集团(Macau)股份有限公司-Official website
图2 查抄读取数据是否会蕴含urgent data


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


8827太阳集团(Macau)股份有限公司-Official website
图3 recv要求的数据区域(起源:URGENT/11技术白皮书)

8827太阳集团(Macau)股份有限公司-Official website
图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的数据包,,,,,造成栈溢出后覆盖函数返回地址,,,,,如下图所示:

8827太阳集团(Macau)股份有限公司-Official website
图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对接管到的响应数据包进行处置 。 。 。。 。。。

8827太阳集团(Macau)股份有限公司-Official website
图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字节的空间 。 。 。。 。。。


8827太阳集团(Macau)股份有限公司-Official website
图7 ipdhcpc_handle_malloc函数流程示意


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


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

8827太阳集团(Macau)股份有限公司-Official website
图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 。 。 。。 。。。


8827太阳集团(Macau)股份有限公司-Official website
图9 ipdhcpc_reply_input函数挪用示意


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


8827太阳集团(Macau)股份有限公司-Official website
图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头时,,,,,实现代码如下:

8827太阳集团(Macau)股份有限公司-Official website
图11 Iptcp_input函数示意


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


8827太阳集团(Macau)股份有限公司-Official website
图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/