最近有朋友发给我一个中国信通院专家支撑起草的国家标准文件《GB 40050-2021网络关键设备安全通用要求》,其中指出:“为了落实《网络安全法》第二十三条网络关键设备和网络安全专用产品应当按照相关国家标准的强制性要求,由具备资格的机构安全认证合格或者安全检测符合要求后,方可销售或者提供”。该标准于2021年2月20日正式发布,并于2021年8月1日起实施。标准适用于网络关键设备,为网络运营者采购网络关键设备时提供依据,还适用于指导网络关键设备的研发、测试、服务等。
目前,根据四部门联合发布的公告《网络关键设备和网络安全专用产品目录(第一批)》,第一批网络关键设备包括了性能较高的路由器、交换机、服务器和PLC设备,具体设备类型及范围如下表:
我看了文件以后,产生一个疑问,是不是要求接入网络的关键设备PLC其指令执行时间必须小于等于0.08微秒?那么这个指令执行时间是指最快指令执行时间还是平均指令执行时间?如果是指平均指令执行时间,那么平均执行时间又如何定义?依据又是什么?难道指令执行时间大于0.08微秒的PLC就没有接入网络的需求?目前几十万台在役运行的老型号PLC就没有接入工业互联网的资格,如果接入就难以保证网络安全吗?
有鉴于此,引发出本文想讨论的主题,即PLC接入网络后要保证具有足够的安全性,即使在黑客攻击之下仍能安全运行,关键是什么呢?
PLC信息安全的架构概述
按照ISA 95基于普渡模型的定义,从结构化的架构的视角看工业自动化控制系统(IACS),可以分成四个区域(图1):安全区、单元/区段(生产线车间)、制造运营与控制区,以及企业区。现场的实际情况可能与普渡模型有一些差异,但将安全系统与控制自动化系统分割,是大多数工业行业遵循的原则,特别是那些有防爆严格要求的行业,如石化、化工等。
图1 基于普渡模型的企业信息架构
以往PLC与企业网络和互联网之间往往采用多层结构、便于实施网络安全的隔离方法。但是,由于实时数据远程存取的需求不断增长,许多连接进入了控制自动化系统。这种增长还有一个原因在于:通常要求分散分布的传感器、过程和控制数据,以实时或近实时的方式接入互联网,这导致工业物联网的导入以及其部件进入控制自动化系统(即图1所示的Level 0和Level 1)。在实现这些设备的互联网接入时,分层的方法不得不让步于在企业区和制造运营区进行连接,甚至还有从控制层直接接入公有云或私有云进行数据存取。这就使得原来围绕单元或区段建立的防卫被旁路了,因此需要在这些设备中内置网络安全的功能(cyber-resilience capabilities)。还存在一种趋势就是由于预测性维护的需要,一些关键的传感器或仪表测量装置可能跨越分层架构直接与云端连接。
控制系统网络安全承受的挑战
除了上述因PLC跨越分层架构连接网络可能招致的攻击而外,另外一个网络安全的挑战来自内部。往往通过受到病毒感染的台式计算机的途径或明或暗地引入了网络安全问题,如在向PLC下载软件或打补丁时;或者通过USB、智能手机或类似的轻型设备或私人设备(如iPad)导入了恶意软件。事实上绝大部分指向PLC的网络攻击都是通过内部直接或间接引入。
与其他类型的计算机系统一样,对PLC的网络攻击可能以破坏可信性、完整性、可用性或这些的任何组合为目标。攻击的实施往往针对PLC本身的细节(硬件、逻辑和固件)以及准备后续进行攻击PLC的恶意程序。例如,某种间谍软件可以远程安装在工程工作站、编程设备或人机界面上,也可以通过USB或本地PLC上的软件更新引入。新一代网络攻击,也被称为高级持续威胁(advanced persistent threats,APTs),通常首先使用间谍软件下载额外的恶意软件,然后使用它建立从PLC或工程站到I/O的连接。例如在震网病毒Stuxnet攻击中就是这样做的,这是隐形APT的一个重要组成部分。
当前受到工业界关注的PLC攻击病毒主要有下列4种类型:
■ 1)接入互联网的远程存取攻击;
■ 2)经典的震网病毒Stuxnet,又称PLC蠕虫;
■ 3)破坏有效载荷攻击;
■ 4)难以检测的直接攻击PLCI/O的根程序病毒包rootkit,又称PLC鬼魂。
接入互联网的远程存取攻击
Shodan是一种在线工具,与谷歌、百度等搜索引擎以爬取网页信息为目标不同,它爬取的是互联网上所有设备的IP地址及其端口号,用于查找在线存在的特定设备和设备类型。因此使用Shodan在线工具搜索面向互联网的PLC,可以广泛搜索并获取访问权限,从而通过互联网访问特定的PLC。这种直接访问的方法尽管只是访问PLC的Web服务器,但可以从互联网上运用很多办法进行远程访问攻击,包括拒绝服务(denial-of-service ,DoS)攻击和完整性攻击,诸如下载和覆盖PLC程序来破坏原有的PLC程序,损害其完整性。
经典的震网病毒Stuxnet
Stuxnet是一种独立的计算机蠕虫病毒,仅针对西门子的监控和数据采集(SCADA)系统。该蠕虫被设计用来攻击特定的西门子PLC,并利用了四个零日漏洞。2010年6月,卡巴斯基实验室在白俄罗斯首次发现了Stuxnet的最终版本。实际上早在2009年,Stuxnet病毒的早期版本就已被发现。然而,蠕虫的发展要早得多,甚至可能早在2005年。Stuxnet主要是为了破坏位于伊朗纳坦兹的一座核电站。不幸的是,Stuxnet病毒蔓延到超过115个国家,这说明,即使是有针对性的攻击,也可能扩散并造成核心目的以外的破坏。
破坏有效载荷的攻击
通过破坏有效载荷对PLC进行攻击(payload sabotage attacks),就是采用恶意软件工具(例如SOBOT)远程或就地修改或覆盖PLC上原有的控制程序,从而达到通过PLC的固件来篡改输入/输出映射表的状态或数据,直接破坏对物理过程的正常控制的目的。我们从PLC的硬件和软件架构图(见图2)可以清晰了解其机理关系。
图2 PLC的硬件和软件架构
图3进一步阐述了PLC的有效荷载程序执行的流程,即输入扫描读取刷新输入数据、程序扫描按指令逐条执行运算、输出扫描将程序运算结果输出到输出映射表、然后进入内部处理阶段,接着又按上述顺序执行。由此可见一旦外部攻击破坏了PLC的有效荷载程序,导致输出映射表产生异常输出,结果必然是破坏了PLC所控制的物理过程的正常运转,其后果难以预料。还以针对伊朗核电站的震网Stuxnet攻击为例,Stuxnet有一个病毒的功能是能通过首先感染工程工作站,然后下载恶意代码块对PLC发动有效荷载攻击,致使铀离心机的转速越转越快直至失速并发生故障。
图3 PLC有效荷载程序执行模型
直接攻击 PLC I/O的rootkit根程序病毒包
2016年11月在伦敦举行的黑帽欧洲大会(Black Hat Europe)上,荷兰University of Twente的Ali Abbasi和Majid Hashemi介绍了他们开发的一种不可检测的PLC rootkit。这种病毒可能比Stuxnet更危险,因为它是隐形的,直接影响PLC的I/O。PLC rootkit不像其他类似的攻击那样以PLC逻辑代码为目标,而是选择干扰PLC运行时逻辑运算的结果,具体表现为对I/O动态存储空间的破坏,因此难以被检测到。由于它位于系统的较低层次,又是一个跨平台的PLC威胁,因此它能够感染几乎任何供应商生产的PLC。而且这种对PLC内核之外实施攻击的开销低于1%,即使监控PLC的电源功耗的变化也无济于事。恶意软件驻留在PLC的动态内存中CONTROL ENGINEERING China版权所有,操纵I/O和PLC控制的过程。一般PLC的SoC上缺乏硬件中断,并且无法进行硬件级输出端配置检测,致使这种攻击是可行的。
这类攻击主要按以下三个步骤进行:
第一步:进入。
有三种可能方式,其一是将恶意固件安装到PLC中;其二是针对PLC的runtime程序进行控制流的攻击;其三是攻击者通过猜测默认密码对PLC进行存取。其结果是攻击者获得PLC的底层操控权。
第二步:映射。
通过映射输入和输出模块及其在内存中的空间,目的是覆盖输入和输出参数。或者将I/O映射至调试寄存器(debug registers),目标是拦截I/O的读写。
第三步:操纵。
通过改变I/O的初始化顺序,其结果是攻击者可以操纵PLC的运行。
图4 直接攻击PLC I/O的根程序病毒的操作顺序
震网病毒Stuxnet详解
Stuxnet被称为世界上第一个数字武器,它摧毁了伊朗纳坦兹电厂内大约1000个离心机。网络攻击造成的物理破坏彻底改变了网络安全专家进行威胁分析的方式,以及PLC制造商设计PLC的方式。
Stuxnet攻击之所以成为可能,是因为一个在Windows环境下运行的人机界面和四个此前未知的零日漏洞。由于这些漏洞还没有被发现,因此没有针对这些漏洞的补丁。这种蠕虫病毒目的性明确,专门用来改变纳坦兹核电站内离心机的转速。在实施病毒攻击引发PLC运行异常的同时CONTROL ENGINEERING China版权所有,人机界面却因受到病毒的欺诈没有反映异常情况,致使操作人员误以为运行正常,于是乎机械设备出现故障并最终损坏。
Stuxnet的巧妙之处在于,它是一种经过精心设计、目标明确的蠕虫,只有在满足某些预设条件的情况下才会造成伤害,这意味着大多数受感染的工厂和装置不会受到伤害。事实上,只有当工业控制系统的结构与纳坦兹核电站相匹配时,Stuxnet才会提高离心机的转速。由于其设计的复杂性,Stuxnet被定义为高级持久威胁(APT)的病毒。APT可在长时间隐匿而不被检测到的情况下连续收集数据和执行命令,由此也被称为“低速”攻击。Stuxnet使用的零日漏洞中有一个针对的是Windows操作系统。正如美国国家漏洞数据库漏洞报告CVE-2008-4250所记录的那样,它是通过服务器-消息-块(server-message-block,SMB)文件共享协议传播的。该漏洞允许远程执行代码,并在本地网络上进行攻击型的传播。该蠕虫还有其他几个特性,比如自我复制、使用命令和控制中心自行更新、包含一个隐藏的二进制文件的Windows rootkit,并试图绕过信息安全的软件产品。
据悉Stuxnet蠕虫是通过一个U盘进入纳坦兹工厂的,使其能够从内部攻击系统。这是攻击的先决条件,因为没有远程连接,纳坦兹设施无法直接从互联网访问。一旦纳坦兹设施被感染,蠕虫首先在受感染的主机上本地执行,尽管它实际上并没有对受感染的主机做任何事情。在执行后,蠕虫传播到整个控制网络,直到它找到一个运行STEP 7的Windows操作系统。STEP 7是西门子PLC的编程软件。运行STEP 7的计算机是该控制系统的工程工作站,直接与PLC交互并向PLC发出修改控制程序的命令。一旦成功到达STEP 7工程工作站,Stuxnet就会操纵它发送代码块,使PLC执行危险的命令,即让离心机以高于最初编程的转速旋转。对PLC的攻击大约每27天执行一次,这使得攻击更加隐秘和难以察觉。Stuxnet还接管了工程工作站,并在STEP 7软件上显示与实际输出不一致的数值。这个攻击步骤是攻击的核心部分,被称为欺骗。在这种真相被掩盖的情况下,铀浓缩工厂的运行工程师没有发现任何错误的迹象,还认为离心机转速正常。如果在STEP 7上显示出转速错误的数值,工程师就会认为故障是由人为错误造成的,而不是源于恶意软件,然后采取相应的行动。Stuxnet病毒感染后还将代码直接隐藏在PLC上,因此也被定义为PLC 根程序病毒包(rootkit)。
Stuxnet的部分病毒通过PLC rootkit和操纵控制计算机和PLC之间的通信,利用目标PLC作为黑客工具。通过同时瞄准控制计算机和PLC, Stuxnet成功地实现了它的目标,同时欺骗了操作人员,为摧毁离心机赢得了足够的时间。Stuxnet作为APT是一种复杂的攻击,需要大量的情报收集(intelligence-gathering)和资源来执行。为制作PLC rootkit它也有必要深入了解使用的专有通信协议和深入了解目标PLC的体系结构。
值得注意的是Stuxnet的代码现在是可以公开提供的,方便怀有不良动机的黑客实施攻击。Stuxnet还激励了可用于PLC和工业控制系统的黑客课程的数量显著增加。除了如何使用公开可用的黑客工具(如Metasploit框架)之外,还可以通过参加课程学习如何攻击PLC和工业控制系统。
以往工业控制系统和PLC使用多种通信协议,最常用的协议有Profinet、Profibus和Modbus。大多数为工业控制设计的协议都没有内置任何安全措施,由于缺乏身份验证和加密,可能允许远程代码执行、数据包侦听和重放攻击。
结束语:保护PLC系统不受攻击任重道远
在Stuxnet震网病毒发起攻击成功之后,许多PLC开发制造企业开始重视PLC的信息安全控制工程网版权所有,新设计制造的PLC内置了一些安全保护,特别是授权和访问控制。有些现代PLC还支持通信的完整性检查和加密。在固件和内存块都执行完整性检查的情况下,提供了防止操纵固件或内存块的基本保护。但是,这并不能防范通过Web服务器控制PLC从而使PLC的正常运行难以为继,乃至发生生产故障的情况。譬如说可以用改进型蛮力搜索攻击(modified brute-force dictionary attacks)对登录表单进行搜索,用以获取管理员用户名和密码达到攻击PLC Web服务器的目的。
保护PLC免受网络攻击需要一个多层次的方法。早期的隔离假设和IACS被隔离的概念不再是网络攻击保护或网络弹性的基础。有必要将网络弹性(network resilience)构建到PLC本身以及周围的设备,包括编程设备和HMI。尽管新一代PLC为身份验证、授权、完整性控制和加密提供了解决方案,但必须记住,这些机制只是确保可持续网络弹性所需安全机制的一个子集。仅仅以符合ISA/IEC 62443为目标是不够的,因为该标准仍在开发中,何况对PLC的网络攻击是黑客社区的一个新场所。我们需要的不仅仅是网络安全CONTROL ENGINEERING China版权所有,我们还需要在网络遭到灾难性的事件时快速回复和继续运行的能力控制工程网版权所有,也就是网络弹性。
这里特别要指出,过往把信息安全的防护重点集中在Level 2以上的设备和网络,而没有考虑在Level 0和Level 1上的设备和网络,这暴露了严重的网络安全问题。似乎有一种假设,这些在操作运行中的设备它们本质上要么是受保护的,要么是不会受到影响的,因此几乎所有用户和供应商都没有意识到level 0和Level 1设备缺乏网络安全和身份验证。对于那些认为不可能侵入过程传感器的想法,可以考虑简单地使用手持HART/FF现场通信手操器来更改过程传感器的识别号ID。这可能来自恶意的网络攻击,也可能是无意的操作错误,通常很难区分。但是无论原因为何,随着ID的改变,传感器将无法与PLC或DCS通信。这时可能会有报警,但要防止灾难性故障可能为时已晚。这不仅造成过程参数可视性的丧失,还可能会造成控制的丧失,甚至造成安全的丧失。到目前为止,已经发生了许多与传感器相关的网络安全灾难性故障。但由于目前还没有这一级别的网络取证,通常不可能确定流程异常是传感器或执行器的机械/电气问题,还是网络攻击的问题。
Level 0和Level 1设备的信息安全没有在任何标准和规范中得到重点考虑,这使得ISA 99(工业自动化和控制系统安全委员会)建立了一个任务小组,首先来核实Level 0和Level 1设备的信息安全问题是否在现有的IEC 62443系列标准中得到充分解决,特别是IEC 62443-4-2(IACS组件技术安全要求)。在审查了文档后发现了明显的漏洞,即现有的IEC 62443标准,以及IEEE(电气和电子工程师协会)电力行业标准都没有解决这一类与Level 0和Level 1级设备相关的独特问题。
根据上述的情势,我们应该建立如下的清醒认识:为了保护PLC系统抵御网络攻击,有必要了解PLC网络攻击的最新知识并采用最新的防护方法,而不是采用一种一成不变的防护手段。这是一个主要的挑战,因为工业控制系统要求全年没有停顿的运行,也就是24/7/365的运行模式。