Introduction

Armis 研究人员在 VxWorks 中发现了 11 个零日漏洞,VxWorks 是最流行的实时操作系统 (RTOS),被超过 20 亿台设备使用,包括工业、医疗和企业设备等关键任务设备。把这些漏洞称为 URGENT/11,这些漏洞位于 IPnet、TCP/IP 堆栈中,影响了过去13年的版本,并且是已发现的影响操作系统的漏洞的罕见示例。在其 32 年的历史中,MITRE 仅仅列出了 13 个影响 VxWorks 的 CVE,其中没有一个漏洞像 URGENT/11 那样严重影响核心网络堆栈。
近年来,在广泛使用的 TCP/IP 堆栈实现中的漏洞变得十分罕见,尤其是那些可以在目标设备上执行远程代码的漏洞。这种类型的漏洞是攻击者的圣杯,因为他们不依赖于构建在易受攻击的堆栈之上的特定应用程序,而是只需要攻击者对目标设备具有网络访问权限,这使得它们本质上可以被用来远程利用。当在 TCP 实现中发现这类漏洞的时候,它们甚至可以被用来绕过防火墙或者 NAT 解决方案,因为它们隐藏在看起来无辜的 TCP 流量中。
发现的11个漏洞中包括6个可能导致远程代码执行的严重漏洞:

  1. IPv4 数据包中 IP 选项解析过程中的堆栈溢出(CVE-2019-12256)
  2. TCP 紧急指针 = 0 导致整数下溢(CVE-2019-12255)
  3. 由格式错误的 TCP AO 选项造成的TCP 紧急指针状态混乱(CVE-2019-12260)
  4. 在连接到远程主机期间 TCP 紧急指针状态混乱(CVE-2019-12261)
  5. 由竞争条件引起的 TCP 紧急指针状态混乱(CVE-2019-12263)
  6. ipdhcpc 中的DHCP Offer /ACK 解析中的堆溢出(CVE-2019-12257)

以及还有5个可能导致拒绝服务、逻辑错误或者信息泄露的漏洞

  1. 通过格式错误的 TCP 选项进行 TCP 连接 DOS(CVE-2019-12258)
  2. 处理未经请求的反向 ARP 回复(逻辑缺陷)(CVE-2019-12262)
  3. ipdhcpc DHCP 客户端分配 IPv4 的逻辑缺陷(CVE-2019-12264)
  4. 在 IGMP 解析中通过NULL引用来进行DOS(CVE-2019-12259)
  5. 通过 IGMPv3 特定成员报告泄露 IGMP 信息(CVE-2019-12265)

本文档将详细介绍各种深奥的且被人有些遗忘的 TCP/IP 机制,这些机制已经被发现包含有网络堆栈实现过程中的漏洞,以及这些漏洞本身。白皮书还将展示这些漏洞产生的严重后果,漏洞将影响很多设备。
有关 URGENT/11 的更多信息,请访问 https://armis.com/urgent11

Armis Labs 是 Armis 的研究团队,专注于混合和拆分构成我们周围物联网设备的原子——无论是智能个人助理、外观良好的打印机、SCADA 控制器还是医院床边等生命支持设备例如一个病人监护仪。
之前的研究包括:

  • 通过蓝牙堆栈中的 RCE 漏洞针对设备的攻击向量
  • 德州仪器 BLE 芯片中的两个芯片级漏洞,嵌入在企业级接入点中。

为什么要研究 RTOS 网络堆栈?
就原始数据而言,据我们所知,运行在 RTOS 上的嵌入式微控制器和 CPU 的数量远远大于运行在成熟操作系统上的 CPU 或设备的数量。在当今世界,这些嵌入式产品和组件越来越多地连接到 LAN,甚至直接连接到 Internet。此外,构成我们基础架构的关键设备可能至少具有使用着 RTOS 的某些组件。因此,在流行着的 RTOS 中的严重漏洞的影响是巨大的而且迄今为止还没有得到人们很好的理解。
最重要的是,这些 RTOS 的代码库通常是封闭源代码的,并且在大多数情况下,对它们的安全研究很少。

