当前位置:   article > 正文

使用黑匣子神经网络预测的PLC的代码完整性证明_plc代码审核

plc代码审核

使用黑匣子神经网络预测的PLC的代码完整性证明

原文
Code Integrity Attestation for PLCs using Black Box Neural Network Predictions
申明
版权归原文作者及出版单位所有,如有侵权请联系删除。

概述

网络物理系统(CPS)广泛存在于关键领域,如果攻击者能够修改其可编程逻辑控制器(PLC)的代码,就会造成重大损失。不幸的是,证明代码完整性的传统技术(即验证代码是否被修改)依赖于固件访问或信任根,而专利或传统的PLC都不可能提供这些。在本文中,我们提出了一个实用的代码完整性检查解决方案,它基于保护隐私的黑匣子模型,而证明了PLC程序的输入/输出行为。利用PLC程序的忠实离线副本,我们通过信息流分析确定其最重要的输入,在多个组合上执行以收集数据,然后训练能够从其输入预测PLC输出(即执行器命令)的神经网络。通过利用模型的黑匣子性质,我们的解决方案保持了原始PLC代码的隐私,并不假设攻击者不知道其存在。相反,这种信任来自于这样一个事实:要同时攻击PLC代码和神经网络并取得一致的结果是非常困难的。我们在一个现代化的六级水处理厂测试平台上评估了我们的方法,发现它可以从PLC的输入中预测执行器的状态,准确率接近100%,因此可以检测到我们对PLC进行的所有120次有效的代码突变。最后,我们发现,实际上不可能同时修改PLC代码和对我们的测试者应用离散的对抗性噪声,从而导致一致的(错误的)预测。

关键字

网络物理系统,可编程逻辑控制器,代码完整性检查,神经网络,对抗性攻击

简介

​ 网络物理系统(CPSs)的特点是其软件组件和物理过程的深度结合,在许多高度敏感的领域都有应用。例如,它们出现在关键公共基础设施的工业控制系统中,使复杂的多阶段过程自动化,如原水处理或电网管理。这类CPS通常由传感器(如流量指示器)组成,用于测量物理过程的状态,执行器(如电动阀门)用于改变物理过程,以及可编程逻辑控制器(PLC),通过网络接收传感器读数并计算适当的命令发送给执行器。破坏这些组件或PLC中的任何一个,都有可能使攻击者操纵系统进入破坏性的物理状态。这促使了对防御和评估CPS的大量研究,包括基于异常检测的技术[7, 12, 17, 22, 28, 32, 39, 40, 44, 45, 47, 49, 51, 54, 57, 60, 65, 66]。指纹[13, 35, 43, 50, 79],基于不变的监控[8, 9]。11, 20, 24, 25, 29, 73, 81],可信执行环境[70],以及模糊化[26, 27, 78]。

​ 尽管这些技术成功地覆盖了许多不同的CPS威胁模型,但很少有对策能具体解决证明PLC代码完整性的关键问题。即验证原始程序或内存是否有未经授权的更改。这可能使系统容易受到蠕虫病毒的影响,最有名的是Stuxnet,它破坏了核设施中的PLC,导致气体离心机的自我分裂[52]。纳入一个证明解决方案可以帮助提高连接到物理过程的设备的可信度,例如,保证攻击者没有谨慎地嵌入一些微妙的攻击方案。不幸的是,传统的认证解决方案不能轻易地应用于CPS实际使用的PLC。例如,基于挑战-响应协议的软件验证解决方案[23, 68],需要安装固件访问(专有的PLC制造商不太可能提供),而基于信任根技术的解决方案,如TrustZone[6, 15]或SGX[16],从一开始就需要使用特定类型的硬件,因此无法在传统的控制器或低功率的嵌入式设备上使用它们。

​ 另一种方法是行为验证(或CPS验证)[62, 63, 75],通过将PLC代码的行为与它的行为方式的数学模型进行比较来验证它的完整性。这是一种较弱的证明形式,因为它不能检测到不会导致行为改变的代码修改,但它仍然可以验证PLC总是以预期的方式运行。它还有一个显著的优点,就是可以在不需要修改传统设备、不需要访问固件、不需要访问受信任的硬件功能的情况下进行部署,这在现实世界的CPS中通常是缺乏的。相反,它可以在独立的设备(如Rasp- berry Pis)上实现,这些设备读取PLC的输入/输出,根据数学模型进行验证,并在执行器的实际命令出现偏差时提醒工厂工程师。当然,这些设备也应该是值得信赖的–我们很快就会解决这个问题。

