面向可编程逻辑控制器的内存攻击检测方法及系统

文档序号:31620752发布日期:2022-09-23 23:11阅读:46来源:国知局
面向可编程逻辑控制器的内存攻击检测方法及系统

1.本发明属于工业控制系统防御技术领域,特别涉及一种面向可编程逻辑控制器的内存攻击检测方法及系统。


背景技术:

2.工业控制系统(industrial control system,ics)广泛应用于电力,水利,燃气,化工等国家关键基础设施行业中。然而,针对这些关键系统的恶意攻击将对社会造成广泛而巨大的破坏。例如,stuxnet病毒感染某地区的核设施,通过篡改控制器中的控制程序,导致该地区核电站的核设施受损。industroyer恶意软件利用协议漏洞操纵基辅的变电站,导致大规模停电。ics中通常存在大量的可编程逻辑控制器(programmable logic controller,plc),然而,plc已经被证明容易受到各种类型的内存攻击,例如控制逻辑注入攻击、变量篡改攻击、固件修改攻击、应用程序保护密码篡改攻击,以及配置篡改攻击等。
3.现有通过防御措施以缓解plc内存攻击的方案主要分为以下几类:1)验证控制逻辑字节码或高级源代码的完整性,2)基于机器学习、不变式规则和物理模型识别物理过程行为中的异常,3)使用可信平台模块或基于软件的证明(attestation)plc的完整性。但,针对仍然存在以下的局限性:针对plc控制逻辑篡改攻击提出的代码完整性验证方案,需要编程软件在执行上传或下载控制程序到plc的网络流量;针对plc的变量篡改攻击提出的异常检测方案,在很大程度上依赖于在大量物理过程数据上训练的强大模型,更糟糕的是,这些模型被证明容易受到对抗性攻击;且,现有的软硬件attestation解决方案在实际plc中难以应用,例如,硬件证明解决方案需要硬件信任根技术(例如,trustzone或sgx),这些技术通常不能直接用于传统plc。基于软件的attestation解决方案通常假设plc运行时系统可访问,然而由于大多数厂商的plc通常难以通过网络访问运行时系统,基于软件的attestation解决方案很难推广到主流的plc。


技术实现要素:

4.为此,本发明提供一种面向可编程逻辑控制器的内存攻击检测方法及系统,能够实现面向可编程逻辑控制器的内存完整性保护及运行时的攻击检测和应急响应,提升工业控制系统攻击防御的可靠性。
5.按照本发明所提供的设计方案,提供一种面向可编程逻辑控制器的内存攻击检测方法,包含如下内容:
6.通过plc协议的语义逆向分析和内存结构的分析,获取plc协议语义和物理内存映射,并提取plc关键内存数据;
7.通过发送plc读取请求来获取plc关键内存数据,计算相对应的哈希值,并将该获取到的plc关键内存数据及哈希值作为检测阶段初始内存副本;
8.定期读取plc关键内存数据,计算其哈希值,并将其与初始内存副本进行比较,依据比较结果来检测plc关键内存数据的完整性。
9.作为本发明面向可编程逻辑控制器的内存攻击检测方法,进一步地,提取plc关键内存数据中,通过协议逆向分析和内存结构分析来定位并提取plc控制应用中关键编译后的二进制数据,其中,关键编译后的二进制数据包含但不限于:控制逻辑程序、配置数据、变量数据、应用保护密码及固件。
10.作为本发明面向可编程逻辑控制器的内存攻击检测方法,进一步地,协议语义逆向分析中,使用逆向调试软件对plc编程软件进行逆向工程并分析私有协议语义,具体包含:首先,定位plc通信的关键动态链接库文件;然后,通过执行关键动态链接库文件中可执行函数来挖掘支持plc与编程软件通信的关键类;接着,通过plc控制应用的单步调试来识别关键类函数数据包中的功能码;再者,观察编程软件与plc之间交互式网络流量并识别请求序列,以恢复协议状态机;最后,获取plc执行不同通信功能的功能码,使用标准序列比对技术分析协议中不同功能码语义。
11.作为本发明面向可编程逻辑控制器的内存攻击检测方法,进一步地,定位plc通信的关键动态链接库文件中,运行编程软件并将编程软件连接到plc,利用调试器识别编程软件调用的所有动态链接库文件;过滤掉system32目录下所有系统动态链接库文件和.net目录下动态链接库文件,通过分析剩余的动态链接库文件来查找并定位与plc通信的关键动态链接库文件。
12.作为本发明面向可编程逻辑控制器的内存攻击检测方法,进一步地,通过plc控制应用的单步调试来识别关键类函数数据包中的功能码,运行编程软件并保持编程软件与plc的连接,定位并执行带有调试器的通信类中的关键函数,并识别负责向plc发送指令的关键函数;通过网络包分析工具在调试期间捕获关键函数发送的数据包,进而识别捕获的数据包中的功能码。
13.作为本发明面向可编程逻辑控制器的内存攻击检测方法,进一步地,内存结构分析中,依据协议功能码读取plc内存空间,并分析plc内存布局,进而通过plc读内存的功能来提取关键内存数据。
14.作为本发明面向可编程逻辑控制器的内存攻击检测方法,进一步地,分析plc内存布局中,首先,过滤plc内存空间的填充数据,并定位执行上传和下载时关键内存数据,寻找对应地址段;然后,对plc内存数据进行差异分析,利用plc内存块内容变化规律来识别出不同内存块的地址和大小。
15.作为本发明面向可编程逻辑控制器的内存攻击检测方法,进一步地,通过plc读内存的功能来提取关键内存数据中,根据定位到的plc内存分布中不同数据的起始地址段和内存块大小,提取对应类型的内存数据,其中,根据内存数据的地址分布、功能和访问权限将内存数据划分为如下数据类型:控制逻辑程序、变量数据、配置数据、应用保护数据及固件数据。
16.作为本发明面向可编程逻辑控制器的内存攻击检测方法,进一步地,利用动态校验和机制,定期请求读取plc内存中,随机选择数据块并随机生成校验和大小和偏移地址,利用生成的检验和大小和偏移地址构造校验和请求包并发送至plc,将哈希值及校验和与初始内存副本进行比较,如果哈希值和校验与初始内存副本不一致,则检测为攻击并发送相应警报消息。
17.进一步地,本发明还提供一种面向可编程逻辑控制器的内存攻击检测系统,包含:
分析模块和检测模块,其中,
18.分析模块,用于通过plc协议的语义逆向分析和内存结构的分析,获取plc协议语义和物理内存映射,并提取plc关键内存数据;
19.检测模块,用于通过发送plc读取请求来获取plc关键内存数据及相对应的哈希值,将该获取到的plc关键内存数据及计算的哈希值作为检测阶段初始内存副本;并定期读取plc关键内存数据并计算其哈希值,将其与初始内存副本进行比较,依据比较结果来检测plc关键内存数据的完整性。
20.本发明的有益效果:
21.本发明基于软件逆向工程和网络流量差异的plc专有协议的综合语义分析、及关键内存数据细粒度内存结构分析,并通过定期检查这些内存数据的哈希值来对plc的关键内存进行完整性检查,能够有效的防御针对plc的控制逻辑注入攻击、配置篡改攻击、固件修改攻击及应用保护密码篡改攻击,并可在发现攻击后及时作出应急响应,无需对plc的硬件本身进行更改,方便部署,具有较好的应用前景。
附图说明:
22.图1为实施例中面向可编程逻辑控制器的内存攻击检测方法流程示意;
23.图2为实施例中内存攻击检测原理示意;
24.图3为实施例中cplc通信类关键功能函数示意;
25.图4为实施例中wireshark中捕获的数据示意;
26.图5为实施例中m221的plc通信流程示意;
27.图6为实施例中m221的内存地址分布示意。
具体实施方式:
28.为使本发明的目的、技术方案和优点更加清楚、明白,下面结合附图和技术方案对本发明作进一步详细的说明。
29.本发明实施例,参见图1所示,提供一种面向可编程逻辑控制器的内存攻击检测方法,包含如下内容:
30.s101、通过plc协议的语义逆向分析和内存结构的分析,获取plc协议语义和物理内存映射,并提取plc关键内存数据;
31.s102、通过发送plc读取请求来获取plc关键内存数据,计算相对应的哈希值,并将该获取到的plc关键内存数据及哈希值作为检测阶段初始内存副本;
32.s103、定期读取plc关键内存数据,计算其哈希值,并将其与初始内存副本进行比较,依据比较结果来检测plc关键内存数据的完整性。
33.通过plc协议语义分析和内存结构分析,并利用定期检查内存数据的哈希值来实现对plc关键内存的完整性检查,能够有效的防御针对plc的控制逻辑注入攻击、配置篡改攻击、固件修改攻击及应用保护密码篡改攻击,提升工业控制系统ics的安全。
34.进一步地,本案实施例中,提取plc关键内存数据中,通过协议逆向分析和内存结构分析来定位并提取plc控制应用中关键编译后的二进制数据,其中,关键编译后的二进制数据包含但不限于:控制逻辑程序、配置数据、变量数据、应用保护密码及固件。
35.plc通常支持使用私有的协议执行编程控制和数据访问的功能,例如上传或下载工程文件,读取或写入plc不同的内存数据。内存提取的目的是定位并提取出plc控制应用中关键的编译后的二进制数据,如控制逻辑程序,配置数据,变量数据,应用保护密码,固件等。参见图2所示的原理示意中,内存提取的过程分为协议逆向分析和内存结构分析两个部分。
36.进一步地,协议语义逆向分析中,使用逆向调试软件(例如ida、dnspy)对plc编程软件进行逆向工程并分析私有协议语义,具体包含:首先,定位plc通信的关键动态链接库文件;然后,通过执行关键动态链接库文件中可执行函数来挖掘支持plc与编程软件通信的关键类;接着,通过plc控制应用的单步调试来识别关键类函数数据包中的功能码;再者,观察编程软件与plc之间交互式网络流量并识别请求序列,以恢复协议状态机;最后,获取plc执行不同通信功能的功能码,使用标准序列比对技术分析协议中不同功能码语义。
37.由于plc编程软件通常调用相对独立的动态链接库dll文件来执行通信功能,本案实施例中,通过动态调试定位关键的dll文件,具体可为:首先通过运行编程软件并将其连接到plc;然后,可以使用调试器(例如ida)识别编程软件调用的所有dll文件;过滤掉system32目录下的所有系统dll文件和.net的dll文件后,分析剩下的dll文件从而找到与plc通信的关键dll文件。
38.通过动态调试找到的dll文件中的可执行函数进一步挖掘出支持plc与编程软件通信的重要类。例如,图3列举了施耐德m221 plc的plcif.dll中cplc类的几个关键功能,其中,runplc和stopplc是切换plc运行模式的函数,runplc可以发送指令将plc从停止状态切换到运行状态),getplcstate和getproductversion是诊断功能,getplcstate可以发送指令获取plc运行状态、编程软件连接状态和内存保护状态。uploadplcapp函数执行上传操作。这些函数可用于挖掘不同的功能码。
39.进一步地,本案实施例中,通过plc控制应用的单步调试来识别关键类函数数据包中的功能码中,运行编程软件并保持编程软件与plc的连接,定位并执行带有调试器的通信类中的关键函数,并识别负责向plc发送指令的关键函数;通过网络包分析工具在调试期间捕获关键函数发送的数据包,进而识别捕获的数据包中的功能码。
40.应用单步调试来获得功能码,具体调试过程可包括如下内容:1)运行编程软件并保持与plc的连接;2)定位并执行带有调试器的通信类中的关键函数,例如,runplc函数;3)识别负责向plc发送指令关键函数;4)打开网络包分析工具,例如wireshark,并在调试期间捕获关键函数发送的数据包;5)识别捕获的wireshark数据包中的功能码号。例如,图4为wireshark捕获的数据包,从数据中可以获取runplc函数对应的功能码号为0x40。
41.本案实施例中,进一步地,内存结构分析中,依据协议功能码读取plc内存空间,并分析plc内存布局,进而通过功能码来提取关键内存数据。
42.在编程软件与plc建立正常通信之前,通常存在一个授权过程,例如,会话id认证和访问控制认证。为了绕过身份验证并与plc建立通信,需要先恢复协议状态机,以构建正确的请求序列。本案实施例中,可以通过观察交互式网络流量和识别必要的请求序列来恢复协议的状态机,图5为m221 plc整个通信过程。完成通信类中的所有函数逆向分析后,可以获取plc执行不同通信功能的功能码;然后,使用标准的序列比对技术分析协议中不同功能码的详细语义。
43.进一步地,本案实施例中,分析plc内存布局中,首先,过滤plc内存空间的填充数据,并定位执行上传和下载时关键内存数据,寻找对应地址段;然后,对plc内存数据进行差异分析,利用plc内存块内容变化规律来识别出不同内存块的地址和大小。
44.编程软件将程序下载到plc后,这些包括plc中的逻辑程序、变量数据、配置数据、应用程序保护密码和固件等关键内存数据的地址在物理内存中是固定的,这使得检测这些内存区域完整性可以防御针对plc的内存攻击。应用读取内存的协议功能码读取plc整个内存空间,如,读取从地址0x00到0xffffffff的内存数据。并通过过滤掉整个内存空间的填充数据并定位执行上传和下载时关键的内存数据,找到有意义的地址段。随后,对plc的内存数据进行差异分析,具体来说,通过对编程软件的工程文件进行细微的修改,并下载到plc中,查看plc中内存块的内容变化规律。最终识别出不同内存块的地址和大小,例如,控制逻辑程序的地址为0x701e090、大小为60字节,并找出数据块的含义。例如,图6为定位到的m221的关键内存布局图。
45.进一步地,本案实施例中,通过plc读内存的功能码来提取关键内存数据,根据定位到的plc内存分布中不同数据的起始地址段和内存块大小,提取对应类型数据,其中,根据内存数据的地址分布、功能和访问权限将内存数据划分为如下数据类型:控制逻辑程序、变量数据、配置数据、应用保护数据及固件数据。不同的内存数据具有不同的访问权限,例如,固件仅有读取访问权限。为了得到攻击后的响应策略,可根据内存数据的地址分布、功能和访问权限进一步将内存数据分为五类:控制逻辑程序、变量数据、配置数据、应用保护密码哈希和解密后的固件。并根据定位到的plc内存分布中不同数据的起始地址和块大小,使用读内存数据的功能码自动提取不同类型的数据。
46.本案实施例中,进一步地,利用动态校验和机制,定期请求读取plc内存中,随机选择数据块并随机生成校验和大小和偏移地址,利用生成的检验和大小和偏移地址构造校验和请求包并发送至plc,将哈希值及校验和与初始内存副本进行比较,如果哈希值和校验与初始内存副本不一致,则检测为攻击并发送相应警报消息。
47.完整性检验的目的是为了保护内存提取阶段获取的关键内存数据的完整性,检验过程可设计为如下步骤:
48.(a)工程师将配置好的工程文件下载到plc。
49.(b)验证器发送读取请求以获取关键内存数据。
50.(c)验证器从plc中接收带有相应内存数据的响应。
51.(d)验证器计算提取的内存块的sha-256哈希,并将接收到的数据与sha-256哈希值一起存储在数据库中,作为后续检测中的原始副本。
52.(e)验证器会定期请求物理内存并计算所有关键内存数据的sha-256哈希值。同时,为了缓解中间人攻击,本发明设计了一种动态校验和机制,首先随机选择一个数据块,然后随机生成校验和大小和偏移地址,最后用些生成的偏移地址和数据大小构造校验和请求包,并将其发送到plc。
53.(f)将sha-256哈希和校验和与数据库中的原始副本进行比较来实现变量内存的完整性检查。
54.如果哈希和校验与数据库中的原始副本不一致,验证器将识别攻击并发送相对应的警报消息。根据报警消息,工程师可以根据响应规则应急处理。例如,如果验证器发送与
固件相关的警报消息,工程师将重新配置项目或更新plc中的固件。
55.进一步地,基于上述的方法,本发明实施例还提供一种面向可编程逻辑控制器的内存攻击检测系统,包含:分析模块和检测模块,其中,
56.分析模块,用于通过plc协议的语义逆向分析和内存结构的分析,获取plc协议语义和物理内存映射,并提取plc关键内存数据;
57.检测模块,用于通过发送plc读取请求来获取plc关键内存数据及计算相对应的哈希值,将该获取到的plc关键内存数据及哈希值作为检测阶段初始内存副本;并定期读取plc关键内存数据并计算其哈希值,将其与初始内存副本进行比较,依据比较结果来检测plc关键内存数据的完整性。
58.本发明中,通过语义逆向分析和内存结构分析,并通过定期读取plc内存数据,能够有效防御针对plc的控制逻辑注入攻击、配置篡改攻击、固件修改攻击、应用保护密码篡改攻击,并可在发现攻击后及时作出应急响应,无需对plc的硬件本身进行更改,方便部署、实施。
59.除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对步骤、数字表达式和数值并不限制本发明的范围。
60.在这里示出和描述的所有示例中,任何具体值应被解释为仅仅是示例性的,而不是作为限制,因此,示例性实施例的其他示例可以具有不同的值。
61.最后应说明的是:以上所述实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1