执行摘要
URGENT/11 是一组 11 个被发现影响 IPnet、VxWorks 的 TCP/IP 堆栈的漏洞。其中六个漏洞被归类为严重漏洞并可以启用远程代码执行 (RCE)的漏洞。其余漏洞被归类为拒绝服务、信息泄漏或逻辑缺陷等漏洞。由于每个漏洞影响网络堆栈的不同部分,所以它们会影响一组不同的 VxWorks 版本。作为一个整体,URGENT/11 影响 VxWorks 的 6.5 及更高版本,每个版本都至少有一个 RCE 漏洞影响。过去 13 年中有很多受影响的版本,这种情况在网络领域是罕见的,是 VxWorks 在研究界相对默默无闻的结果。这个时间跨度或许会更长,根据 Wind River 的说法,当 2006 年从 Interpeak 收购 IPnet 时,其中的三个漏洞已经存在。
URGENT/11 支持三种攻击场景,具体取决于设备在网络上的位置和攻击者的位置。
第一种攻击场景影响驻留在网络边界的任何受影响的 VxWorks 设备,并这些设备直接暴露于互联网,例如防火墙、调制解调器、路由器。攻击者可以直接从 Internet 攻击此类设备,破坏它们并随后破坏它们所保护的网络。
第二种攻击场景会影响驻留在边界后方、内部网络内的任何受影响的 VxWorks 设备,这些设备通过防火墙或 NAT 解决方案连接到 Internet。URGENT/11 可以允许攻击者接管这些设备,通过拦截它们创建的到 Internet 的 TCP 连接,和操纵防火墙或 NAT 解决方案发回的数据包中的 TCP 报头的某些字段。这是由于漏洞在TCP报头的解析和处理中处于唯一的低级位置。
在最后一种情况下,由于先前的攻击而已经位于网络中的攻击者可以发送特制的广播 IP 数据包,该数据包将立即攻击本地 LAN 中所有易受攻击的 VxWorks 设备。这是由于在解析和处理 IP 标头时发现的一个非常独特的漏洞,甚至在广播过程中也会触发该漏洞。该漏洞也是一个可以导致远程接管的 RCE 漏洞。

基础工作准备
过去的研究
TCP/IP 堆栈的各个层中的实现漏洞在过去相对常见。不出所料,1990 年的软件和操作系统在其网络堆栈中存在各种 DoS 和 RCE 错误。当时,连接互联网的 PC 才刚刚开始流行,因此即使是微不足道的错误按照今天的标准来说也是可以预料的。然而,多年来,网络堆栈受到了合理的审查与考验,如今此类漏洞已经极为罕见。
在这项研究中,我们研究了 TCP/IP 协议栈的一种更现代、最新的实现。有趣的是,我们在现代 RTOS 中发现的错误与古老的与之相近的错误遭受着相同的陷阱。
例如,1997 年开始广为人知并随后被广泛利用的 WinNuke 漏洞是 Windows 95 和 NT 中的远程 DoS 漏洞。只需将单个 TCP 带外段(设置了 URG 标志)发送到 Windows 机器,即可触发该漏洞,从而导致 BSOD错误。
这与本文中介绍的 CVE-2019-12255(TCP 紧急指针 = 0 导致整数下溢)非常相似。然而,在我们的情况下,该漏洞被归类为 RCE(内存损坏)。
另一个古老的 TCP/IP 实现错误的例子是 Ping Of Death,这是一种 DoS 攻击,当时影响了许多不同的操作系统——包括 Windows、Linux、Mac 和 Unix。这个简单攻击是通过发送带有64KB数据(IP 分段数据包中可能的最大有效负载)的有效负载的 ICMP 回显请求(ping)生效的。早在 1997 年,这就是远程使各种操作系统崩溃所需要的一切。
令人惊讶的是,远程触发 TCP/IP 错误的现代示例仍然可以在最广泛使用的操作系统中找到,尽管这种情况十分罕见。例如,CVE-2019-0547 就是一个 Windows 10 DHCP 客户端中的 RCE型漏洞。这个错误可以由格式错误的 DHCP 选项触发,这很像本文档中介绍的 CVE-2019-12257 (ipdhcpc 内的 DHCP Offer/ACK 解析过程中的堆溢出)。
另一个例子是 Apple 的从 2018 年开始影响所有 Apple 设备和操作系统的堆溢出错误,即 CVE-2018-4407。这是 ICMP 错误数据包构造过程中的一个错误,该错误数据包是为了响应具有特殊手动定制 IP 选项的格式错误的 IPv4 数据包而发送的。这也与我们的 CVE-2019-12256(IPv4 数据包 IP 选项解析中的堆栈溢出)非常相似,在我们的例子中是一个 RCE 漏洞。
最近对 AWS FreeRTOS 上(Amazon 为物联网设备的 RTOS) TCP/IP 实现的研究也导致了许多 RCE 错误(CVE-2018-16522 到 CVE-2018-16528)的发现。

