SCADA/HMI 软件安全:预防蓄意攻击和潜在威胁

2014年7月份,当伊朗核电站基础设施的重要组成部分,遭到专门针对数据采集与监视控制系统(SCADA)的Stuxnet病毒攻击的时候,科幻最终走出荧幕,变成了现实。该事件仍然主要在工业自动化领域内传播,但是其它数据泄露事件,比如索尼和Target,却广为人知。网络安全意识越来越被企业管理层所重视。

除了蓄意攻击所造成的中断,无意识的错误组态或者错误操作,也会造成安全漏洞;由于现在的系统高度集成,并且包含很多层软件,因此在大多数情况下,创建并运营这些系统的人,并没有必要对软件层之间的相互作用有较深的理解。

安全分析

正如最近几年所发生的一样,分布式系统的集成程度、自动化和信息技术系统软件的复杂程度和多重结构,为恶意攻击创造了良好的条件。

但是,由于这些系统与SCADA的安全息息相关,因此不仅仅要预防蓄意攻击,还应防范其它方面的危险。不管是谁创建、运营工厂自动化系统,他们对复杂的基础设施和使用的众多软件层,并没有完全了解。因此,除非有适用的标准,否则的话,运行错误、不充分的维护、升级流程都很有可能会影响系统的可靠性和稳定性。对于系统而言,这就是“无意识病毒”;或者为怀有恶意的人打开了攻击的大门。

为了帮助系统识别潜在攻击,并避免攻击的发生,需要有一个验证矩阵。一方面,用户可以保护软件和IT基础设施,这是SCADA/HMI软件运行的基础;另一方面,需要对自动化工程本身进行分析,尤其是SCADA/HMI工程组态及其运营。

安全分析的第一个方面,是基本硬件、软件和网络基础设施,它们主要用于处理操作系统安全补丁的升级程序、身份识别和密码保护等诸如此类的事项。这种分析,并不是SCADA/HMI系统所独有的,应该遵循已有的IT标准,有很多案例可供参考。因此,我们应该将重点放在另外一个方面:软件自动化工程开发本身上,包括SCADA/HMI组态、执行和调度。

蓄意攻击

防范有意识的攻击非常重要。这些蓄意的攻击者,有些是出于政治目的而攻击生产线,而且可能是出于非常简单的目的,例如,“如果可以实施攻击,那为什么不去做”。即使是出于技术方面的挑战,就像很多计算机病毒的出现一样,并不是出于盈利或某种特定目的的攻击,只是为了满足某个人的虚荣心。

在过去15年间,编程技术、软件和通讯技术的发展进步,远远超过了大多数自动化软件工具和产品的更新换代。即使用户将软件工具升级到最新版本,也不能保护它,因为大多数解决方案都是基于落后的技术。因此只要愿意,这些精通科技的少年就有可能破解它。

潜在威胁

随着系统复杂性的增加,在现场进行调试时,也许并不可能完全模拟每一种假设场景,所以在设计中要使用具有本质安全的技术和架构、在单元测试时确保软件质量和运行稳定性。事实上,很多系统并没有应用更新和更安全的技术;相反,他们创建了“封装器”,用代码层和模块来封装旧的代码和技术以保护他们的投资。

当尝试在新计算机上运行旧部件,并且使用新操作系统、新网络和新运行规程时,就会增加潜在的随机问题,同时还会将核心部件暴露出来。这种情况容易形成漏洞,导致巨大的风险,很可能会造成不安全状况的发生。

在正常运行期间出现问题,往往相对容易被检测到,但是在某些特殊情况下,有时更容易出现错误,例如:在工作任务繁忙或者异常工况,网络或计算机故障或出现多个报警时,执行先前未执行的故障路径代码或系统恢复代码,或不正确的执行指令。在执行关键任务时,最终用户期望这些潜在的错误,能够在最坏的情况、异常工艺工况下被识别出来并被进行妥善的处理。

举个无意识威胁导致系统被破坏的例子:在某个工厂夜间倒班时,SCADA/HMI 和 PLC的通讯可能会发生故障,导致工艺停止。故障发生时,系统已经正常运行很长时间了,项目组态也没有做过任何修改,因此可以怀疑受到病毒感染或者蓄意的网络攻击。

经过整夜的查看操作员和工艺过程的监控,相关人员了解到某人已经激活了操作员电脑的“屏幕保护”程序;由于某个电脑的硬件问题,在关闭显示器的时候,同时关闭了“用于RS-232通讯的8250芯片”,而RS232通讯端口只能通过断电和上电来重新启动。这个问题不是随机发生或是蓄意的,它发生在夜间换班的时候:运行人员离开较长时间,屏幕保护程序启动。但是IT技术人员在决定使用屏幕保护程序来保护屏幕和节省能源的时候,并没有意识到硬件的这种副作用。

上面给出的例子,显示了无意识威胁的典型步骤:

(1)自动化系统软件、硬件交互具有很多层,非常复杂,运行人员和IT技术人员并不具备全部的知识。这种做事方式没有错,他们不可能也没有必要了解所有的东西。

(2)一般认为,系统或环境的轻微修改,或者运行流程的变化,完全没有危害,但是有时也会带来意想不到的副作用;

(3)由于不可探测的潜在错误以及相互连接的各层级间不可预测的工况,副作用可能不断传导积累,导致更大的问题;

(4)造成的错误或者问题,可能在一段时间内并不会被检测到,或者看起来具有随机属性。

项目周期安全

为了系统地防范蓄意攻击和识别潜在的安全隐患,企业应该对整个项目周期进行分析。在一个简化的模型构架下,对整个项目周期的分析主要由以下4个步骤组成:

1.选择技术、结构和工具;

2.项目组态和编程;

3.部署和调试;

4.运营和维护。

对每个阶段了解的越多,越有助于在项目中融入安全特性。根据以往经验,“部署和调试”对大多数系统来讲,是最容易出现漏洞的环节之一。

技术和结构安全

对一辆生产于1980年代的汽车来讲,仅仅通过增加安全气囊、传感器以及其它技术,还不足以提升对司机和乘客的安全保障;同理,对于工厂来说也一样,只有通过改造现有自动化系统软件基础,才能使其在当今的运营环境下确保安全。这种升级换代还可以释放现有技术条件下的潜在的收益,而基于传统技术核心的解决方案并不能充分利用。

由于缺少指针和内存保护,ActiveX组件、COM、DCOM、开放的TCP/IP Socket等,这些老的技术,在本质上并不是十分安全的,比如用VB脚本和VBA编写的解释性脚本,以及用C或C++语言编写的程序,因此应避免使用这些技术。推荐的技术包括编译和用于脚本的内存保护性语言,包括C#、 VB.NET、具有纯因特网技术的网络客户端(配置“安全砂箱”或“局部信任”)、WCF(Windows通讯基础)、网络服务和SQL数据库。

编程安全

工程组态和运行的良好经验,包括在SQL数据库或服务器上的集中组态,使得分布式安全接入、在项目升级时内置的变更管理和版本控制、远程诊断、完全测试新应用、不间断运行的升级系统成为可能。

在过去,测试项目的方法仅仅是运行应用程序。现在的标准则要求在组态阶段进行更高层次的确认,同时使用专门的仿真工具、配置和性能分析工具。

病毒和随机应用错误所导致的潜在问题比较相似。代码覆盖率分析算法表明,仅仅通过测试案例来确保可靠性几乎是不可能的。例如,一个仅有10个“IF-Then-Else”指令的程序,如果完全测试,就需要运行1024个测试用例。因此,安全和可靠性确认应该内嵌到系统的结构、技术和编程流程中,而不仅仅是通过强力测试或增加外部封装器来实现。系统还应具有内置的追踪和版本管理系统,这样工具自己就可以自动实现日志和配置变更管理。

SCADA/HMI软件安全中所用新、旧技术的比较

部署和调试安全

部署和调试是安全事项中最容易出问题的领域之一,在最近发生的病毒事件中,很多与其有关。

在当前的工业环境下,大多数仍然在服役的系统,使用的都是1980年代或1990年代的技术,而那时的SCADA/HMI软件包的运行,依赖于成百上千的独立组态文件和通讯驱动器的动态链接库(DLL)文件。意想不到的错误很容易发生,编写病毒程序只需要最基本的编程技巧,最简单的甚至只需要在文件夹中扔几个文件即可。

即使当单个文件自身采用加密或二进制文件的形式,这些文件与原始项目之间并没有联系。任何人、在任何电脑上都可以创建额外的文件,只需将其扔到文件夹中就可以改变项目的行为模式。要想弄清楚哪个报警或者设定值变更产生了威胁,所需要的知识也许非常复杂,但是病毒程序本身需要的仅仅是最基本的编程技巧,而错误的遗留或拷贝错误文件带来的风险却非常高。现在,新一代的工具基于加密过的结构化查询(SQL)语言,并且具有只读属性,这样就可以确保组态文件的安全部署。

下面所列的就是一个简单的检查清单,可以降低对旧系统的威胁,也有助于编制新系统的技术规格书。

  • 旧产品和装置

应该将配置文件拷贝到新文件夹中,同时确保文件夹是空的;在运行项目软件时,通过微软操作系统登录的用户应仅具有只读权限。对于非常关键的系统而言,应该有外部的设备可以检查整个文件的大小,并对安装于产品的文件进行校验,与系统集成公司远程创建的文件相比较。

  • 选择和实施新方案

理想情况下,整个项目的配置文件应该保存在一个配置文件中,比如加密并具有只读属性的SQL数据库文件中。文件的版本管理和变更管理应该由内置功能完成,不能依赖于外部工具或手动程序。

旧系统容易出漏洞的另外一个方面是通讯协议驱动模型,协议依赖于外部DLL文件,这些文件由开放的工具包开发, 这些文件很容易被其它DLL文件所替代,这可能会导致系统的崩溃。在新一代工具中,驱动器独立运行,与应用工程的其它部分没有直接的联系,而且可以具有数字验证和只读设置,这样就可以避免在调试完成后这些DLL文件被修改或替换。

运行和维护

配置良好的安全系统,应包括角色和群组许可功能,这些功能在以前的大多数系统中都已经存在。大多数系统都能满足监管的要求,比如美国FDA CFR 21 第 11部分。运行和维护方面的新功能主要用于消除不安全的实时运行部件,比如Active-x组件,在升级项目时增加内置的保护功能、变更管理功能、版本控制功能、以及远程诊断或不停机升级的能力。对项目实施版本控制(审查跟踪)、以及在同一个计算机上管理多个版本的能力,都十分关键。除了用户接口安全外,还应在数据定义表格中,在图形显示以及每个标签上定义数据安全。

升级软件工具是造成系统中断的主要原因,有时会对运行中的应用软件造成意想不到的干扰。现代系统应该允许新项目和软件工具新版本的安装,而不必卸载先前的版本;在同一个服务器上并列运行不同版本,运行先前系统的执行引擎和计划升级的版本,这样就可以在对生产线进行升级前进行验证测试。

及时更新

如前所述,仅仅通过增加部件,几乎不可能将建造于1980年代的汽车变得像最新款式的汽车那样安全。同样的道理,也适用于工业自动化应用中所使用的软件。很多系统所使用的软件基础,创建于1980年代和1990年代。即使它们在那个年代很出色,也不能满足当今的安全需求;过去10年涌现了很多新技术,几乎每周都会发生变化,但是它们无法充分利用这些最新技术。

软件、通讯和用户接口技术方面的发展在不断加速,因此大多数工厂,并不需要更新全部的自动化系统。无论是在系统安全,还是在运行稳定性、可靠性和灵活性方面,SCADA 和 HMI系统的更新,都可以带来很多立竿见影的好处,还可以提供信息优化,使其能够创造投资回报,而不需要仅仅依赖于对更高安全性的需求 。

对一个真正的现代技术来讲,软件更新的预期回报不能仅仅通过收益的百分比来度量,而应在倍增系数基础上对其进行度量,因为其所避免的潜在安全事故,很可能对产量造成巨大的影响。此外,这些系统管理的资产还可以获得更高的效率。

(0)

相关推荐