工控系统漏洞挖掘与防护

一、 背景介绍

工业控制系统是工业生产中采用的控制系统的总称。工业控制系统广泛应用在电力、水利、石油、天然气、制造等行业。根据从远程控制站返回的数据,工业控制系统可以自动化的或由操作员将高级的控制指令发送到远程工作站的控制设备上。这些控制设备又被称为现场设备,现场设备操控本地操作,例如打开或关闭阀门和继电器,收集传感器数据,监控现场环境等。

为了满足传统网络和工控系统之间数据共享和协同工作的要求,工控系统逐渐采用传统网络中常用的通信协议和软硬件系统,甚至以特定的方式直接连接到传统网络中。这使得工控系统彻底改变了封闭的工作模式,同时,也让工控系统面临传统网络中的信息安全威胁,例如,木马、病毒、拒绝服务以及黑客入侵等。由于工控系统大多用于交通、电力、核工业以及石油化工等国家级的重要领域,近年来比较出名的工业控制系统安全事件如2017年的“震网”病毒事件,伊朗的核电站铀浓缩设备遭到了病毒的定向攻击,其中使用了多个0day漏洞,造成伊朗核电站推迟发电,造成经济损失乃至人员伤亡。可见,工控系统的安全事故不仅会造成严重的经济损失,同时也会导致严重的社会影响。因此,解决工业控制系统安全问题在很大程度上取决于对其漏洞的挖掘与修复,使得在危险发生之前就可以发现其中的问题并采取防护措施,减少漏洞的危害。

二、 漏洞分类

常见工控漏洞主要分为:

1)在程序层面:工控应用与杀毒软件漏洞,平台软件漏洞,平台恶意软件防护漏洞;具体到漏洞细节有缓冲区溢出漏洞,命令执行漏洞,格式化字符串漏洞,IO漏洞,条件竞争漏洞(并发程序漏洞),敏感消息硬编码漏洞等。

2)在网络层面:TCP/IP漏洞,网络通信协议漏洞(工控协议如Modbus TCP,S7等),链路连接漏洞,网络硬件漏洞,网络监测和记录漏洞,无线连接漏洞,拒绝服务漏洞等。

3)在配置层面:网络配置漏洞,平台配置漏洞,安全策略和指南配置漏洞,管理流程漏洞等。

4)在系统层面:操作系统安全漏洞。

三、 传统漏洞挖掘技术

传统漏洞挖掘技术主要可以分为静态与动态的漏洞挖掘。

1)静态漏洞挖掘

顾名思义,就是不运行程序,通过对程序源码或者程序本身进行分析来进行漏洞的挖掘。根据目标程序的不同可以分为面向源代码的漏洞挖掘技术与面向二进制(无程序源码)的漏洞挖掘技术。

a. 面向源代码的漏洞挖掘

有数据流分析,控制流分析,模型检查等。其实质可以说是代码扫描工具,因此在某些功能上与编译器极其相似,需要进行词法分析,语法分析,语义分析等,但同时也需要自定义各式各样的复杂的规则对代码进行分析。静态检查工具ASPWC可以用来分析检查网站平台的XSS(Cross-Site Scripting)与SQL注入攻击的挖掘分析;由Berkeley大学提出的一种基于形式化方法的模型检查工具MOPS则可以检查C程序,通过将目标程序建模为状态机,用得到的安全属性对该状态机进行模型检查来进行静态的漏洞的挖掘,而针对Java的静态分析软件Fluid则可以有效地检查出使用Java进行高并发时容易出现的条件竞争问题。

b. 面向二进制的漏洞挖掘

挖掘则无法基于已有的结构进行分析挖掘,因此出现了基于逆向分析,模式匹配,补丁比对的漏洞挖掘技术。逆向分析技术是在没有目标程序源码的情况下,通过反汇编调试手段来分析程序的二进制可执行代码,来寻找程序潜在的漏洞。最基本的漏洞挖掘技术便是基于逆向分析的挖掘。将程序从固件中提取出来以后,在面向一些较小型的程序时,逆向分析其代码便是一种很实用的选择。常用的反汇编软件如IDA(Interactive Disassembler ,交互式反汇编器),dnSpy(针对.NET程序),AndroidKiller(针对安卓apk程序)等。但是在实际环境中,由于封闭的运行环境,经常无法导出系统组件,也就难以拿到工控系统中的程序,使得逆向分析技术只有在很少情况下才会被使用。一种基于模式匹配的静态分析工具GUBE通过对UAF(Use after free,通常是存在于指针free后未置为空产生漏洞)的漏洞模式的匹配,通过VSA技术追踪内存分配的操作变量,通过对其监视来建立UAF模式,也成功利用其发现了proftpd(基于unix及类unix平台的ftp服务器程序)中的漏洞。而面向大型程序时,经常使用的还有补丁对比的方式。基于补丁对比的框架binhunt通过与带补丁的二进制程序进行对比来提取漏洞相关的语义信息,确定补丁位置,分析补丁前后来进行漏洞的挖掘。