研究 VxWorks
VxWorks 不是开源产品。最初创作 VxWorks 的公司 Wind River 仍在对其进行更新和销售。当他们的客户购买许可证以将 VxWorks RTOS 嵌入到他们的产品中时,他们通常会收到 Wind River Workbench IDE。此 IDE 附带 VxWorks 源代码和各种硬件板级支持包 (BSP)。
过去,我们可以直接从他们的网站上获取在 VMWare 上可使用的工作 BSP 映像文件,如本文所述。如今,在联系他们的销售团队后,仍然可以获得类似的评估产品,但是这种方法对安全研究人员可能没有用。虽然合法地获取用于研究目的的源代码很困难,但二进制分析在这种对 VxWorks 研究的情况下是有效的。有大量运行着最新版本的 VxWorks 的现实产品可供购买,并且它们的固件通常可以免费在线下载。由于 workbench 自然生成二进制文件的性质,这些固件通常附带有包含完整调试符号的 ELF 文件,这就使得它们易于使用现代工具进行反编译,从而获得高质量的结果。

识别 TCP/IP 协议具体实现过程中的弱点
过去在许多不同的操作系统和软件实现中存在的 TCP/IP 漏洞具有共同的弱点。协议规定中的某些地方存在着过多的实现错误。在某些情况下,完全独立的实现中会出现完全相同的错误。在处理发现 VxWorks TCP/IP 堆栈中的安全问题任务时,我们将以下弱点图作为指导。我们发现的大多数错误都不是什么小事,与90年代的错误不同。但是,它们都与 TCP/IP 的以下部分有些相关:

  • IPv4 选项的解析和处理

    • 这些选项的结构可能会变得相当复杂。
    • 许多 IP 选项被认为是高度深奥的,在实践中很少使用,但仍然会由各种堆栈进行解析。
  • TCP 选项的解析和处理
    • 与 IP 选项类似,一些 TCP 选项在现代 Internet 上不再有意义,但大多数仍然会在各种 TCP 堆栈中实现。
    • 例如,MD5 签名选项和相当于其现代的继任者 TCP 身份验证选项 (TCP-AO) 在如今 TLS 为王的世界中几乎没有立足之地。 因此,它们几乎从未被使用过(或测试过)。
  • ICMP 错误数据包
    • 处理 IPv4 数据包时的各种错误情况,以及更高层的 TCP、UDP 和 ICMP 协议,都可能导致 ICMP 错误数据包的发送。
    • 这些错误数据包的结构非常重要,因为它们有时会包含原始坏了的数据包的副本(有时或许已被修改)。此外,某些 IP 选项也会影响它们的处理。
  • TCP 紧急/带外数据 TCP Urgent / out-of-band data
    • 根据 RFC,TCP 支持使用每个 TCP 报文段中存在的 URG 标志和紧急指针字段来发送和接收带外数据。
    • 然而,这个的准确行为定义的很糟糕,可想而知,它的实现也很糟糕(稍后将会详细介绍)。
  • IP 数据报分片
    • IPv4(和v6)支持 IP 层的数据报分段。一个64KB的数据包可以根据底层 MTU 进行分片。
    • 在实践中,这个功能很少被使用,因此分段的 IP 数据报与 IP 层之上的各种协议的组合可以产生很有趣的边缘情况。

