一、VxWorks系统概述
VxWorks是美国风河(Wind River)公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。
VxWorks支持几乎所有现代市场上的嵌入式CPU,包括x86系列、MIPS、 PowerPC、Freescale ColdFire、Intel i960、SPARC、SH-4、ARM、StrongARM以及xScale CPU。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
正因为VxWorks操作系统的开放性、模块化和可扩展性的系统结构特征以及能在多线程、多任务的系统环境中达到高实时要求的PLC控制要求,在保证实时性的同时,实现多点位、复杂功能的PLC系统控制目标,因此被广泛用于物联网嵌入式设备及工业控制领域。西门子、施耐德、罗克韦尔的多款PLC设备软件搭载在VxWorks系统上运行。
二、VxWorks漏洞统计
根据威努特IVD工控漏洞库(http://ivd.winicssec.com)的统计,当前VxWorks操作系统存在16个漏洞,其中有CVE编号的漏洞数量为13个。虽然VxWorks操作系统的CVE漏洞数量控制的很好,但是由于其应用的广泛性,上述漏洞的影响范围依旧很大。
图1、威努特IVD工控漏洞库中VxWorks漏洞的统计
三、VxWorks系统在中国的联网分布
根据威努特ICS-Radar(https://radar.winicssec.com)的统计,截止2017年12月13号,在中国的互联网上共发现8600个运行VxWorks系统的设备,其中开放wdbrpc这种高危服务的有3561个,占41.4%。ICS-Radar对wdbrpc v1和wdbrpc v2协议均支持探测,通过探测发现中国的VxWorks系统主要集中在VxWorks 5.5.x和VxWorks 5.4.x版本上,VxWorks 6.x版本系统占比较小,详细统计见图2。中国的VxWorks系统主要分布在福建、台湾、吉林等省份,其中福建占比27.7%,详细统计见图3。
图2、威努特ICS-Radar发现中国的VxWorks系统的版本统计
图3、威努特ICS-Radar发现中国的VxWorks系统按地域统计
四、VxWorks典型漏洞分析
1、CVE-2010-2967 VxWorks加密算法漏洞
1.1、CVE-2010-2967漏洞简介
VxWorks 6.9之前版本的系统中loginLib的loginDefaultEncrypt()函数存在密码碰撞问题,该函数默认使用很弱的散列函数,密码哈希总数为22万个。攻击者可以通过构建密码字典,去暴力破解telnet、ftp、rlogin等会话,从而获取系统控制权限。
1.2、CVE-2010-2967漏洞分析
loginDefaultEncrypt()函数的代码我们可以通过反汇编VxWorks的工程文件得到,如下所示。
图4、loginDefaultEncrypt()函数的汇编代码
另外,通过获取VxWorks 5.5系统的源代码,可以直接查看到该函数的源代码,部分代码如下所示。
图5、loginDefaultEncrypt()函数的C代码
由上面的代码可知,算法的加密流程分两步:
第(1)步是将密码的每位与当前位置相乘再异或,取它们的和,最后乘上31695317转化为字符串;
第(2)步将字符串的012转化为QRS,23456转化为bcde,78转化为yz,9不变。
从上面的算法流程可以看出,该函数给了一个很大的输入入口,却只有很小的输出出口,这样很容易使不同的密码得到一个相同的和,从而最后得到一个相同的哈希值,如password和FoBmA^NuN得到的哈希值都是RcQbRbzRyc。
假设我们现在遍历所有哈希,将哈希所对应的密码生成一个字典,那么我们只要知道用户名,通过遍历字典里的密码就能成功登录目标系统。
2、CVE-2010-2965 VxWorks wdbrpc远程代码执行漏洞
2.1、CVE-2010-2965漏洞简介
VxWorks 6.x, 5.x和之前版本中的WDB目标代理调试服务中存在权限许可和访问控制漏洞。远程攻击者可以借助向UDP 17185端口发送的请求读取或修改任意存储单元,执行函数调用,从而造成任意代码执行。
2.2、CVE-2010-2965漏洞分析
WDB协议基于SUN-RPC,WDB RPC请求报文的结构如图6所示。
图6、WDB协议请求报文结构
在WDB RPC 请求报文中,WDB Parameter Wrapper与Function Input Parameters两个字段为重点内容,WDB Parameter Wrapper内容包含整个请求报文的大小,校验和及请求序列号,Function Input Parameters为请求功能号的携带辅助信息。
RPC Request Header请求中的Program字段表示函数的功能号,在wdb.h文件中可以找到,如图7所示。
图7、wdb.h头文件中的函数功能定义
WDB RPC应答报文的结构如图8所示。
图8、WDB协议应答报文结构
在WDB RPC应答报文中,WDB Reply Wrapper与Function Output两个字段为重点内容,WDB Reply Wrapper内容包含整个请求包的大小、校验和及应答序列号(在每个请求与应答中,应答与请求序列号一致),Function Output包含应答的输出信息,为请求功能号的返回信息。
在WDB RPC的协议报文分析清楚后,我们发现该协议未加密、未认证,存在很大的安全隐患。我们可以通过WDB RPC协议调用get_target_info过程,获取VxWorks系统的版本、内存分配等信息;通过调用read_target_memory过程,获取VxWorks系统的内存;通过write_target_memory过程,往VxWorks系统的内存中写入数据;通过调用reboot_target过程重启目标系统。
3、CVE-2015-7599 VxWorks整形溢出漏洞分析
3.1、CVE-2015-7599漏洞简介
VxWorks 5.5版本至6.9.4.1版本中的rpcbind服务存在漏洞,rpcbind服务是SUN-RPC的一部分,在VxWorks系统中该服务监听TCP 111及UDP 111端口,攻击者向该端口发送经过特殊构造的数据包,可以导致整数溢出,从而造成任意代码执行。
3.2、CVE-2015-7599漏洞分析
通过对rpcbind服务进行Fuzzing测试,我们发现特定的数据报文可以使得tPortMapd服务崩溃,如图9所示。
图9、针对VxWorks系统Fuzzing测试导致tPortMapd服务崩溃
触发漏洞的数据报文结构如下所示。
图10、导致tPortMapd服务崩溃的数据报文结构
通过WDB RPC协议可以读出崩溃现场寄存器pc的值,利用Capstone框架对崩溃现场代码进行反汇编,可以确定问题发生在_authenticate()这个函数中,在Workbench中下硬件断点,发送数据包,代码成功断下,如图11所示。
图11、针对_authenticate() 这个函数下硬件断点
单步执行下去,当执行到call eax时,由于此时eax=0,发生错误如下图所示。
图12、单步跟踪触发异常的点
_authenticate() 函数的部分代码如图13所示。
图13、_authenticate() 函数的部分代码
进一步调试分析发现,在.text:003F7930 mov eax, [ebx+18h]处,将0xffffffff赋值给eax,这里的0xffffffff就是credential flavor字段的值,是整数溢出的触发点。
针对该漏洞的利用步骤分为三步,分别是:
1、构造添加后门用户的shellcode,利用loginUserAdd()函数添加用户。
2、利用Heap Spray在内存中布局shellcode。
3、计算credential flavor的值。
成功的利用该漏洞可在VxWorks 5.x、VxWorks 6.x上添加新用户并控制目标机。
五、VxWorks漏洞的解决方案
针对VxWorks系统的各种安全漏洞,通用的解决方案如下:
1) 在正式的产品版本中,裁剪安全隐患较高的服务,如wdbrpc;
2) 及时更新漏洞补丁,替换有问题的模块,如加密算法模块;
3) 部署工业防火墙,采用白名单策略,仅允许必要端口的白名单指令通过。