2)动态漏洞挖掘

所谓动态漏洞挖掘,便是将程序运行起来,在程序运行过程中对程序进行分析挖掘。常用的有模糊测试技术与符号执行技术。

a. 模糊测试技术

主要是反复向目标系统输入随机数据,通过大量非预期的畸形数据来试图覆盖程序的所有已知或未知的分支,从而在程序的异常行为如崩溃中寻找漏洞点。在面向一些大型工业控制系统时,所面对的常常是有着复杂体系架构的一个系统,其中的程序使用人力逆向分析将会极其低效,因此模糊测试往往是一个很好的选择。根据测试用例的生成方式,模糊测试可以分为基于变异的模糊测试与基于生成的模糊测试。基于变异的模糊测试是直接在已有的测试输入上面进行变异后作为测试输入,如google的AFL-fuzz,在已知的正常输入的基础上通过进化算法做变异得到测试用例同时将该测试用例输入到程序检查程序是否会产生异常,其本身的变异是盲目的,不接受之前测试用例效果的反馈的,缺少多样的变异策略支撑。为了弥补AFL-fuzz在这方面的缺陷,出现了一个基于神经网络的预测模型seq2seq,其可以用来预测测试数据的合理变异方向从而减少了变异的盲目性,优化了测试效果。而基于生成的模糊测试则是根据输入数据的格式生成测试输入,主要通过模型或者语法来生成满足目标系统要求的基本语法语义的测试输入,如Peach,它可以通过固定的数据结构模型和一些变异策略生成相应的测试用例,不过其缺点也很明显,即需要知道程序的数据输入模型,若未知则仍需要利用逆向分析来得到数据模型。

b. 符号执行技术

符号执行是通过系统检查程序执行路径的程序漏洞挖掘技术。其关键思想便是将输入变为符号值,对程序执行过程中的分支条件与相关变量的收集翻译来得到路径约束条件,这种方法能很快达到较高的代码覆盖率,符号执行的相关软件有如Angr,Sage等。虽然符号执行也取得了许多非常有效的成果,但其中还有很多问题如路径爆炸问题,因为符号执行志在覆盖程序执行的全部路径,则当在程序中的分支变多时路径数会成几何倍数增长,使得执行所耗费时间大幅度提升,因此在漏洞挖掘中符号执行仍然难以占据主导地位。

四、 工控系统的防护

1)遵循软件安全开发模型

解决安全问题的一个非常重要的方面就在于进行安全开发,即在开发时,不仅要遵守软件开发模型,更要从开始时便注重漏洞的防范,谨遵安全需求,安全设计,安全编码,安全监测的流程,从源头上解决漏洞的问题。

2)修复已知漏洞

在一般情况下,仍然会因为流程的不规范或技术问题等等使得系统中可能存在漏洞,因此就需要提前进行漏洞的挖掘与修复。根据前面的漏洞挖掘的各种姿势,从各个方面来尝试对整个工控系统进行漏洞挖掘,在挖掘到相关的漏洞之后,需要做的就是尽可能的进行漏洞的修补,在程序上线前尽可能修复漏洞。

3)建立工业控制系统防火墙

漏洞挖掘系统仍然可能使得有些漏洞未被探寻到,如果我们对非授权用户的操作放任不管,便给予了他们更多的可能去探寻系统漏洞并对可能会去对其进行破坏,因此需要建立一个专业的工业控制防火墙,在非正常用户试图进行对系统的漏洞探测时及时处理,减少非正常用户测试的机会。

4)建立态势感知系统

所谓态势感知,是一种基于环境的、动态、整体地洞悉安全风险的能力,是以安全大数据为基础,从全局视角提升对安全威胁的发现识别、理解分析、响应处置能力的一种方式。建立态势感知系统,就是为了脱离个体角度,从全局出发,能够从整体的流量等角度进行分析预测,及时获取攻击信息并采取防护措施。

五、 参考文献

[1] 肖智飞.基于工业互联网环境的漏洞挖掘技术应用分析[J].长江信息通信,2021,34(10):127-129.

[2] 史建琦,李志辉,基于对抗学习的工业控制协议漏洞挖掘技术研究[B]. 华东师范大学,2019,1-4

[3] 王世伟,潘峰,刘超,工业防火墙软件框架设计及规则自学习方法研究[D]. 太原科技大学,2018.

[4] 赖英旭,杨凯翔,刘静,刘增辉,基于模糊测试的工控网络协议漏洞挖掘方法[J]. 计算机集成系统,2018,1-2.