发现的六个关键的 RCE 漏洞
如上所述,发现的六个漏洞具有严重的危害性,因为它们是可以造成导致远程代码执行后果的内存损坏型的漏洞。这六个漏洞是在 VxWorks 的TCP/IP 协议栈(IPnet)的三个相互独立的子系统中发现的。

  1. IP 层的一个 RCE 漏洞(CVE-2019-12256)
  2. TCP 层的四个 RCE 漏洞(CVE-2019-12255、CVE-2019-12260、CVE-2019-12261、CVE-2019-12263)
  3. IPnet 的内置 DHCP 客户端 ipdhcpc 中的一个 RCE 漏洞 (CVE-2019-12257)

以下部分将提供与发现这些漏洞的机制有关的一些背景知识,并详细说明漏洞本身。

漏洞:解析 IPv4 数据报的 IP 选项时的堆栈溢出
TL;DR
当向易受攻击的 VxWorks 设备发送一个包含多个源记录路由 (SRR) 选项的格式错误 IP 数据包时,会生成一个 ICMP 错误响应数据包作为响应。SSR 选项将会被复制到响应数据包的 IP 选项中,而没有进行适当的长度验证,这会导致攻击者可以控制堆栈溢出。

背景知识 - ICMP 错误数据包、IP 选项和松散源路由

ICMP error packets
ICMP 错误数据报是作为对在处理 IP 数据报期间出现的错误情况的响应而发送的。它们通常寻址到数据包的源 IP 地址。虽然大多数 ICMP 错误表明网络问题,例如路由循环或无法路由到目标 IP,但有些错误是由于传入数据包(坏的)本身的问题而出现的。例如,参数问题错误是作为有 IP 选项格式错误的 IP 数据包的响应而发送的。
许多这些返回的错误数据包中还将包含触发错误的传入的坏的数据包的副本。这个副本将会包含原始 IP 报头、TCP或UDP报头以及来自数据包有效负载中的一些附加字节。

ICMP 错误数据包的结构

由于在处理格式错误的数据时可能会出现某些边缘情况,一些 TCP/IP 实现无法将这些报头正确地重新组织到 ICMP 错误数据包中。
此类问题的一个示例是2018 年的 Apple 的 XNU 内核堆溢出错误 (CVE-2018-4407)。函数 icmp_error ( bsd/netinet/ip_icmp.c:313 )中存在整数下溢错误。如果坏数据包的 IP 报头+TCP 报头的长度超过84字节,就会触发该错误。回想一下,IP 和 TCP 报头都有一个选项字段,因此它们每个都可以最大长达 60(20+40) 个字节。
一个具有有效的 40 字节长的 TCP 选项字段和无效的 40 字节长的 IP 选项字段的TCP 数据包将会导致一个 ICMP 错误,并触发整数下溢漏洞。这反过来会导致通配符堆溢出。作者对此漏洞进行了分析。
将各种各样的 IP 选项与为响应格式错误的数据包而发送的 ICMP 错误数据包结合使用可能会导致可能会产生错误的边缘情况。但是 IP 选项本身的实际功能是什么?

