VxWorks 是世界上使用最广泛的一种在嵌入式系统中部署的实时操作系统,是由美国WindRiver公司(简称风河公司,即WRS 公司)于1983年设计开发的。其市场范围跨越所有的安全关键领域,仅举几例,包括火星好奇心流浪者、波音787梦幻客机、网络路由器。这些应用程序的安全高危性质使得VxWorks的安全被高度关注。
加拿大安全研究人员Yannick Formaggio发现 VxWorks中存在严重的漏洞 ,允许攻击者远程执行代码。Formaggio对VxWorks进行了深入的安全分析,包括它所支持的网络协议和操作系统安全机制。演讲中他展示了其开发的VxWorks评估工具,主要目的是通过在python中实现WdbRPC协议来提供有效的渗透测试。为了显示它的效果,揭示一些在研究过程中发现的bug。
VxWorks操作系统是由美国Wind River(风河公司)开发的一种嵌入式实时操作系统(RTOS),已宣称拥有至少1.5亿台设备,VxWorks支持几乎所有现代市场上的嵌入式CPU架构,包括x86系列、MIPS、 PowerPC、Freescale ColdFire、Intel i960、SPARC、SH-4、ARM, StrongARM以及xScale CPU。
这一页是介绍VxWorks从2008年至2015年的CVE安全漏洞数量详细信息统计图表:
来源: http://www.cvedetails.com/product/15063/Windriver-Vxworks.html?vendor_id=95
风河公司非常注重VxWorks的安全性:
2011年与McAfee建立合作伙伴关系。 VxWorks 6.x 引进了一些内存保护机制。 VxWorks 7.x 进一步提升了以下方面: 数字签名模块(X.509) 加密 集中式的用户数据库 密码管理(SHA-256算法) 在运行过程中创建/删除用户 加密数据存储
在这一节,演讲者主要介绍了以往一些大牛对VxWorks的漏洞挖掘的研究。
在2010年, HD Moore 在Metasploit社区发表了题为“ Shiny Old VxWorks Vulnerabilities ”的漏洞分析文章,并且提供了4个针对WDB RPC的msf攻击模块以及密码的哈希算法加密漏洞。
在2011年, /DEV/TTYS0 大牛对VxWorks的固件WRT54Gv8进行了逆向分析,并发表了题为“ Reverse Engineering VxWorks Firmware: WRT54Gv8 ”的文章。
SecNiche Security Labs 的安全研究人员对VxWorks整体的系统安全和固件进行了漏洞挖掘,并发表了题为“ Digging Inside VxWorks OS and Firmware – Holistic Security ”的文章。
X86内存布局:上端内存
X86内存布局:中断向量表(在32位保护模式下该表称为中断描述符表)IDT
X86内存布局:致命错误异常消息的ASCII字符串
X86内存布局:VxWorks镜像入口点
X86内存布局:WDB(Wind Debug协议)共享内存
内存保护:
VxWorks 为带有 MMU 的目标板提供了虚拟内存机制,对于非 MMU 的目标板是基于堆错误检测进行内存保护。
接下来是介绍VxWorks在内存保护方面所实现的一些机制。
内存保护:
任务堆栈超荷和欠载检测 中断堆栈超荷和欠载检测
内存保护:
非可执行的任务堆栈 & 非可写文本段 INCLUDE_TASK_STACK_NO_EXEC INCLUDE_PROTECT_TEXT 任务堆栈大小 = MMU 页大小
内存保护:
空指针使用检测
堆区块超荷检测 / 使用情况跟踪与泄漏检测
接下来是介绍WDB协议V2的动态图解:
调用:由目标服务器发出
应答:由目标代理发出
针对VxWorks 5.x 使用WDB对过程进行监测(一): 绿色表示调用过程,红色表示应答过程。
针对VxWorks 5.x 使用WDB对过程进行监测(二): 调用过程:主机连接至目标。
针对VxWorks 5.x 使用WDB对过程进行监测(三): 应答过程:目标连接至主机。
针对VxWorks 5.x 使用WDB对过程进行监测(四): 调用过程:主机对目标发起WDB功能调用操作。
针对VxWorks 5.x 使用WDB对过程进行监测(五): 应答过程:目标对主机发起WDB功能调用操作。
针对VxWorks 5.x 使用WDB对过程进行监测(六): 调用过程:主机对目标发起WDB内容挂起操作。 应答过程:目标对主机发起WDB内容挂起操作。
针对VxWorks 5.x 使用WDB对过程进行监测(七): 调用过程:主机对目标发起WDB事件点添加操作。 应答过程:目标对主机发起WDB事件点添加操作。
针对VxWorks 5.x 使用WDB对过程进行监测(八): 调用过程:主机对目标发起WDB内容控制操作。 应答过程:目标对主机发起WDB内容控制操作。
下面是针对VxWorks 6.x 使用WDB对过程进行监测(一):
在 Gopher 上获取更多信息。
针对VxWorks 6.x 使用WDB对过程进行监测(二):
目标向主机发送事件通知。
主机确认。
主机请求更多的信息(寄存器内容,内存区域......)
一些外部依赖项:
PyElfTools: 从 VxWorks 图像读取导入
Capstone Engine: 对崩溃区周围的代码进行反汇编
这一节将对VxWorks的一些网络协议(RPC,FTP,TFTP,NTP等)进行fuzzing。使用Sulley fuzzing框架。对于没有可用的精确崩溃检测的问题可以使用 WdbRPC 作为解决方案。
与Sulley进行对接:
灵感来自于与 Sulley process_monitor.py 脚本 执行情况: DebuggerThread 实例化 WdbDbg,并实现回调在崩溃发生时调用。 ProcessMonitorPedRPCServer 与 Sulley 的 ped rpc 例程进行对接。 VxMon 包装的一切。
接下来是Fuzzing过程的图解:
这一页是模糊测试的一个Demo:
接下来是对Fuzzing过程中产生的崩溃进行分析:
Portmap任务在相同的 RPC 字段崩溃多次: 凭据的味道 当设置为负值,则 => PC 设置为任意的内存值
对系统的authenticate函数进行反汇编:
对eax寄存器进行赋值操作:
对ebx寄存器进行赋值操作:
使用cmp指令对比ebx寄存器和2的大小,注意右侧ebx寄存器的值为0:
jg是个大于转移的汇编指令,由于0<2不满足条件,所以不会跳到0x4173c7地址处执行。
由于上面并未跳转所以继续向下执行,call指令调用了svcauthsw函数:
进入svcauthsw函数内存空间,发现已经发生了溢出。
整数溢出导致了RCE(远程代码执行) 堆喷射shellcode 计算凭据风味值 直接跳进shellcode 绕过所有的内存保护 设置后门帐户
该议题的演讲者在PPT后面的一页中已作相关说明,因此此漏洞的exp他并不会发布。
在模糊测试的过程中发现了其他的bug:
FTP 服务器在被高速访问时容易出现环缓冲区溢出错误。 当FTP收到精心构造的用户名和密码时会崩溃,网络堆栈会挂掉!
风河公司对VxWorks的安全的确很重视,实现了很多内存保护机制,不过最后被一个简单的整数溢出漏洞打败了。
原文PPT下载: http://www.slideshare.net/44Con/44con-london-attacking-vxworks-from-stone-age-to-interstellar