原创 | PLC安全编程实践TOP20

  • A+
所属分类:安全闲碎

作者 | 北京安帝科技有限公司

【编者按】在工业网络安全领域,可编程逻辑控制器(PLC)传统上被认为先天不安全。但一项新的安全计划总结出了PLC编程的20个最佳实践,旨在将PLC重新构建为工业过程中的最后一道网络安全防线。这个由一群网络安全专家和自动化工程师创建的开源项目,总结了TOP20关于在工业网络发生安全事件或错误配置时改进PLC弹性的建议。该项开源目成果由ISA(国际自动化协会)全球网络安全联盟于6月15日正式发布,供自动化工程师在编程PLC执行物理过程时使用,如控制流体温度和开启/关闭工厂或设施中的阀门或闸门。人们希望PLC厂商最终能在其产品中加入或提供模板,以帮助客户在为其设备编程时能够采用最佳实践。这些实践可指导工程师和技术人员对PLC进行编程和维护,而不是直接指导OT安全。有些实践对于有编码经验的人来说很熟悉,比如第8条,验证HMI输入变量,使它们在有效的操作范围内(这肯定会阻止2021年2月份Oldsmar自来水厂的攻击命令,无论从HMI发送什么)。第13条,禁用不需要/未使用的通信端口和协议是减少攻击面的经典方法。项目成果类似于应用程序安全编码的最佳实践,如Microsoft的安全开发生命周期(SDL)或OWASP的安全编码实践。它利用设备的实时操作和它们狭窄而具体的任务作为安全性和弹性的超级能力。这份成果的贡献者描述道:“我们试图将PLC——通常被视为自动化工厂的致命弱点——变成工厂的分布式、无情的保镖,每个(后门)门前都有一个。”安帝科技摘编该项目的相关成果和背景,供工业网络安全行业学习参考。

原创 | PLC安全编程实践TOP20

安全的PLC编程实践TOP20概述

1.模块化PLC代码

将PLC代码分成模块,使用不同的功能块(子例程),独立测试模块。

2.跟踪操作模式

保持PLC处于RUN模式。如果PLC不处于RUN模式,应该向操作人员发出警报。

3.在可行的情况下,将操作逻辑留在PLC中

将尽可能多的操作逻辑,如求和或累积,直接留在PLC中。HMI没有得到足够的更新来做到这一点。

4.使用PLC标志作为完整性检查

在PLC错误标记上放置计数器来捕获任何数学问题。

5.对PLC代码使用加密和/或校验和实施完整性检查

使用加密散列(如果加密散列不可用,则使用校验和XX?)来检查PLC代码的完整性,并在更改时发出警报。

6.验证计时器和计数器

如果计时器和计数器的值被写入PLC程序,它们应该被PLC验证是否合理,并验证向后计数低于零。

7.对成对的输入/输出进行验证和警报

如果有成对的信号,请确保两个信号没有同时断言。当出现物理上不可行的输入/输出状态时,向操作员发出警报。考虑使成对信号独立或添加延迟计时器时切换输出可能损害执行器。

8.不仅在人机界面,而且在PLC层面验证人机界面输入变量

HMI对PLC变量的访问可以(也应该)限制在HMI的有效操作值范围内,但应在PLC中添加进一步的交叉检查,以防止或警告HMI中编程可接受范围之外的值。

9.间接验证

通过对阵列末端投毒来验证间接指令,以捕捉栅栏柱(fence-post)错误。

10.通过函数分配指定的寄存器块(读/写/验证)

为特定函数分配指定的寄存器块以验证数据,避免缓冲区溢出和阻塞未授权的外部写操作,以保护控制器数据。

11.真实性检查工具

通过交叉检查不同的测量值,以允许合理性检查的方式来测量过程。

12.基于物理合理性验证输入

确保操作人员只能输入在过程中实际可行的或物理上可行的内容。为操作设置一个定时器,使其持续时间达到它实际需要的时间。当出现偏差时,考虑发出警报。当出现意外的不活动时也要发出警报。

13.禁用不需要/不用的通信端口和协议