IP 选项和松散源路由
每个 IPv4 数据包都有一个非强制选项字段,最长可达 40 个字节。这个字段中每个单独的选项都显示为一个 TLV 字段(类型、长度、值),并且所有选项加在一起必须在 40 个字节内。如果在解析这些选项的过程中遇到错误,将会发送一个 ICMP 参数问题数据报。
一些更广为人知的选择有:

  1. **Time Stamp(时间戳)

    URGENT/11 白皮书笔记——远程危害VxWorks的关键漏洞6.9.3及以上相关推荐

    1. main() 函数解析(一)——Linux-0.11 剖析笔记(六)

      文章目录 1. 宏定义`_syscall0` 2. `setup.s`读取的参数 3. 读取CMOS实时时钟信息 3.1 `outb_p(value,port)` 3.2 `inb_p(port)` ...

    2. setup.s 总结——Linux-0.11 剖析笔记(四)

      上一篇文章 setup.s 解读--Linux-0.11 剖析笔记(三) 详细地解释了 setup.s 的代码,整个代码完成的任务有: 获取一些参数保存在 0x90000 处 保存光标的位置 获取从 ...

    3. setup.s 解读——Linux-0.11 剖析笔记(三)

      题目:setup.s 解读--Linux-0.11 剖析笔记(三) 更新记录 版本 时间 修订内容 1.0 2018-4-14 增加了"获取显示模式"这一节,AL取值的表格 2.0 ...

    4. main 函数解析(二)—— Linux-0.11 学习笔记(六)

      main函数解析(二)--Linux-0.11 学习笔记(六) 4.6 blk_dev_init函数 void blk_dev_init(void) {int i;for (i=0 ; i<NR ...

    5. main函数解析(一)——Linux-0.11 学习笔记(五)

      main()函数解析(一)--Linux-0.11 学习笔记(五) 经过了前面的各种铺垫,终于来到了main函数.这篇博客的任务是把init/main.c讲清楚.由于牵扯到很多的函数调用,要想一次就说 ...

    6. kernel_mktime() 详解 —— Linux-0.11 学习笔记(四)

      题目:kernel_mktime() 详解 -- Linux-0.11 学习笔记(四) 在init/main.c文件中,有一个函数static void time_init(void) 该函数读取 C ...

    7. setup.s 分析—— Linux-0.11 学习笔记(二)

      更新记录 版本 时间 修订内容 1.0 2018-4-14 增加了"获取显示模式"这一节,AL取值的表格 标题: setup.s 分析-- Linux-0.11 学习笔记(二) 老 ...

    8. bootsect.s 解读——Linux-0.11 剖析笔记(二)

      题目:bootsect.s 解读--Linux-0.11 剖析笔记(二) 文章目录 一些符号常量 老式Linux设备号的命名规则 bootsect 把自己搬运到 0x90000,并跳转 加载 setu ...

    9. 2018中国人工智能开源软件发展白皮书-笔记

      "2018中国人工智能开源软件发展白皮书"是新手了解人工智能技术原理和技术现状的好文档,读完之后有再读几遍的冲动,学到了很多东西,做了笔记分享给大家共同学习,有不对的地方多多指出. ...

    10. windows 10/11 多用户同时远程登陆

      windows 10/11 多用户同时远程登陆 欢迎访问我的博客一起学习呀~ 下面示例为 :win11 设置允许远程连接 添加需要远程连接的多个用户 配置本地组策略 cmd 运行 gpedit.msc ...

    最新文章

    1. 2015级C++第14周实践项目 模板
    2. 一个asp.net2005的页面文件调用CSS样式的BUG
    3. '无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称' 或 'vue不是内部或外部命令' 的解决方法...
    4. openjdk(HOTSPOT)垃圾回收源码解读
    5. Bash脚本报错:“/bin/bash^M: bad interpreter: No such file or directory”
    6. java 上传文件注意事项
    7. 市面上热门的咖啡网站管理系统 v3.0
    8. 速读《文献管理与信息分析》笔记
    9. sql优化基数和耗费_基数估计在SQL Server优化过程中的位置
    10. PTA:6-2顺序表操作集(20分)
    11. javascript入门之私有变量
    12. 物联网架构成长之路(22)-Docker练习之Etcd服务搭建
    13. poj 1945 Power Hungry Cows 启发式搜索
    14. 解决 Kotlin 换页符提示错误 Illegal escape f 无法使用问题
    15. 微商个人相册多端小程序源码
    16. iMindMap12免费下载安装激活教程及如何免费用思维导图学习
    17. python的价值观_朴素的DevOps价值观
    18. 【Qt编程】基于QWT的曲线绘制及图例显示操作
    19. python爬虫——百度贴吧图片爬取 小项目
    20. 谷歌浏览器怎么调试js

    热门文章

    1. java tracert_超强的Tracert工具(WinMTR)
    2. 服务器网卡多路径配置文件,IPSAN(五)IPSAN多路径设置(客户端)
    3. 学习笔记20--自动驾驶测试体系
    4. MATLAB绘图 最大化全屏后保存
    5. Abbot和Marathon比较
    6. java验证码问题(不区分大小写)
    7. 计算机毕业设计JAVA垂钓分享交流网的设计与实现mybatis+源码+调试部署+系统+数据库+lw
    8. soui 设置边框_第三十四篇:在SOUI中使用异步通知
    9. php怎么字符串转成json对象_php如何将字符串转成json_后端开发
    10. 卸载驱动精灵后重启蓝屏