作者 | 绿盟科技 格物实验室 陈杰

背景

在大国博弈的时代背景下,国内的工业控制系统需要更多自主可控的软硬件设备,因此有核心技术的国产SCADA/PLC市场占有率得到了快速的提升。然而,随之而来的安全问题也日益凸显。超过九成的国内工控厂家没有自己的安全能力,无法完成自己产品的漏洞挖掘甚至是基本漏洞验证,还有些不重视安全的厂家对漏洞视而不见,导致漏洞无法及时被修复,这种现象严重威胁了国产工业控制系统的安全性。

为了能进一步发现国产SCADA软件中容易出现的安全问题,这里选取了市场占有率最大的国产SCADA软件来进行安全测试,在该产品上面发现了十几个严重的安全问题,并第一时间上报给CNVD,现在所有漏洞已经得到了及时的修复。本文从实战出发,以该款软件作为例子,来介绍我们的安全评估思路。

研究方法

端口发现

能够远程触发的漏洞往往比能被本地触发的危害性要高,所以为了尽最大可能挖掘危害性高的漏洞,应该先从暴露的端口出发,分析对应的服务以及协议:

从上面可以看到,该SCADA软件暴露出多个端口,可以说每个端口都是一个攻击面,除了一个http端口外,其他都是私有的协议。

逆向分析

为了了解每个端口对应的服务,需要调试分析,但是有些数据包往往需要在特定的环境架构中才能产生,譬如说历史数据库的协议数据包必须设置数据库地址才能产生,而其他的官方未披露的服务只能通过逆向调试确定。在调试之前,可以编写并运行一个测试脚本,该测试脚本会向指定端口发送一个数据包,在服务端通过下recv之类的断点进行异常捕获就能找到解析的地方。

Fuzz测试+手动审计

1. 手动对危险函数进行审计,分析每个功能码对应的处理逻辑,即可在审计阶段把能够用肉眼看到的漏洞挖掘出来。

2. 通过对抓取的数据包进行变异,结合逆向出来的报文格式,编写模糊测试模块进行模糊测试(Fuzz),模糊测试的效果取决于种子数据的好坏和协议的复杂度。

漏洞挖掘

通过上面提到的研究方法发现了十几个严重的安全漏洞,超过半数都是远程拒绝服务漏洞。这里选取了几个典型例子,来简单介绍一下相关的安全问题。

工程密码绕过

为了防止其他人员对工程进行修改,在该系统中可以对多个工程进行分别加密。当进入一个有密码的工程时,必须输入正确密码方可进入开发系统,否则不能打开该工程并进行修改,从而实现了该软件的安全管理。

在分析工程加密功能的时候发现该加密机制存在缺陷,可以很简单地绕过密码保护机制:

远程拒绝服务

通过几个小时的Fuzz测试,发现了存在于该软件网络中间件S**A.dll中的栈溢出漏洞。经过分析,该漏洞无法劫持控制流,只能造成远程的拒绝服务。

该组件在校验长度字段时没有考虑负数的情况,就导致攻击者可以恶意构造长度字段,绕过长度检查。

该漏洞发生在网络中间件,由于该厂商旗下几乎所有的软件都使用了该组件,影响会非常大,该漏洞会直接导致产品可用性完全丧失,这个可以称为“核弹级”漏洞,破坏力巨大。

目录穿越

该软件中并不是所有组件都用C/C++编写,还有一部分使用了nodejs来提供http访问的能力,然而在获取文件路径时,没有对恶意字符”..”进行过滤,出现了目录穿越漏洞,导致任意文件读取。

通过该漏洞,可以读取配置文件,攻击者可以通过该配置文件登陆系统来获取工业控制系统的控制权限。

未授权访问

在进行手动审计的时候,发现一个对外端口提供了读/写变量的能力,而且没有任何登陆校验。攻击者可以远程读取/修改SCADA系统中的变量值(例如温度、压力、开关阀门等),严重危害工业生产安全。

原来关闭的开关,经过修改之后,开关变成打开:

总结

国内的工业控制系统软件厂商的安全开发意识还有很长一段路要走,但是对比其他国内厂商,该软件厂商已经是比较重视安全了,在CNVD通报的大约两周之后,其对上报的漏洞都出了相应的补丁。这也说明,工控系统安全问题不单单需要安全厂商的努力,工控厂商也应该多培养自己的安全能力,提高自身产品的安全性。希望通过本篇文章能够为促进各方面的能力融合,齐心协力,共创工控行业安全生态尽一份绵薄之力。

转载请注明来源:关键基础设施安全应急响应中心

声明:本文来自关键基础设施安全应急响应中心,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。