​ 对PLC程序实施这种代码完整性检查的主要困难是获得适当的表达和准确的模型来预测它们的行为,并且可以在不依赖关于系统或攻击者的不现实的假设的情况下进行训练。在以前的工作中[25],我们试图用一种方法来解决这个问题,即把故障(或突变体)注入到PLC程序中,并收集(异常)传感器读数的痕迹。这些痕迹被用来训练一个有监督的机器学习(ML)模型,该模型可以有效地对原始PLC程序产生的行为和被修改的行为进行分类。然而,这个解决方案只在CPS的模拟器上进行了评估,要在真正的PLC上实施还面临着几个挑战。特别是:(1)它所需要的大量数据跟踪将导致相应的大量资源浪费,尤其是许多随机突变没有物理效应,必须被过滤掉;(2)由于安全问题,在真实的工厂中运行任意突变的PLC程序是不可能被允许的;(3)该解决方案没有探索知道代码验证机制的对抗性攻击者的可能性。

​ 在本文中,我们提出了一个实用的代码完整性检查解决方案,它基于保护隐私的黑匣子模型,证明了PLC程序的行为。我们的方法可以应用于实际的(即不仅仅是模拟的)关键基础设施,而不会产生任何资源浪费或安全问题,也不需要任何可信的硬件组件。我们没有改变代码并等待物理效果(如[25]),而是改变了PLC的输入值,并观察因此而立即发出的执行器命令(例如,打开阀门,打开泵)。我们实施信息流分析,以确定这些操作中最重要的操作,然后使用相应的数据来训练一个高度精确的神经网络,以预测来自PLC输入的执行器命令,从而可以用来证明实际输出。我们方法的实用性和通用性是由于数据收集和模型训练可以完全通过PLC代码的离线拷贝来完成,这些代码完全描述了系统的 "网络 "部分:我们避免了对任何复杂(而且可能不准确)过程建模的需要,避免了在训练期间使用真实系统的成本和风险。此外,我们的解决方案利用了模型的黑匣子性质,以确保测试者保护原始PLC代码的隐私,并且在攻击者知道它甚至知道模型参数的情况下,它仍然值得信任。这种信任反而来自于以下事实要同时攻击PLC代码和神经网络的集合体并取得一致的结果是非常困难的[5, 72]。

​ 为了评估我们的方法,我们为安全水处理(SWaT)测试平台[2, 56]实施了我们的行为跟踪解决方案,这是一个现代六级水净化厂的缩小版。SWaT涉及超滤、脱氯和反渗透等化学过程,由六个PLC控制,这些PLC通过一个分层网络层次相互通信(以及66个传感器/执行器)。使用忠实的、经过交叉验证的Python翻译的PLC程序,我们确定了最重要的输入(即传感器读数、执行器状态和变量),生成了与输出(即执行器命令)相关的数据集,然后训练了多类神经网络,用于预测不同输入值的执行器状态。我们发现它们作为证明模型是有效的,达到了接近100%的预测准确率,并且能够检测到一系列有效的PLC代码修改攻击中的所有120个。最后,鉴于最近的工作[38, 48, 58, 76]表明神经网络容易受到对抗性攻击(即利用模型的知识专门制作的输入,以导致它们犯错),我们将我们的解决方案置于对抗性攻击者面前,发现实际上不可能改变PLC的行为,同时使用离散的对抗性噪声使证明者做出一致的(错误的)预测。

背景

在本节中,我们介绍了SWaT的概况,即我们用来评估我们的方法的水处理测试平台。随后,我们回顾了现有的远程验证代码完整性的解决方案,然后对我们的威胁模型进行了总结(并说明理由)。

