作者 | 绿盟科技 格物实验室 陈杰
在很多上位机组态软件中,为了方便开发人员进行调试分析,往往配有模拟器模拟来模拟真实的PLC或者HMI设备。这些软件一般通过TCP/UDP协议与组态软件进行数据交换,所以有些模拟器会监听指定的端口,甚至端口直接绑定到0.0.0.0这个地址上,使得其他用户可以远程访问。
模拟器中可能会和真实的设备使用同一套代码库,使得出现在模拟器中得漏洞也影响到真实的设备。反过来同理,出现真实设备的漏洞也会影响到模拟器,尤其是出现在私有协议解析中的漏洞,比如缓冲区溢出导致的远程代码执行漏洞。如果模拟器对外暴露出的服务存在高危漏洞,攻击者则可以通过该漏洞攻陷开发人员的主机来达到进一步渗透的目的。
1. 确定研究目标,分析模拟器对外暴露出的端口,识别出端口暴露出的服务,比如modbus,
2. 对私有的关键服务进行逆向工程,分析出协议的报文格式,在逆向的工程中,重点审计危险函数,比如strcpy,memcpy,atoi之类的稍不注意就会出现问题的函数,在逆向过程把一些简单的漏洞(堆栈溢出,整型溢出,硬编码凭证等漏洞)过一遍。
3. 利用分析出来的报文格式编写fuzz工具进行fuzz测试,由于模拟器在上位机运行的,fuzz速度可能会比直接fuzz真实设备速度稍快一些。
通过上面的研究方法,挖掘出了一些工控设备模拟器安全性问题,涉及的厂商有ABB,施耐德,CodeSys等,下面我们选取几个例子来介绍模拟器中容易出现的安全性问题。
ABB HMISimulator是ABB推出的PanelBuilder 600中的HMI模拟器组件,通过该模拟器可以在开发的时候进行仿真调试,在分析其安全性时,我们发现了任意文件读写漏洞CVE-2019-18995。
ABB HMISimulator 会直接对外暴露出HTTP服务,分析的时候,可以使用传统的web漏洞挖掘思路进行分析。通过结合一些逆向工程的手段,我们很快确定了HTTP对外暴露出两个危险CGI接口,能够读写任意文件。
该漏洞通过写一些关键文件可以达到远程代码执行的目的,如关键exe/dll,计划任务等文件,具体过程不再赘述。
Vijeo-designer由施耐德推出的一款专业的HMI编程设计软件,通过该软件可以完成HMI的设计和下装,其中HMI Simulator是HMI模拟器,我们在该软件上发现了目录穿越漏洞 CNVD-2020-09998。
HMI Simulator会直接对外暴露出FTP服务,用于工程的上载和下装,由于在FTP实现时候未对路径做校验(../之类的字符串)导致任意目录穿越。
攻击者可以穿越到任意文件目录下进行任意文件读写从而达到远程代码执行的目的。
PLCWinNT是codesys自带的仿真软件,用于模拟PLC,方便开发者在没有实体设备时进行开发调试。通过对该暴露出的私有协议进行Fuzz测试,我们发现了空指针解引用漏洞CVE-2019-19789。
PLCWinNT对外暴露出1200端口,使用的是专有的codesys协议。由于该模拟器使用全局指针变量没对其进行校验,如果该变量为NULL时,会导致空指针解引用,引发程序崩溃。
对于模拟器来说,远程拒绝服务其实危害不算大,用户只是在开发的时候使用,程序只要重启就行了,但是该模拟器和真实的PLC使用了同一套运行库,导致该模拟器漏洞影响到了真实设备,使得攻击者可以通过该漏洞发起对PLC的远程拒绝服务攻击。
对于工控设备模拟器软件来说,安全性问题还是比较多的。不同的厂商对安全问题的态度也截然不同,对于这些漏洞,修复周期少则三个月,多则长达一年。在这个空档期对于用户的安全性无疑是极大的威胁,为此提供如下安全建议:
1. 在使用模拟器功能的时候,检查其对外暴露的端口,一般开发者使用模拟器只在本机使用,不会使用其远程访问的功能,所以直接屏蔽对应的端口,阻止其对外访问。
2. 关注官方的安全通告,及时更新上位机开发或者组态软件,如果有自动更新的功能请启用自动更新。
原文始发于微信公众号(网络安全应急技术国家工程实验室):工业控制系统设备模拟器安全研究