PLC控制器和网络接口模块一般支持默认开启的多种通信协议。禁用应用程序不需要的端口和协议。

14.限制第三方数据接口

限制第三方接口的连接类型和可用数据。应该对连接和/或数据接口进行良好定义,并将其限制为只允许所需数据传输的读/写功能。

15.定义一个在PLC重新启动时的安全进程状态

定义在PLC重新启动情况下过程的安全状态(例如,通电、断电或保持以前的状态)。

16.总结PLC的运行周期并在人机界面上进行趋势分析

每2-3秒汇总PLC的周期时间,并报告给人机界面以图形显示。

17 .记录PLC的运行时间并在人机界面上进行趋势分析

记录PLC的正常运行时间,以知道它何时重新启动。记录HMI上的正常运行时间的日志和趋势,以进行诊断。

18.在人机界面上记录PLC硬停止和趋势

存储因故障或关机导致的PLC硬停止事件,由HMI报警系统检索,在PLC重新启动之前咨询。时间同步更准确的数据。

19.在人机界面上监控PLC内存的使用情况并进行趋势分析

测量并为部署在生产环境中的每个控制器的内存使用情况提供基线,并在HMI上对其进行趋势分析。

20.捕捉关键警报的假阴性和假阳性

识别关键警报并为这些警报设置门限(trap)。设置trap以监控任何偏差的触发条件和警报状态。

PLC安全编程实践TOP20项目背景

多年来,可编程逻辑控制器(PLC)的设计一直不安全的。经过几年的定制和应用IT的最佳实践,出现了安全协议、加密通信、网络隔离等。然而,到目前为止,还没有关注如何使用PLC(或SCADA/DCS)的特性来实现安全性,或者如何在考虑安全性的情况下对PLC进行编程。这个项目—受现有的IT安全编码实践启发—填补了这一空白。

本项目的最初动议始于安全专家杰克·布罗斯基(Jake Brodsky)2020年4月1日在S4x20上题为“PLC的安全编码实践”的演讲。

会后,OT安全专家Dale Peterson发起了Top 20项目。杰克·布罗斯基和莎拉·弗拉奇斯通过电话,花了几个小时将杰克提议的PLC安全编码实践付诸实施。

之后,Dale、Jake、Sarah在ISA GCA的支持下,于top20.isa.org上建立了一个平台,来组织和收集来自ICS安全和工程师社区的额外意见建议。

讨论和巩固实践文本,并策划一份最相关的前20个实践清单花了大约一年的时间;Vivek Ponnada加快了这个过程,他不仅贡献并审查了内容,还组织了定期电话交流,直到所有关于实践的评论都得到解决,Mohamed Abdelmoez Sakesli在一次大的努力中添加了所有的标准参考文献,MITRE CWE团队在最后一刻提供了CWE参考文献等等,前后大约有70多人参与了这一项目。

大多数实践是特定于PLC/过程的。其中5种实践与记录、趋势和对周期时间和内存使用等事项的监视/警报有关,这些事项在PLC中通常是一致的。这可以检测到攻击,也可以检测到NIST对网络事件的宽泛定义。

有一些验证实践超出了输入变量,在ICS世界中更常见。成对输入就是一个很好的例子。不能同时打开和关闭,也不能同时正反跑。

有许多实践涉及到PLC编程,如配置寄存器、PLC标志的使用、完整性检查等等。每个实践都有文档页,更详细地描述实践,提供示例,列出好处,以及IEC 62443和MITRE ATT&CK用于ICS参考。

PLC安全编码实践TOP20的价值

现在TOP20编码实践已发布,需要让工程师接受培训并使用它们。坦率地说,这与可能阅读本文的OT安全人员是不同的群体,这代表了一个挑战。国际自动化协会的全球网络安全联盟(ISAGCA)正在努力促进这些做法,这是令人鼓舞和有益的。ISA服务于工程界。眼下需要找到其他途径来传播信息,项目组欢迎任何建议。一些可能的推广应用方式包括:

  • 将TOP20列表整合到现有的专业和学术培训计划中,或创建一个新的前20名安全PLC编码实践课程(许可证允许对这个列表的任何使用)。

  • 在RFP(意见征求)中包含TOP20 实践清单作为需求,并编写相关的验收测试。

  • 成为一个倡导者,帮助教育其所在领域的工程师。

  • 若为供应商,请将这些内容包含在安全部署指南中,并尽可能包含在默认设置中。

  • 为Top 20团队提供更多的实践示例和文档。

  • 项目中实施并训练团队。

