工控系统中PLC安全漏洞及控制流完整性研究

2021-01-08 02:25陈大伟徐茹枝
电子科技 2021年2期
关键词:控制流固件实时性

陈大伟,徐茹枝

(华北电力大学 控制与计算机工程学院,北京 102206)

随着网络与信息技术在工业控制系统中的广泛应用,针对工控系统的攻击行为也与日俱增,例如2000年澳大利亚的MaroochyShire排水系统受到攻击,导致800 000 L污水未经处理直接排放;2010年伊朗核电站遭受“震网”病毒攻击;2015年乌克兰电网遭受攻击而导致部分地区停电。这些严重的安全事故反映了保障工控系统安全的迫切性。

PLC(Programmable Logic Controller)在工业控制系统中扮演着重要的角色,其几乎可以控制工业过程中的所有关键要素,被认为是 “现代工业控制系统的大脑”。在工业环境下,未能及时且正确地执行一个或多个I/O操作可能导致工业过程的失败,从而导致不可接受的后果,所以确保PLC安全可靠运行至关重要。因此,对工业控制系统中PLC的安全漏洞和利用控制流完整性对PLC进行保护的研究具有重要意义。

1 PLC存在的安全漏洞

根据PLC设备的特点以及程序的执行流程和控制逻辑,PLC存在的安全漏洞被分为3种类型:固件修改漏洞、配置操作漏洞和控制流劫持漏洞[1]。

1.1 PLC的固件修改漏洞

PLC拥有以太网模块,且制造商也提供了升级或替换以太网卡的服务,但在大多数情况下,固件上传到现场设备的以太网卡时没有有效的安全保护机制,攻击者利用PLC的以太网模块上载恶意固件,实现对PLC的攻击[2]。PLC的固件提供了系统输入和物理输出之间的软件驱动接口,这使得攻击者在用户级就可以进行修改,利用PLC的固件更新执行恶意二进制代码[3]。针对PLC的固件修改漏洞,固件完整性验证方法[4-5]能有效地检测或阻止固件修改漏洞的攻击,并且这种验证方法可以在PLC存储新固件或运行时执行。

1.2 PLC的配置操作漏洞

攻击者通过PLC的配置操作漏洞上传恶意的控制逻辑来改变原有的物理控制过程,从而达到攻击目的。配置操作漏洞产生的原因是工程人员编写代码时过于注重系统功能,忽视了代码可能产生的漏洞和安全缺陷,例如旁路跳过、缺少某些线圈或输出、指令复用、硬编码使用、缺乏认证、缺少诊断和预警信息等。

1.3 PLC的控制流劫持漏洞

公开的PLC控制流劫持漏洞逐年增加,如表1所示。

表1 PLC的控制流劫持漏洞

由表1可以看出,PLC的控制流劫持攻击主要通过PLC设备无法发现的漏洞来实现。

针对PLC的控制流劫持攻击,现存的防御方法并不完善,所以本文研究的重点是PLC的控制流劫持防御,以此提出了针对PLC的控制流完整性机制,提高了工控系统中PLC的安全性。

二进制安全中,漏洞利用的主要目的为劫持目标设备的控制流,使目标设备按照攻击者的意图执行,或使攻击者获取目标系统的控制权,以此全面控制目标设备[7]。控制流劫持攻击能够实现的主要原因是PLC对数据和代码没有进行明确区分,PLC的存储器结构,如图1所示。

图1 PLC的存储器结构Figure 1.Structure of memory of PLC

随着攻击者的攻击手段不断进化,DEP(Data Execution Prevention)和ASLR(Address Space Layout Randomization)防御机制已经被证实无法有效抵御控制流劫持攻击,例如可利用代码重用攻击绕过DEP保护。代码重用攻击利用程序中正常的代码片段,拼接成恶意代码实现控制流劫持攻击,不需要注入代码就可以远程执行任意代码。已知的代码重用攻击包括Ret2Libc、ROP、JOP、Ret2ZP等。

PLC、通用计算机和手机设备均可能遭受代码重用攻击,但PLC存在一定特殊性,例如ARM中的函数参数是通过寄存器传递而不是堆栈,故使用ARM体系结构的PLC不会直接受到Ret2Libc攻击,但会受到Ret2ZP攻击[8]。针对PLC的代码重用攻击是下一步研究的重点。

由以上分析可知,PLC存在安全漏洞的原因如下:(1)PLC与冯诺依曼体系结构相似,其可编程性为攻击者编写攻击代码提供了程序运行的环境;(2)PLC作为下位机,与上位机的通信协议存在缺陷,使得恶意程序容易获得PLC的操作权限;(3)PLC的内存读写是弱保护,使得恶意程序容易获得PLC的操作权限。

2 控制流完整性

控制流完整性已经被公认为是一种有效的针对控制流劫持的防御方法[9]。通过对控制流程图的分析,获取程序中控制转移指令,的目标白名单,包括间接跳转、间接调用和函数返回指令。在程序的执行过程中,核对控制转移指令的目标是否在白名单中,以此有效地检测出攻击者对目标设备的劫持。

控制流完整性可以分为细粒度的控制流完整性和粗粒度的控制流完整性。细粒度的控制流完整性检查程序中的每条控制转移指令,确保每条指令都只能转移到自身的目标集合中,因此带来了很大的性能开销,而较大的性能开销则限制了这类安全机制的广泛引入。粗粒度的控制流完整性通过放宽一定的检查条件来降低性能开销,例如CCFIR验证目标比传统的控制流完整性机制更快且更简单[10],剥离二进制文件的技术同样有效降低了控制流完整性机制的性能开销[11]。但是,更加宽松的检查条件使得粗粒度的控制流完整性有可能被攻击者绕过[12],例如攻击者可以针对粗粒度的控制流完整性构建图灵完备的代码重用攻击[13]。因此,粗粒度的控制流完整性机制虽然有效降低了性能开销,但安全性得不到充分保证。

确保控制流完整性机制的安全性以及解决控制流完整性机制的性能开销是当前研究的热点,例如通过改进上下文敏感和字段敏感指针构建内核级的细粒度控制流程图[14]或强制为每个具体输入计算控制流程图[15],以此提高控制流完整性机制的安全性并降低性能开销。

较大的性能开销会影响设备运行效率并破坏PLC的实时性,但PLC是硬实时设备,在关键基础设施中不能因控制流完整性而破坏PLC的实时性。

控制流完整性机制大多应用于通用计算机,但其对嵌入式设备同样有效[16],例如针对ARM处理器驱动的设备[17]。大部分PLC使用ARM体系结构。针对PLC这种特殊嵌入式设备的制流完整性研究较少,因此设计针对PLC的更加安全且性能开销较低的控制流完整性机制是本文研究的重点。

3 PLC控制流保护机制

3.1 PLC控制流完整性机制设计原则

设计PLC的控制流完整性机制,考虑以下因素,即PLC控制流完整性机制的设计原则:(1)运行现代操作系统。某些不具备操作系统的嵌入式设备称为低功耗嵌入式设备。但大多数PLC拥有真正的操作系统,针对PLC的保护方案是具有现代操作系统的嵌入式设备。设计PLC的控制流完整性机制时考虑PLC运行实时操作系统;(2)不考虑硬件修改。性能开销是限制控制流完整性机制发展的主要障碍,设计针对PLC的控制流完整性机制时应着重解决性能开销问题,但不必考虑引入嵌入式设备的硬件,应通过改进控制流完整性机制解决性能开销问题;(3)不依赖于虚拟化。大多数嵌入式设备的处理器不支持虚拟化。任何纯粹基于虚拟化的设计方案都不适用;(4)安全性。控制流完整性机制应有足够的安全性,不能被攻击者绕过且不能增加系统风险;(5)性能开销。性能开销是控制流完整性机制的最大弊端,也是限制诸多PLC安全机制发展的最大屏障。设计针对PLC的控制流完整性机制时,解决性能开销问题至关重要;(6)实时性。首先考虑PLC的实时性,严格的实时性作为第一要素,不能因安全性而破坏PLC的实时性和可用性,应衡量和取舍PLC的安全性及实时性。

3.2 针对PLC的控制流完整性机制方案设计

ARM体系结构是PLC最常用的体系结构,如Allen-Bradley、Schneider Electric、Honeywell、WAGO等供应商制造的PLC均使用ARM体系结构。本文主要针对使用了ARM体系结构的PLC进行研究。

PLC程序的一个扫描周期如图2所示:读取输入、执行控制逻辑代码、更新输出。PLC运行时,首先扫描输入值并将其存储到变量表中,然后执行相应的控制逻辑,更新输出值。其中变量表是一个虚表,包含了控制逻辑所需要的所有变量:计数器、定时器、输入和输出等。PLC控制逻辑的两种主要类型为基于字节码的逻辑和基于二进制的逻辑。经分析,控制流完整性对两种逻辑均适用。

图2 PLC程序扫描过程Figure 2. Scanning process of program of PLC

由图2可以看出,PLC的程序扫描是一个不停循环的过程,在一个程序扫描周期中,任何I/O值的变化都会被忽略,直到下一个程序扫描周期中才会被更新。

根据PLC设备的特点、程序的执行流程和控制逻辑,基于插桩技术,设计针对PLC的控制流完整性机制。总体设计思路如图3所示。

图3 总体设计思路Figure 3. General design idea

3.3 PLC控制流保护过程

基于ARM体系结构的应用程序在执行流程中有两个位置可以被攻击者利用:一是通过修改间接函数调用中的寄存器值来实现控制流劫持;二是在返回指令之前修改返回地址的值来实现控制流劫持。PLC的控制流完整性机制在实际的调用或返回之前检查这两个位置,如图4所示。

图4 控制流验证示例Figure 4. Example of control-flow verification

控制流程图由编译器产生,覆盖了PLC运行时控制逻辑的整个控制过程。每一个校验指令中的ID都是唯一的,通过将ID添加到控制流程图中,验证机制使用ID来立即识别应用程序执行流在控制流程图中的位置。

在ARM体系结构中,通过发现BLX指令来识别间接函数调用。同时,寻找ARM指令集中所有的返回指令,例如 BX LR、POP R11等。在这些转移指令之前插入校验指令,利用控制流程图检查转移指令的目标地址是否合法,以此确保PLC控制流的完整性。

同时,PLC具有硬实时性的特点,以一种可预测的方式执行任务,以此满足对实时性的要求。在一些关键基础设施中,不能因控制流完整性的验证而导致PLC的可用性和实时性被破坏,例如污水处理系统中所使用的PLC设备必须能够对由于降雨引起的水位变化做出实时响应;发电厂中的PLC设备必须通过毫秒级的发电机断路器对发电机做出实时反应等。

由于PLC运行时的实时性限制,每个PLC程序扫描周期中处理器消耗的周期数都必须受限制且应是可预测的。因此,本文重点考虑了PLC的可用性和实时性,借鉴循环缓冲区的方法[18],在控制流完整性机制的基础上引入循环的影子堆栈,允许PLC根据实时性,限制控制流完整性机制的检查时间。同时,将控制流完整性检查机制的优先级设置的较低,以此确保PLC的可用性和实时性。影子堆栈的引入则避免了嵌入式系统中的优先级倒置问题。

PLC控制流完整性机制的总体架构及控制流保护过程如图5所示。

图5 PLC控制流保护过程Figure 5. Control-flow protection of PLC

由图5可以看出,循环缓冲区确保PLC的实时操作系统可以随时停止控制流完整性校验,以此保证了PLC的I/O操作具有足够的资源。

3.4 PLC控制流完整性机制的性能开销

在OpenPLC[19]上执行控制流劫持实验,以评估PLC控制流完整性机制的保护效果。使用ROPgadgets工具查看程序内部是否有可以利用的代码片段,并通过seed48(·)函数间接实现参数传递。经过实验验证,控制流完整性机制能有效检测出控制流违规并识别出转移控制流的函数。经过简单的控制逻辑测试,PLC控制流完整机制的性能开销如表2所示。

表2 性能开销

由表2可以看出,本文提出的防御机制在平均情况下性能开销约为3.6%,最差情况下性能开销约为5.2%,保证了PLC的实时性。

工业控制控系统是专业性较强的系统,PLC应用的领域也比较固定,使用控制流完整性机制可以有效阻止由PLC安全漏洞所带来的恶意攻击问题。设计针对PLC的高效控制流完整性机制可大幅提升PLC的安全性,从而显著提高工业控制系统的安全性。对PLC控制流完整性机制的下一步研究思路如下:进一步解决控制流完整性机制带来的性能开销问题;保证PLC在复杂控制逻辑下的实时性;找到合适的部署方式。

4 结束语

PLC设备的特点和控制逻辑带来了不同的安全漏洞,对工业控制系统的安全性产生了严重威胁。本文分析了控制流完整性机制并将其引入到PLC设备中,提出了针对PLC的控制流完整性机制,以便有效地应对PLC中存在的安全威胁,并以此提高工业控制系统的安全性。但是本研究仍具有一定的局限性,在今后的研究中需要对PLC的安全漏洞进一步挖掘,并对PLC的控制流完整性机制所带来的性能开销以及部署问题做进一步研究。

猜你喜欢
控制流固件实时性
抵御控制流分析的Python 程序混淆算法
抵御控制流分析的程序混淆算法
基于控制流的盒图动态建模与测试
航空电子AFDX与AVB传输实时性抗干扰对比
计算机控制系统实时性的提高策略
基于固件的远程身份认证
提取ROM固件中的APP
基于控制流隐藏的代码迷惑
一种通过USB接口的可靠固件升级技术
一种车载Profibus总线系统的实时性分析