本文主要是介绍使用黑匣子神经网络预测的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和它们的相关传感器。和执行器。
SWaT中的传感器与制造商定义的安全值范围相关联,它们在正常运行期间应始终保持在这个范围内。如果一个传感器报告的(真实)读数超出这个范围,我们就说CPS的物理状态已经变得不安全。例如,如果一个液位指示器变送器报告说,第一阶段的原水箱已经超过了一定的百分比的满(或空),那么,由于有溢出(或不足)的风险,物理状态已经变得不安全。不安全的压力状态表明有管道爆裂的风险,不安全的水流量水平表明在系统的其他部分有可能产生连带效应的风险。
SWaT为水处理厂实现了一些标准的安全和保安措施,例如当这些阈值被越过时的报警(报告给操作员),以及对PLC之间交换的命令进行逻辑检查。罗克韦尔自动化公司开发的SCADA软件和工具可以让工厂工程师对系统进行监控和干预。此外,还安装了一些由研究人员开发的防御机制(见第5节)。其中一些是基于离线分析,即使用由系统历史学家记录的传感器和执行器数据。
PLC程序。PLC是使用特定领域的语言进行编程的,这些语言是为没有传统编程背景的工程师设计的。IEC 61131-3开放标准[46]为PLC编程提供了五种不同的高级语言,包括文本语言(如结构化文本、指令列表)以及可视化语言(如梯形图、功能块图)。我们关注的是使用结构化文本语言编写的PLC程序,其中程序是块状结构的,在语法上与Pascal相似。Roos[61]比较了Pascal和结构化文本的结构(例如:迭代、案例块),强调了后者完全没有递归。请注意,虽然我们的论文专注于一种PLC语言,但我们方法的黑匣子性质允许它应用于用任何其他语言编程的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代码 𝐶𝑃; 𝑛输入的向量 𝐼𝐶; 数目 响应PLC的数字输出。由于输出被确定为输入选择𝑚;一组标签𝐿编码的执行器命令 PLC程序唯一的和确定的,这只是通过重复产生多个重要的输入值来实现的。输出。观察它们的运行情况,在它们身上执行离线PLC代码,并记录它们的运行情况。 发出的数字输出命令。这是在不参考物理过程,因此可以对有效输入的任何组合进行重复,而不必担心时间(即由于过程缓慢)、安全或资源浪费的问题。此外,这种方法是通用的,可以应用于许多不同的CPS,因为不需要过程建模,PLC程序被视为黑盒子。
为了能够在足够大的数据集上训练模型,涵盖正常和异常处理情况,并考虑到执行离线PLC代码的成本不高,我们使用简单的随机变异策略来生成重要的输入值。一般来说,可能有一些启发式的策略来生成重要的输入值,但它们可能会导致学习到的模型出现偏差,因为影响抽样概率的方法会导致抽样的偏差。例如,我们可以使用重要性作为启发式策略的标准,但是这样一来,重要性分数较大的输入的抽样概率就会较高,也许会导致模型在重要性较低的输入上的准确性降低。SWaT的实施。对于SWaT,我们依次考虑每个离线PLC程序。传递给每个PLC的输入值包括执行器的状态、PLC变量的值,以及以报警形式出现的传感器读数的离散表示。例如,油箱液位传感器的连续读数LIT101可以触发四个警报–LIT101.H、LIT101.HH、LIT101.L、LIT101.LL–表示四个不同的高度标志(高、高高、低、低低)。我们随机产生几个不同的输入组合(报警、执行器、变量),在它们上面执行离线PLC程序,并收集作为输出返回的数字执行器命令。我们重复这个过程,直到收集到一定数量的输入/输出数据,这是由经验决定的(见第4节)。
模型训练和验证
在接下来的步骤中,我们用收集到的数据来训练预测PLC行为的模型,然后验证从离线代码中学到的预测对真实的PLC也是正确的。
模型训练。有了从我们的离线PLC程序中收集到的原始输入/输出数据,下一步就是将这些数据组织成可以通过适当的学习算法(如神经网络)进行训练的特征向量。在这项工作中,我们假设PLC的数字输出是执行器的指令,每个指令表示它们应该进入的有限数量的离散状态中的一个(例如 “执行器A123开启”)。有了这个假设,我们可以学习多类单标签分类器,其中标签代表离散执行器状态的唯一组合(即由PLC输出指令)。然后,我们的特征向量由一些重要输入的固定数值顺序组成,其中的单一标签代表这将实现的执行器状态的组合。这些数据很容易从上一步收集的原始输入/输出数据中构建。
一旦收集到特征向量,我们就用它们来训练一个有监督的ML模型。特别是,我们探索神经网络的工作。虽然某些其他模型(在第4节中进行了实验探索)能够学习输入/输出关系,但神经网络对于我们来说是一个合适的选择,因为我们可以利用其黑箱性质。首先,它们混淆了PLC程序的结构和工作原理,确保检测者保持该代码的 “隐私”(很难单独从神经网络中推断出来)。其次,要同时攻击PLC代码和神经网络是非常困难的,即在PLC中加入一个错误的行为,并操纵神经网络来持续做出改变的预测。这就提供了一个额外的隐性信任水平,这是较简单的模型所不具备的。
SWaT的实施。SWaT所需的模型(图4)稍微复杂一些,因为PLC程序期望的不是传感器读数,而是报警值(例如LIT101.HH;第3.1节)。虽然有可能添加一些预处理代码,将传感器读数映射到报警,但考虑到对抗性攻击者的存在,我们选择通过使用多标签神经网络(单层;输出层中每个节点的sigmoid激活)来混淆这种映射关系。这个神经网络(在图4中被称为NN1)然后将警报值作为输入给我们用于证明的主要(和更复杂的)神经网络NN2。为了训练NN1,我们使用一个简单的程序,随机生成大量的传感器数据及其相关的警报(在这种情况下,其映射关系是已知的)。然后,我们为单个传感器训练单独的神经网络,然后将它们全部合并到NN1中,该网络的准确度很高(基本上是100%)。
为了训练主模型,即更复杂的NN2,我们将原始输入组织成特征向量和相应的输出标签。⟨[𝑁 𝑁 1(𝑠0), 𝑁 𝑁 1(𝑠1), … , 𝑎0, 𝑎1, … 𝑣0, 𝑣1, … ], 𝑙⟩其中向量包含固定顺序的报警值𝑁 𝑁 1(𝑠𝑖),执行器状态 𝑎 ,以及变量值 𝑣𝑖 。请注意,对于SWaT的PLC,我们包括所有重要的传感器、执行器和状态变量(我们不包括定时器和健康状态变量,它们被用来向SCADA系统发出警报)。这里,𝑙表示一个标签,代表与特定PLC相关的执行器状态的独特组合。例如,在PLC1中,有三个执行器:电动阀MV101和泵P101/P102。我们可以用4个比特唯一地表示它们的状态组合:MV101有两个比特(可以是打开、关闭,或在两者之间变化)。
和每个泵的一个位(可以是开或关)。例如,标签14(即1110)代表泵P101/P102开启和阀门MV101关闭的状态。然后,这些特征向量被用来训练一个有两个隐藏层的神经网络(NN2),分别包含100和50个神经元(ReLU作为激活函数;Adam作为优化器;学习率为0.001;交叉熵损失函数)。在第4节中,我们还学习了其他种类的模型,可以结合使用,以进一步建立信任。
模型验证。在利用学习到的模型作为我们远程认证解决方案的一部分之前,重要的是要验证它们的预测对于实际系统来说也是正确的(例如,如果PLC代码翻译中存在一个错误,就可能出现差异)。为了验证我们的模型,我们需要在尽可能多的模型输入的正常条件下,通过运行实际系统来收集数据。在这段时间之后,我们从系统的历史记录中提取数据日志,并进行简单的分析:对于在时间𝑡与PLC相关的每个输入组合,从日志中提取时间𝑡+𝑖的相关执行器的状态,然后检查这些状态是否与模型对这些输入的预测相同。𝑖的值是为了反映执行器命令在系统中生效所需的最大时间(因为状态转换通常不是瞬间的)。除了检查未来的状态,我们可以直接和立即比较网络部分产生的命令。
SWaT的实施。我们用从真实系统的实时运行中提取的数据验证了我们的模型,包括传感器、交流器和以时间序列排列的变量数据。我们从不同的起点结合了系统的多次运行(总共约4小时),选择这些数据是为了最大限度地扩大数据集对正常状态的覆盖,从而确保有更多的PLC输入组合。然后,我们的验证实验(第4节)按照一般情况下的描述进行,但用不同的𝑖值来说明泵改变状态(不到一秒)和电动阀门完全打开或关闭(约8秒)所需的不同时间长度。请注意,执行器的命令立即开始生效,这些时间延迟只是为了说明执行器完成其动作所需的时间。
证明代码的行为完整性
在我们方法的最后一步,我们使用我们学到的模型为真实的PLC建立一个远程证明解决方案。直观地说,我们的想法是是不断监测这些PLC的实际输入/输出,将其与模型的预测进行对照,如果行为有差异,则发出警报。这种代码验证可以在工作站中实现,也可以在连接到PLC的独立设备(如Raspberry Pis)上实现,这些设备能够读取PLC收到的输入和它们发出的命令。我们的验证方案对CPS来说是简单而实用的,因为它可以对任何类型的PLC实施,而不考虑其语言或硬件。由于我们专注于控制逻辑的建模,我们避免了那些假定存在准确和全面的物理过程模型的工作(例如[25])的局限性。
虽然实施起来很简单,但我们的方法在强大的对抗性攻击者的存在下保持了高度的信任。攻击者的知识和他们的基础模型。我们利用底层神经网络的黑匣子性质来保护原始PLC代码的隐私,并依靠这样一个事实,即改变PLC代码的行为并操纵神经网络,使其对该案例做出相同(错误)的预测,几乎是不可能的。此外,我们的证明设备可以模拟运行不同预测模型的集合,如神经网络的多个变体,或支持向量机(SVM),以减少对抗性攻击者成功的机会[5,72],并增加整体信任。
SWaT的实施。我们对SWaT的行为认证解决方案完全遵循上述方案;我们在评估中详细阐述了特定的认证模型训练和检测到的攻击(第四节)。
评价
我们使用SWaT测试平台的实现来评估我们的CPS证明方法在检测代码修改攻击方面的有效性(第二节)。
研究问题
我们的评估是围绕以下关键研究问题(RQs)进行的。
RQ1(训练)。哪种数据规模和学习算法的组合能带来最准确的模型?
RQ2(验证)。我们的检测器是否能够有效地预测真实系统中的指令?
RQ3(攻击检测)。我们的检测仪是否能够检测到代码修改攻击?
RQ4(对抗性攻击)。我们的检测器是否能抵御对模型有了解的攻击者?
RQ1关注的是导致从PLC输入预测执行器指令的最准确模型的因素。这些因素包括所需的数据量和学习算法的变化。RQ2关注的是验证我们的测试者学习的模型能够对真实的PLC(而不仅仅是它们的离线翻译)进行准确的预测。最后,RQ3和RQ4涉及到我们的解决方案在实现其主要目的方面的有效性:检测攻击。这些攻击包括代码修改攻击以及利用模型参数知识的对抗性攻击,以便不被察觉。
实验和讨论
我们依次介绍我们对每个RQ的实验设计,以及我们从中得出的结果和结论。为在SWaT测试平台上实现这些实验而开发的程序都可以在网上找到[3]。
RQ1(训练)。我们的第一个问题是考虑哪种学习算法和训练数据集大小的组合导致了最准确的证明模型。为了研究这个问题,基于第3节中描述的方法,我们使用包含10,000到90,000个特征向量的数据集为SWaT的所有六个PLC训练模型,间隔时间为10,000。每组数据的输入值都是随机生成的。
每次,即10,000个输入值的组合不一定包括在20,000个输入值的组合中(等等)。除了神经网络,我们还训练SVM模型和Ran-dom森林(RFs),以评估它们在证明模型集合中的潜在用途。对于每个学习模型的变体,我们使用5倍交叉验证来计算其准确性,得到一个比率,表示分类器对训练集中的特征向量做出的正确预测的数量。0表示所有预测都是错误的,而1表示所有预测都是正确的。
结果。表1、表2和表3是本实验的结果。最终,我们的神经网络和SVM模型的准确率都非常高,表明这些模型的表现力足以准确预测SWaT每个过程的PLC的输出。然而,射频模型对PLC 2-5的准确率较低,我们怀疑这是由于它们对大量特征的敏感性,以及PLC状态变量的数量较多;特别是PLC 5中的20个此类变量。虽然我们的NN和SVM模型对于10,000大小的训练集已经非常准确,但我们选择将90,000作为我们的训练数据量。
剩余的实验,以最大限度地提高精度。鉴于数据完全从离线PLC代码中收集(即不涉及过程模拟),可以非常迅速地收集。
我们的神经网络测试模型在各种数据集上都达到了100%的准确率。
为了研究这个问题,我们对SWaT测试平台进行了多次运行,并收集了一个由传感器、执行器和变量值组成的综合数据集。我们没有连续地运行系统,而是从不同的起始配置初始化了多次运行,以便最大限度地实现一个简单的覆盖标准:覆盖SWaT的所有正常状态。我们从这个过程中收集了4个小时的数据,涵盖了所有的正常状态,从而最大限度地增加了不同PLC输入的数量,以验证我们的模型。对于每一行数据,我们提取输入并将其输入我们的学习模型,然后将预测的执行器状态与若干秒后记录的实际执行器状态进行比较。特别是,对于泵,我们在1秒后检查,而对于阀门,由于其状态变化较慢,我们在命令发出后7-10秒之间检查预测的变化。对于每个模型,我们计算了误报率,即表示错误预测的执行器状态的数量的比率(由于SWaT没有受到攻击,所有这样的错误预测将被视为错误的证明警报)。值为0表示没有误报;值为1表示每个预测都被认为是误报。
结果。表4显示了我们对所有变体的PLC测试者的结果。我们的神经网络和SVM模型表现非常好,对PLC 1、3、5和6的错误预测率为(接近)零。神经网络在PLC4上的表现优于SVM模型,其误报率分别为0.0001和0.1219。有趣的是,射频模型在PLC4上取得了一些成功(0.0001),但在大多数情况下比其他模型的表现要差得多。由于产生了大量的错误警报,使用RF在实践中是无效的。
尽管PLC1和3-6的误报率接近零,但神经网络(以及SVM)模型对PLC2的表现却出奇的差(0.239)。经过调查,我们发现该模型只是错误地预测了一个输入组合,而且这个特定的组合在数据集中出现了几次(即偏见)。我们在训练集中加入了100份正确标记的特征向量,重新训练了神经网络,并能够使PLC2的误报率达到0.0001(SVM为0.0002;RF为0.0001)。
经过重新训练,我们的神经网络证明模型可以预测未来的执行器状态,几乎没有误报。
RQ3(攻击检测)。我们的第三个问题是关于我们的证明方案的实用性:它能在实践中真正检测到攻击吗?特别是,它能否检测到对PLC的代码修改攻击?鉴于我们是在证明PLC代码的行为完整性,我们将这个问题进一步细化为是否可以检测到以任何方式改变PLC的输入/输出行为的攻击?
为了研究这个问题,我们设计了一个与我们以前的工作[25]类似的实验,用他们忠实的离线翻译为每个PLC程序随机生成突变体。我们为每个PLC随机生成了20个突变体,使用与[25]相同的突变算子,每个副本生成一个突变。此外,我们还必须确保我们的突变体是有效的。在我们以前的工作中,这是通过在一个模拟的物理过程中运行突变的代码来完成的。在我们的新方法中,我们只需要(完全准确的)PLC代码来确定有效性。特别是,给定一个变异程序和原始程序,我们用5000个随机生成的输入运行这两个程序,直到发现不同的执行器输出,确定给定的变异程序的有效性(如果没有发现输出的差异,变异程序被丢弃和替换)。对于每组20个有效的突变体,我们再随机产生输入,直到我们有1000个产生突变体和原始体之间不同的输出。最后,对于这些输入中的每一个,我们使用我们的证明模型来预测给定输入的(正常)输出应该是什么,如果预测与突变体造成的输出不同,则视为检测到攻击。结果。我们用我们的神经网络(和SVM)证明模型对所有120,000个输入组合(即120个突变体中的每一个有1000个有效的输入组合)进行了预测。我们发现这两个模型都能在所有的输入组合中检测出所有的突变体(即预测结果与突变体的异常输出不同),这表明它们在检测代码修改攻击方面的功效。由于我们的RF模型有很高的误报率率(RQ2),我们无法有意义地评价它作为一个检测器。
我们的PLC代码检测人员能够100%成功地检测出所有120个代码修改攻击
RQ4(对抗性攻击)。我们的第四个也是最后一个RQ评估了我们的模型对对抗性攻击者的鲁棒性,即攻击者知道模型的参数,并且可以制作噪音,以使其做出错误的预测(例如,掩盖实际PLC中的代码修改)。这个实验很重要,因为最近的工作(例如[38, 48, 58, 76])表明,神经网络对对抗性样本很脆弱。我们分两部分来研究这个问题:(1)对抗性攻击者是否能够在各种噪声范围内实现任何行为的改变;(2)对抗性攻击者是否能够在这些相同的噪声范围内实现特定的行为改变?
为了研究这些问题,首先,攻击者必须解决NN1(图4),即把传感器读数映射到警报的神经网络。基本上,攻击者将少量的噪声(在1%、5%和10%的范围内)应用于从正常数据集中提取的20000个组合[41],以便计算出它能够改变哪些警报。请注意,任何大于这个量的噪音都很可能被系统中的其他防御机制检测到。然后,对于第(1)部分,攻击者搜索这些警报的组合,使NN2的输出中的一个执行器命令发生变化,如果能找到这样的组合,则标记为成功。对于第(2)部分,我们从正常数据集中随机抽出20,000个输入值,并计算出NN2对每个输入值的输出。接下来,我们 "翻转 "这些计算出的输出中的一个执行器命令,然后让对抗性攻击者搜索它可以修改的警报(在噪声范围内),从而带来相同的执行器输出。这基本上代表了一种情况,即攻击者试图造成一个特定的(错误的)预测,以掩盖一个单独的PLC代码修改攻击。
结果。表5列出了从事前面描述的第一种情况的对抗性攻击者的成功率。同样,给定一组输入,如果攻击者能够通过对传感器输入施加𝑛%的噪声来确定其能够操纵的警报,并使用这些警报来改变NN2的任何输出,则宣告成功。可以看出,对于我们的神经网络(和SVM)模型来说,攻击者只有在较高的噪声范围内才会成功改变。这些是大级别的噪音,很可能被系统中的其他标准防御机制检测到。
表6列出了在第二种情况下,对抗性攻击者的成功率。这一次,如果攻击者能够通过对传感器输入施加𝑛%的噪声来确定其可以操纵的警报,并使用这些警报来改变NN2的输出,使之成为某些特定的输出,则宣告成功。与第一种情况相比,攻击者的成功率急剧下降(例如,使用 1%噪声的神经网络的成功率为 0.0018),即使是更高的噪声水平(神经网络的成功率低于 0.02),其数字仍然非常低。这些数字说明了攻击者在改变PLC的行为,然后操纵证明模型以做出一致的(错误的)预测的目标中会面临的挑战。即使存在这样一个强大的攻击者,在合理的时间内实现理想的、一致的操纵也是不可能的。
实际上,对抗性攻击者不可能利用离散的噪音水平持续操纵PLC代码和模型。
我们注意到,根据我们的威胁模型,攻击者也有可能改变输入到NN2的一个执行器的值。然而,这将立即被发现,因为执行器的值是离散的(相对于连续的传感器值,噪音可以影响神经网络,但不会影响PLC)。
对有效性的威胁和局限性
我们的结果的有效性受到了一些威胁。首先,由于我们的实验被应用于一个单一的CPS,结果有可能无法推广到其他系统。然而,我们强调,我们的方法是以通用性为主要目标而设计的:与以前的验证工作(例如[25])不同,我们不需要任何过程建模来训练我们的验证模型:我们只需要PLC代码的忠实离线副本。对于SWaT,我们翻译并学习了用工业标准语言(结构化文本)编写的程序,这表明其他系统的PLC也可以翻译和训练。
其次,由于缺乏对CPS的代码修改攻击的基准,以及缺乏专门针对SWaT的代码修改攻击的记录,我们遵循我们以前的工作[25],在随机生成的代码修改攻击(即突变体)上评估了攻击者。这些突变体可能并不代表一个智能攻击者可能做出的修改,我们的结果可能不适用于某些零日攻击。然而,高水平的准确性、随机(有效)代码修改的100%成功率以及该解决方案对一致的对抗性攻击的稳健性增加了我们的信心。
我们的方法的主要限制是,代码修改只在影响PLC的黑盒输入/输出行为时被检测到。与传统的硬件和软件验证方法(第2节)不同,我们无法检测到对PLC的行为没有影响的修改(例如,相当于"跳过")。然而,在实践中,PLC攻击者必须改变输入/输出行为,以最终能够在系统的其他地方造成物理损害。我们的方法可以在不正确的命令发生的那一刻检测到它,并立即发出警告。
相关工作
在过去的几年里,出现了几种不同的方法来检测和预防CPS攻击。其中包括基于异常检测的技术,通过分析物理数据的日志来识别可疑事件和异常行为[7, 12, 17, 22, 28, 32, 40, 44, 45, 47, 49, 51, 54, 57, 60, 65, 66]。数字指纹,通过监测来自传感器和过程噪声的时域和频域特征来检查传感器是否被欺骗[13, 35, 43, 50, 79];以及基于不变性的检查器,监测对传感器和执行器状态的不变属性的违反[8, 9, 11, 20, 24, 25, 29, 39, 73, 81]。除了代码修改攻击的具体目标外,许多这些工作与我们之间的一个关键区别是需要大量的来自真实系统的大量数据(用于训练),或者基础过程和控制操作的知识(例如用于设计物理不变性)。最终,我们认为这些方法是对我们的代码完整性检查方法的补充:例如,指纹识别方法可以通过检测网络中的对抗性噪声来补充我们的行为测试人员(第4节)。
不 同 对 策 的 优 势 和 劣 势 一直是各种研究的重点。 Erba 和Tippenhauer[33]欺骗了传感器的值(例如使用预先计算的模式),并且能够逃避在顶级安全会议上发表的三个黑盒异常检测器,突出了对像我们这样的补充方法的需求。Urbina等人[74]在一个综合评论中评估了几种攻击检测机制,结论是其中许多机制没有限制隐蔽攻击的影响。我们的代码完整性检查解决方案解决了这一点,即我们假设攻击者可能知道证明模型,然后利用神经网络的黑匣子性质,以维持信任。Cárdenas等人[21]提出了一个评估攻击检测机制的一般框架,但与之前的工作不同,他们关注的是不同方案之间的商业案例。例如,他们考虑了与不同方法相关的成本-效益权衡和攻击威胁,例如集中式与分布式。Sun等人[71]专门对PLC代码修改攻击的现有知识进行了系统化,得出结论:PLC需要一个完整的保护链,像我们这样的解决方案与补充方法一起使用,例如基于形式验证(如[77])或隐蔽攻击检测。
专门针对这些设备的高级攻击的出现,进一步激发了为PLC开发保护链的需要[18]。例如,Garcia等人[36]在Allen Bradley PLC的固件中展示了一种可行的攻击,使用一个物理感知的rootkit,可以在控制命令被发送到执行器之前对其进行修改。PLC也可能成为蠕虫的猎物,如PLC-Blaster[69],它将恶意的控制逻辑注入网络扫描后发现的脆弱的PLC中。我们的PLC代码验证解决方案是专门为检测这种行为变化而设计的,但只有在注入的代码被执行和发出的执行器命令被改变时才会这样做。这种防御策略可以由其他一些与PLC兼容的方法来补充,例如,从SCADA日志中动态生成/监测控制变量[80],指纹识别[14],为安全审查减少时间变量/依赖[82],或控制流完整性监测[4]。
使用代码突变作为获得和学习CPS异常行为的方法的想法首次在[24, 25]中被探讨。我们的工作不是突变PLC的代码,而是突变PLC的输入,导致一个更普遍和实用的证明解决方案。突变也已经在其他一些CPS的背景下被探索。例如,Brandl等人[19]将突变应用于混合系统的规格(而不是PLC程序本身),以得出可被视为分类器的基于模型的测试案例。系统的离散视图被用于生成测试用例,定性推理被用于表示连续部分。Chowdhury等人[30]也使用突变,但在基于模型的CPS设计工具中寻找错误,如Simulink。作为一个专门用于网络安全研究的测试平台,已经为SWaT本身开发了许多不同的对策。这些
包括异常检测器,通常使用无监督学习技术在公开发布的数据集[1, 41]上进行训练,例如[42, 47, 51]。Ahmed等人[13]实现了基于传感器和 过 程 噪 声 的 指 纹 系 统 , 用 于 检 测 欺 骗 行 为 。 Adepu 和Mathur[8, 9, 11]系统地手工推导出基于物理学的不变量和其他条件,以便在SWaT运行期间进行监测。Feng等人[34]也产生了不变量,但使用了一种基于学习和数据挖掘的方法,该方法比人工方法更容易捕捉到传感器测量中的噪声。
结论
进行训练,例如[42, 47, 51]。Ahmed等人[13]实现了基于传感器和 过 程 噪 声 的 指 纹 系 统 , 用 于 检 测 欺 骗 行 为 。 Adepu 和Mathur[8, 9, 11]系统地手工推导出基于物理学的不变量和其他条件,以便在SWaT运行期间进行监测。Feng等人[34]也产生了不变量,但使用了一种基于学习和数据挖掘的方法,该方法比人工方法更容易捕捉到传感器测量中的噪声。
结论
我们提出了一个实用的代码完整性检查解决方案,它基于保护隐私的黑盒模型,证明了PLC程序的行为。我们的方法通过其通用性和实用性推进了最先进的技术:通过关注PLC代码的翻译,而不是像以前的工作[25]那样关注过程模型,我们的模型可以为真正的关键基础设施–不仅仅是过程模拟器–完全离线训练,从而避免了资源浪费和安全问题。此外,我们的代码完整性检查方案可以在不需要任何固件修改或可信硬件组件的情况下实现(对于专有和传统的PLC来说是有问题的),并且通过利用底层神经网络的黑盒子性质,不假设攻击者不知道它的存在或模型参数。我们在SWaT(一个六级水处理测试平台)上实施了我们的技术,学习了证明模型,这些模型可以达到接近100%的准确率,并检测出一系列PLC代码修改攻击中的所有120种。最后,我们将我们的验证者置于对抗性攻击者的操纵之下,发现实际上不可能在改变PLC的行为的同时,使验证者只用少量的对抗性噪声就能做出一致的(错误的)预测。
这篇关于使用黑匣子神经网络预测的PLC的代码完整性证明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!