冗余架构控制器下的攻与防

发布时间 2023-03-28 16:18:53作者: WelkinChan

本文系原创,转载请说明出处

Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯

 

 

防:《A Quad-Redundant PLC Architecture for Cyber-Resilient Industrial Control Systems》

作者:Jim Luo, Myong Kang, Emmanuel Bisse, Mike Veldink, Dmitriy Okunev, Scott Kolb , Joseph G. Tylka , and Arquimedes Canedo

期刊:《IEEE EMBEDDED SYSTEMS LETTERS》

 

研究背景与研究动机

(1)冗余设计的PLC很容易检测出物理系统的崩溃,但对于软件层面的网络攻击,如软件劫持(即利用软件漏洞获取系统权限,如ROP攻击),一是无法检测出,二自然是无法防御,三是无攻击后的应急措施

冗余设计本身的目的是避免系统故障,所以控制器的检测出发点是攻击后的结果。当网络攻击产生软件崩溃导致系统物理层面的崩溃,才可以被检测出来并作出应急措施,然而,网络攻击造成的结果空间很大,网络攻击可以对多个冗余控制器造成攻击,致使所有的冗余PLC同时失效。

(2)现今流行的PLC冗余方法:热备份。即备份PLC与主PLC并行运行,并在发生故障时不断更新以匹配主PLC的状态,从而显着提高整个系统的可用性。

局限性:只能容忍物理和随机故障。网络攻击可以同时对两个系统产生影响,导致这种冗余设计根本无法应对网络攻击

 

针对软件劫持攻击等网络攻击无法及时检测,网络攻击可以延续至多个PLC,网络攻击后难以恢复初始系统的问题,作者提出了防御架构。

 

 

设计架构——四重冗余PLC防御架构

 

 

两个bank,一个主bank,一个备份bank,一般来说主要任务运行靠主bank,也就是主bank在运行时,备份bank静默等待。

每个bank中的两个PLC都运行着相同的控制程序,接收相同的输入。

(1)对比主Bank中的PLC结果输出(文中没有具体到是什么输出,观察上下文,),若输出相同,没啥事,若不同,则启动故障转移,将不一致的输出视为无效输出,将最新有效的输出保存在PLC的硬件输出里(如PLC输出晶体管);

(2)然后,将输入发送到辅助Bank中,为了阻断从主Bank至备份Bank的攻击的输入的连续性,从主Bank转移到备份Bank的转移有延迟,作者设定的是五个控制周期,可能会导致控制的物理系统不连续,但是作者的假设是物理设备有一定的惯性,惯性时间远大于五个控制周期;

(3)转移过后,备份Bank成为了主Bank,之前的主Bank变成了备份Bank;

(4)新的备份Bank,也就是之前受到攻击的主Bank自动再生,也就是软件重置,随机挑选作者自己构造的已经编译好的二进制文件,并将内存空间地址随机化,相当于创建了一个新的软PLC;

软件重置

重置的软件为任意二进制程序,对应的不同编译参数如下,保证语义等效但语法不同

语义是指程序的意义或功能,而语法是指程序的结构和形式。

通过对程序的结构和形式进行多样化,可以生成具有相同功能的程序,但这些程序在编写时使用了不同的语法。这些程序可能具有不同的代码风格、变量名、注释等,但它们执行的任务是相同的。


一些库的功能相同但语法不同一般不会影响控制程序任务的运行。

 

检测软件劫持攻击的依据是:给定的网络攻击(rop攻击)不太可能在不同程序上都成功;不同的实例在攻击后可能会以不同的输出做出响应,从而产生差异并触发故障转移。

重置侧重两个方面:二进制文件在内存中的位置,以及原应用程序源代码;

重置方法为,如将相同功能不同编译参数的二进制文件,定位到内存中的随机空间运行,一个Bank中的两个PLC内存中的地址不一样。(注:这只是方法,能不能实现作者说了要看厂商提供固件扩展性)

 

思考

(1)肯定防不了来自网络协议层面的攻击,通过组态软件的协议控制PLC后可以让一个Bank中两个PLC输出一样但是输出结果是恶意的,那这样后面的机制都没啥用。该工作的防御重点上文也提到了,是软件劫持攻击,这类攻击仅仅是网络攻击方式的很小一部分。

(2)输出对比那部分没有说清楚是什么输出,如果是PLC常规输出如:继电器输出、晶体管输出(脉冲输出)和模拟输出(电流信号和电压信号)这几种只和控制应用程序相关的输出,那无法判断软件劫持攻击是否发生,该攻击一般无法影响控制应用程序的输出,所以最有可能是在检测PLC常规输出的基础上同时检测PLC内存中二进制文件运行结果的输出,因为PLC本身运行了一些不同编译程序的二进制文件。

(3)所以这篇文章的内核就是如何识别软件劫持攻击

攻:《Stealthy Attack Against Redundant Controller Architecture of Industrial Cyber-Physical System》

研究背景与研究动机

作者提到,在此之前(2019年)没有人对冗余架构的控制器攻击进行研究,作者为了了解冗余控制器的攻击与普通控制器有什么不同之处,提出了以下的攻击框架。

研究架构

 


 

一个控制器控制现场设备并与HMI通信,另一个运行着相同的控制逻辑程序,但既不与I/O模块通信也不与HMI通信。

当主用控制器出现故障时,备用控制器将自动接管系统。这种技术被称为“热冗余”,在检测到故障时提供即时的进程修正。为了实现的平滑切换,需要在两个控制器之间传输一些必要的数据

结论1:从作者的拍的视频中看到(未开放),冗余控制器架构对于不可预知的错误是有帮助的,但却不能防止故意的网络攻击,即使是在简单粗暴的拒绝服务攻击下。

作者指出,系统容错能力的增强并不意味着对网络攻击的安全性更高,在遭受隐蔽的网络攻击时,系统容错能力可能更加脆弱,因为它暴露了更多的攻击面。

威胁建模

 

 

攻击路径1:

攻击者首先破坏工作站或HMI,然后注入恶意逻辑代码或修改关键值(例如,设定点和线圈)来改变物理过程,就像Stuxnet那样。

这些攻击依赖于利用SCADA工作站和通信协议漏洞。为了让攻击更隐蔽,攻击者必须压制各种保护机制,而供应商可以通过引入更安全的工业协议来避免此类漏洞。

攻击路径2:

攻击者直接攻击嵌入式控制器,获取系统级访问权限,注入特权后门。然后攻击者像Triton一样部署恶意的rootkit代码,这更难以被检测,并可以维持一个持久的秘密攻击。

有一些关于Path 2的研究,讨论了如何获得对控制器的系统级访问,并部署恶意rootkit来操纵读写I/O[16],[21],[22]。随着攻击和防御技术的升级,隐身、持久性和灾难性已成为CPS网络攻击的主要特征

因此,作者认为未来的攻击者在实践中可能更喜欢路径2而不是路径1。

攻击方法

 

 

控制器的四个状态:

  1. active 它表示控制器当前负责控制工业过程。

  2. standby 它表示控制器当前是备用控制器。

  3. infected 已经被感染,它表示攻击者已将恶意代码注入控制器的内存,但尚未执行。在本文中,恶意代码的功能是一个后门,为攻击者提供将特定有效负载动态发送到系统并执行它的方法。

  4. compromised 它表示恶意代码已执行,攻击者已获得对活动控制器的系统级访问权限。

 

(1)攻击者首先对备用控制器B发起固件修改攻击以注入恶意代码,该恶意代码可以直接获取控制器B的权限,但是需要激活。在此阶段,攻击备用控制器不会引起管理员或其他监控系统的注意,因为它不会导致控制系统状态的任何变化。

(2)然后,攻击者攻击正常运行的控制器A,制造系统故障的假象,以激活切换机制,控制器B激活(控制系统状态的改变取决于冗余架构的切换机制,在这种情况下,操作员会将其视为活动控制器的“正常”故障)。结果,触发控制器B的恶意代码,控制器B被控制,攻击者接管了整体的控制过程。

(2)和(3)之间的切换问题——备份控制器和主控制器之间的切换问题——一般来说备份控制器不会一直运行,在主控制器恢复后,备用控制器任务运行会被切回主控制器。

(3)接下来,攻击者对活动控制器A发起固件修改攻击,注入后门。当这个阶段的攻击成功时,控制器A被注入恶意代码。

(4)在大多数情况下,需要重新启动系统以执行通过固件修改注入的恶意代码。因此,需要再次攻击A,导致B激活,然后恢复机制让A再次激活。

(5)最后,所有的控制器都受到攻击者的控制。

技术细节

攻击(实验)对象

 

如何修改控制器固件?

人工逆向工程更新固件发现控制器runtime继承了3S CoDeSys Runtime软件的 path transfer漏洞,3S CoDeSys (Update A) | CISA

这个漏洞的效果:可以讲任意文件写入控制器内存中

如何将控制器系统重启?

工程师站的RTSLoader.exe文件和控制器之间存在着危害巨大的漏洞,RTSLoader.exe文件提供“stop and update”功能,来关闭控制器,这将启动一个Telnet客户端访问Telnet服务器而不需要身份验证,并向FM802控制器发送一个关闭命令。

因此,可以访问Telnet服务,在不进行认证的情况下注入shutdown命令。由于该控制器具有上电自启动属性,会在一段时间后重新启动。

如何触发切换机制?

要进行联合攻击,还需要找到漏洞来触发系统的切换机制。在FM802控制器中,有两种方式导致该机制:

1)杀死运行中的进程,2)关闭系统。在实践中,利用shutdown命令注入漏洞来触发它。

思考 

那这种攻击方式能否对上文的防御机制造成损害?

该攻击使用的系统重启漏洞是基于协议的,此漏洞本身就可以开关控制器,造成损害。

而修改该控制器固件的漏洞,相当于具备写内存的权限,而不是上文防御机制提到的软件劫持攻击,无论内存地址怎么随机化,我都具备写文件的权限。

对于该防御机制最核心的部分,结果对比,因为获取了控制器读写权限,那么比对就是无效,因为可以让两个输出是相同。