SWaT试验台。安全水处理(SWaT)试验台[2, 56](图1-2)是一个真实世界水净化厂的缩小版,旨在支持防御和保障关键基础设施的技术研究。SWaT能够每分钟生产多达5加仑的安全饮用水,它通过一个涉及脱氯、反渗透和超滤等步骤的六阶段过程实现。该测试平台已经成为多个黑客马拉松的主题[10],来自学术界和工业界的研究人员都参与其中。此外,一个全面的数据集[41]产生于SWaT正常运行的七天,以及四天的攻击场景,可供下载[1],并已被用作评估多个不同的CPS防御和测试技术的基准。

​ SWaT的六个阶段由专用的Allen-Bradley ControlLogix可编程逻辑控制器(PLC)控制,它们相互之间以及与传感器和执行器进行通信与每个阶段有关。每个PLC循环运行其程序,根据最新的传感器读数和各种输入变量的值(6个PLC中共有1747个),发出适当的命令,发送给执行器。该系统总共由36个传感器组成,包括水流指示器发射器(FIT)、水箱液位指示器发射器(LIT)和化学分析仪指示器发射器(AIT)。在30个执行器中,有用于控制水箱进水的电动阀门(MVs)和用于抽水的泵(Ps)。图1提供了六个阶段的概况,以及涉及的主要传感器和执行器。SWaT测试平台的网络被组织成一个符合ISA99标准的分层结构,提供不同层次的分割和流量控制。层次结构的 “上层”,即第3层和第2层,分别处理操作管理(如数据记录的历史学家)和监督控制(如触摸面板、工程工作站)。第1层是一个连接PLC的星形网络,并通过EtherNet/IP实现通用工业协议(CIP)。最后,层次结构的 "最低 "层是第0层,由环形网络(通过UDP的EtherNet/IP)组成,连接各个PLC和它们的相关传感器。和执行器。
在这里插入图片描述

图1 SWaT的结构概述

在这里插入图片描述

图2 SWaT测试平台

​ SWaT中的传感器与制造商定义的安全值范围相关联,它们在正常运行期间应始终保持在这个范围内。如果一个传感器报告的(真实)读数超出这个范围,我们就说CPS的物理状态已经变得不安全。例如,如果一个液位指示器变送器报告说,第一阶段的原水箱已经超过了一定的百分比的满(或空),那么,由于有溢出(或不足)的风险,物理状态已经变得不安全。不安全的压力状态表明有管道爆裂的风险,不安全的水流量水平表明在系统的其他部分有可能产生连带效应的风险。

​ SWaT为水处理厂实现了一些标准的安全和保安措施,例如当这些阈值被越过时的报警(报告给操作员),以及对PLC之间交换的命令进行逻辑检查。罗克韦尔自动化公司开发的SCADA软件和工具可以让工厂工程师对系统进行监控和干预。此外,还安装了一些由研究人员开发的防御机制(见第5节)。其中一些是基于离线分析,即使用由系统历史学家记录的传感器和执行器数据。

PLC程序。PLC是使用特定领域的语言进行编程的,这些语言是为没有传统编程背景的工程师设计的。IEC 61131-3开放标准[46]为PLC编程提供了五种不同的高级语言,包括文本语言(如结构化文本、指令列表)以及可视化语言(如梯形图、功能块图)。我们关注的是使用结构化文本语言编写的PLC程序,其中程序是块状结构的,在语法上与Pascal相似。Roos[61]比较了Pascal和结构化文本的结构(例如:迭代、案例块),强调了后者完全没有递归。请注意,虽然我们的论文专注于一种PLC语言,但我们方法的黑匣子性质允许它应用于用任何其他语言编程的PLC。

在这里插入图片描述

图3 PLC结构程序代码,修改前后

​ 图3(左)中来自SWaT的PLC1的示例代码片段实现了原水进口阀MV101和泵P101/P102在打开原水出口阀MV201过程中的控制逻辑。具体来说,变量MV101_SR.EnableIn,当赋值为1,表示系统在此过程中默认应打开MV101。HMI_LIT101.AL和HMI_LIT101.AH是T101水箱水位的低和高警报。(报警是SWaT中某些传感器的关键阈值。如果传感器的值达到临界值,就会引起相应的报警)。调用函数SETD来检查一些临界条件是否满足,这可能会影响到相应执行器的行为。在这个例子中,如果LIT101的低报警被触发,MV101应该被打开,如果LIT101的高报警被触发,MV101应该被关闭。泵P101/P102的逻辑是类似的。在这个过程中,泵P101应该开启,而作为备用的P102应该一直关闭,除非P101发生故障。同时,如果MV201打开,并且LIT301发出低警报,泵P101应该被打开。如果MV201没有打开或者LIT301发出高警报,那么泵P101应该被关闭。最后,如果系统收到关机命令,则打开MV201的过程将结束。

​ 图3的右侧是相同的代码片段,但在代码修改攻击期间。在这个例子中,我们假设攻击者恶意修改了PLC代码,将MV101_SR.EnableIn和_MV_101_SR.Set的值分配为0。由于MV101是原水进水阀,水不会流入水箱T101。因此,水箱T101可能会溢出,而整个水处理过程将终止。

远程验证。有两大类技术用于证明远程(嵌入式)设备的代码完整性。首先,硬件验证,它假定远程设备有一些可信的平台模块(TPM)或其他类型的信任锚。例如,支持ARM TrustZone[15]或Intel SGX[16]。通常,验证者向远程设备(验证者)发出挑战,远程设备通过挑战和被验证的二进制代码的哈希值计算出加密签名或消息验证码[31]。也有可能远程验证一些动态的运行时间,例如控制流[6]。不幸的是,对特定类型硬件的要求可能会妨碍在使用传统PLC或低功率嵌入式设备的CPS中使用这种技术(除非它们可以与单独的TPM板相连接[64])。

​ 第二,软件验证,这是为资源有限的设备准备的,这些设备无法实现基于可信硬件级支持的方案。这些也是挑战-响应方案,但主要区别在于,验证者通过依赖计算响应所需的时间来确定验证者是否被破坏[23, 53, 67]。Seshadri等人[68]提出了第一个软件验证方案,该方案将校验和放在验证者的内存上,其方式是攻击者不能在不改变计算(正确)校验和所需时间的情况下修改该内存。为了实施这样的方案,必须在远程设备的内存中预先编程,或者从验证器中下载一个程序。一些最新版本的PLC固件(例如西门子S7系列)包括在控制逻辑上生成校验和的API,这可以帮助支持一些软件验证方案[37],但如果没有这一点,软件验证在一般情况下可能具有挑战性,因为PLC通常是专有的,而且制造商可能不愿意支持固件访问。

​ 鉴于将硬件和软件测试技术应用于CPS的挑战,出现了第三类技术,即通过将控制器的行为与它们应该如何行为的数学模型进行比较来证明。例如,Valente等人[75]建议验证者引入错误的控制信号,并将系统动态与模型进行比较,以证明传感器和控制器的操作正确。Roth和McMillin[62, 63],同样地,使用过程反馈来实现智能电网的分布式证明协议。由于这些行为验证方案都不需要硬件或固件访问,一旦构建了一个适当的表达式和精确的模型来预测控制器对传感器和执行器的影响,它们就可以应用于CPS,如SWaT

威胁模型。我们假设潜在的攻击者是内部人员(即来自组织内部的攻击者),他们可以访问PLC代码,并有能力任意修改它。由于攻击者需要能够检查他们的PLC代码修改是否成功地带来了不安全的物理状态,我们假设他们能够通过某种方式获得真实的传感器读数。此外,我们假设攻击者意识到以下情况的存在PLC的攻击者,对他们的底层模式(如神经网络的参数)有充分的了解,并且能够拦截和修改PLC和攻击者收到的传感器、执行器和输入变量值(注意,攻击者和PLC在同一网络上物理连接,因此收到相同的输入)。这些是在攻击者能够制作对抗性样本的背景下的标准假设[59]。

​ 在实践中,内部人员可能只具有这些能力的严格子集,但通过评估我们的PLC攻击者对理论上强大的攻击者的攻击,我们可以得出结论,我们也可以防御现实中可能存在的较弱的攻击者。

在这里插入图片描述

方法和实施

​ 我们方法的总体目标是能够远程证明PLC的行为与它们在原始程序下的行为相同,而不需要任何可信的硬件,不需要资源密集型的训练方法,也不需要不切实际的假设,即我们的验证器本身是不受攻击的。为了实现这一目标,我们提出了一个基于PLC输入/输出预测模型的实用和通用的验证解决方案。我们的模型可以完全在离线代码上训练,同时对真实的CPS保持高度准确。

​ 在下文中,我们将描述如何在总体上实现这三个大的步骤,特别是如何在SWaT水处理测试平台上实现这些步骤(第2节)。

通过输入突变收集数据

​ 在这一步,我们将PLC程序(如结构化的文本代码)转换为可用于离线数据收集的等效命命式程序(如Python)。在此之后,我们进行信息流分析,以确定对特定PLC最重要的输人(即最有可能导致行为变化的输入),然后在不同的值上重复执行离线版本这些输入决定了对执行器的数字输出命合是什么。这种数据收集的目的是能够对足够大的输入/输出关系集进行模型训练,以便溷盖尽可能多的正常和尽可能多的场景。

​ 离线PLC代码。对CPS实施我们的方法的主要前提是要有忠实的PLC程序的离线副本,用命令式编程语言编写。这是一个合理的假设是:PLC程序(如梯形图、功能块图或结构化文本)主要由一连串的赋值和条件语句组成,在一个连续的循环中反复执行。这种逻辑很容易转化为传统指令语言的控制结构。对于有多个PLC的CPS,我们把每个PLC翻译成一个单独的脚本,可以独立运行。这个假设

​ 由于输出是由输入唯一决定的(PLC是决定性的),所以可以进行计算。此外,当孤立地考虑一个PLC时,不需要用过程建模来计算输出。SWaT的实施。我们通过改编以前工作中使用的SWaT模拟器来满足这一前提条件[25],该模拟器包含六个实际PLC程序的Python翻译(即原始结构化文本代码的忠实翻译,如图3)。我们的改编通过增加化学过程和压力的控制逻辑扩展了模拟器–原始版本只关注水的流动。我们不需要原始模拟器中包含的(部分)过程模型,这些模型近似于水流的物理学。相反,我们只使用模拟的PLC代码,该代码已被准确翻译,并与真实的PLC进行了交叉验证。在测试平台上运行的PLC。

识别重要的输入。在突变输入之前,我们必须首先确定哪些输入应该成为目标。现实世界的PLC经常处理大量的输入,试图包括所有的输入可能会导致可扩展性方面的挑战,特别是在训练时:使用更大的特征向量需要更多的数据,可能会导致更复杂的模型。为了解决这个问题,我们建议对离线PLC代码进行信息流分析,以确定哪些输入是最重要的,即它们最有可能对输出产生影响。特别是,我们进行动态依赖性分析,反复突变PLC输入的子集,执行代码,然后如果突变改变了输出,就增加这些输入的 “重要性分数”。经过几次迭代后,可以选择最重要的输入(即具有最高的重要性分数)来构建用于训练的特征向量。

在这里插入图片描述

​ 算法2总结了这个过程的步骤,它受到Mathis等人[55]的信息流分析的启发,但简化为PLC程序的设置。由于PLC的主体是代码本质上是一个带有大开关盒结构的while-loop,我们不在中间点对代码进行检测,而是随机地对不同的输入值进行变异,然后观察和评分这些变异对输出的影响。同样,这可以完全通过执行离线PLC代码来确定,而不需要任何过程建模。

​ 直观地说,算法2的工作方式如下。首先,它用一些来自正常数据跟踪(例如从历史学家那里提取的)的值来实例化输入,并对它们执行离线代码,以确定将发出的执行器命令。其次,一个值的子集被突变(独立的和单独的);如果再次运行程序返回一个不同的输出,输入的重要性分数就会增加。最后,在重复前两个步骤若干次后,具有最高重要性分数的输入被返回。这种简单而实用的近似方法可以用来选择更有可能对学习模型有用的PLC输入子集。

​ 为SWaT实施。重要输入的数量是可控的,所有重要的输入都可以用于特征向量(见第4节)。也就是说,我们的分析只是用来识别那些重要性得分高于零的输入。因此,我们把所有的传感器读数、执行器状态和有关PLC状态的变量都作为输入。我们排除了那些我们的分析认为对我们的预测不重要的变量,如计时器和 "健康状态 "变量,这些变量只在SCADA中起报警作用。

​ 生成输入。一旦确定了PLC的重要输入变量,就可以开始收集数据。我们的目标是在(重要)输入的组合上训练模型,并在相关的输入。PLC代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/484525
推荐阅读
相关标签