工业控制系统的防御性编程

Matthew J Scott
Author: Matthew J. Scott, CICP, CM,精益六西格玛黑带
Date Published: 30 May 2023
Related: 用安全编码实践保护工业控制系统软件

2021年,美国国家橄榄球联盟(NFL)超级碗将在坦帕湾雷蒙德詹姆斯体育场举行,两天后,坦帕湾海盗队和堪萨斯城酋长队将展开对决, Florida, 当地一家饮用水处理厂的氢氧化钠含量飙升至危险水平. 工业控制系统(ICS)被黑客入侵. Luckily for the 15,000居民和成千上万的球迷, 一位警惕的工厂员工介入了, 防止集体中毒.

今天,几乎所有的工业控制系统都暴露在互联网上. 开源框架是ICS产品的标准. 在过去的20年里,针对关键基础设施的勒索软件攻击数量显著上升. 即使是气隙ICS也很脆弱. 新的ICS硬件包含漏洞甚至恶意软件是很常见的. 网络安全和基础设施安全局(CISA) ICS-Cyber Emergency Response Team (CERT)目前列出了超过2个,ICS组件中有300个已知漏洞.

But there is hope. 就像通过防御性驾驶避免事故一样,您可以防御性地对ICS进行编程. 建立适当的代码环境, 定义规则集并进行验证将确保具有弹性的ICS.

建立你的代码环境

防御性编程遵循安全软件开发生命周期的需求和设计开发阶段. 本文首先为ICS应用程序建立特定的代码环境. 建立代码环境需要四个步骤:

  1. 比较弱点和易被利用的功能需求. 目标是消除对软件弱点或已知漏洞的利用. 共同弱点列举(CWE)和ATT&CK ICS矩阵是可以用来完成这一步的工具.
  2. 修改您的需求以消除任何弱点或漏洞. 请注意针对无法消除的任何弱点的建议缓解措施.
  3. 检查您的设计是否存在已知的产品或系统漏洞. 通用漏洞枚举(CVE)和CISA ICS-CERT建议是可用于完成此步骤的工具.
  4. 为ICS应用建立最安全的代码环境. 与供应链和开发链中的每个人一起选择和标准化产品, 漏洞最少的固件和软件.

定义规则集

防御性编程的核心是规则集的定义. 您不仅应该记录技术,还应该开发和证明可重用代码单元,以保护您的控制逻辑不被利用:

  1. 确保开发人员知道什么是允许的,什么是不允许的. 这包括具体的方法, 在CWE/CVE研究中发现的薄弱或可利用的例程和产品功能. 不允许列表和允许缓解列表, 包括建议的缓解技术, 应该被公布.
  2. 确定与您的功能需求和设计中的滥用情况相匹配的防御技术. 您可以使用可编程逻辑控制器(PLC)前20位编码实践中的适当元素. 其中包括各种验证(输入), timers, counters, 间接引用),防止大多数ICS利用.
  3. 将防御技术标准化为可重用代码单元. 大多数主要的PLC制造商都提供将复杂的重复代码封装在单个单元中的能力,以便在整个程序中实例化. 其中最常见的是西门子plc中的功能块(FB)和罗克韦尔自动化plc中的附加指令(aoi). 在整个代码中创建并实施标准安全fb或aoi的实例化,以进行输入验证, 访问控制和完整性验证.
  4. 严格测试您的可重用代码单元. 在大规模实例化之前对FB/AOI代码进行验证将为您提供一个可用于多个项目的弹性代码库. 不要忘记测试和确认代码单元的安全元素, 包括用密码或数字签名锁定防止修改.

验证初始代码

根据规则集在已建立的代码环境中开发了ICS控制逻辑, 现在是对完成的初始代码进行验证的时候了. Of course, 其中大部分是功能性需求的验证, 但安全控制也需要验证:

  1. 确认所建立的代码环境的稳定性. 几乎每天都会在ICS产品中发现新的漏洞. 在部署代码之前, 您可能需要升级固件或软件版本,或者修改规则集.
  2. 确认遵守所有已定义的规则集. 如果标准的安全技术没有得到应用,它就没有任何好处. 检查代码并确保实例化了所有适当的FBs/ aoi,并且针对您的功能需求所要求的弱或易受攻击的元素的任何实例都采取了缓解措施.
  3. 模拟突破外围防御. 尽管你可能总是采用纵深防御, 您现在的工作是假设您的入侵检测系统(网络入侵检测)的外部防御, 工作站访问控制, 消息验证)都失败了. 您必须测试并确认您的安全fb / aoi的每个实例都在防止对控制逻辑的利用.
  4. 启用并渗透测试您的子系统边界. 虽然它不是PLC代码的直接组成部分, 您的子系统(实时I/O [RIO]网络)的外围防御, 操作员工作站, 澳门赌场官方下载网络接口)需要进行测试,以确保深度的弹性防御. 当这些失效时,要特别注意对PLC环境的影响.g.,在对以太网端口进行拒绝服务攻击时,将处理器从运行模式更改为程序模式).

弹性代码和更多

尽管防御性编程只是ICS安全开发生命周期的一部分, 这是最关键的. PLC是ICS被充分利用之前的最后一道防线. 是的,防御性的计划需要大量的工作,但它会带来巨大的回报. 其结果不仅是防止漏洞利用的弹性代码,而且是一个安全的ICS,防止对资产的破坏和对人类生命的伤害.

Editor’s note: 要进一步了解这个主题,请阅读Matthew J. 斯科特最近在杂志上的一篇文章, “用安全编码实践保护工业控制系统软件”, ISACA Journal, volume 2 2023.

ISACA Journal