目前发布的是1.0版。虽然项目团队在此方面做了出色工作,但在随后的版本中会有所改进。正常情况下,团队将开始检查评论和建议改进。起草过程也为Level 1环境、HMI和其他ICS元素产生了一些良好实践。

一个有趣的问题是,这样做是否能阻止勒索软件。当然,答案是否定的。他们将减少PLC相关的全因网络事件数量。

1、PLC安全编码规范的适用对象

这些实践是为工程师编写的。这个项目目的是为正在创建软件(梯形逻辑、功能图等)的工程师提供指导方针,以帮助改善工业控制系统的安全态势。这些实践利用了PLC/DCS中的本地可用功能,实现这些实践几乎不需要额外的软件工具或硬件。它们都能适应正常的PLC编程和操作流程。实现这些实践需要的不仅仅是安全专业知识,还需要对要保护的PLC、它们的逻辑和底层流程有良好的了解。

2、这个列表的范围/你如何定义PLC编码?

为了符合TOP20安全PLC编码实践列范围,实践需要直接对PLC进行更改。读者在本文档中看到的是大量潜在安全PLC编码实践的TOP20选择。还有一些与总体架构、人机界面或文档相关的其他草案实践。这些不适合安全PLC编码范围,但可以出现在未来的安全PLC环境清单上。

3、应用安全PLC编码实践的收益

使用这些实践显然具有安全优势——主要是减少攻击面,或者在发生安全事件时更快地进行故障排除。然而,许多实践除了安全性之外还有其他好处。一些还令PLC代码变得更可靠,更容易调试和维护,更容易沟通,可能也更精简。此外,安全的PLC编码实践可保证用户即使在发生恶意攻击的情况下,也能使PLC代码更健壮,能够承受意外错误配置或人为错误。

小结

PLC编程实践TOP20在一群热心的网络安全专家和自动化专家努力下出笼了,这一初步的成果与过程和I/O设计有关,这可能是未来多方关注的主题。这些编程工具和技巧并不是能够在大多数控制系统叙述文档中所能找到。设计过程的人关注的是如何让过程工作,以及如何处理一些非常基本的故障模式。他们没有详细讨论PLC应该做什么,他们甚至不知道如何处理需要断开网络连接以处理安全问题的情况。虽然这些技巧不能保护OT系统免遭真正的恶意利用,但至少它们不会给用户留下细微的不可思议的漏洞。以2021年2月入侵佛罗里达州奥兹玛市(Oldsmar)供水系统SCADA系统为例,将氢氧化钠的剂量设置到11100 ppm的高得离谱的值本来是不可能的。PLC本应该拒绝这个数值,但它没有。为什么PLC不直接忽略它从人机界面收到的信息?因为它没有配置或编程这样做,但PLC编程语言中的功能可以做到这一点。然而,集成商或工程师可能没有想到有人会故意这样设置。看似简单,却没有做到。PLC编程实践TOP20将在实践中发展完善,助力OT系统本质安全能力和价值的实现。

参考资源:

1、https://plc-security.com/index.html

2、https://www.linkedin.com/pulse/its-out-top-20-secure-plc-coding-practices-dale-peterson/

3、https://fluchsfriction.medium.com/turn-controllers-into-plants-bodyguards-a889806be7b7

4、https://www.darkreading.com/vulnerabilities---threats/new-top-20-secure-coding-list-positions-plcs-as-plant-bodyguards/d/d-id/1341289

5、https://scadamag.infracritical.com/index.php/2021/06/15/plc-top20-programming-tips/

 


转载请注明来源:网络安全应急技术国家工程实验室
原创 | PLC安全编程实践TOP20

本文始发于微信公众号(网络安全应急技术国家工程实验室):原创 | PLC安全编程实践TOP20

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: