基于电网系统的远程代码执行漏洞自动化分析与重现技术

2022-09-05 03:04伍红文王晓明邹建明巫聪云温文剑
信息安全研究 2022年9期
关键词:二进制漏洞内存

伍红文 王晓明 周 柯 邹建明 巫聪云 温文剑

1(广西电网有限责任公司梧州供电局 广西梧州 543002)

2(广西电网有限责任公司电力科学研究院 南宁 530023)

3(广西电网有限责任公司电力调度控制中心 南宁 530023)

(wu_hw.wzg@gx.csg.cn)

智能电网是一个融合电力系统、通信网络、计算机系统以及信息技术的复杂大电网系统,是网电空间 (cyberspace)的一个分支[1].在电网安全的研究中,针对智能电网系统漏洞的攻防是一个经久不衰的话题.在软件开发过程中,由于开发者的疏忽或对底层技术的理解不够深刻,都可能导致漏洞的产生,使得服务器设备对于攻击者而言成为一个具有极高价值的攻击目标.

1) 研究背景.

电网系统B/S架构或C/S架构中的用户端如果被攻击者控制,其后果是用户个人信息被劫持、用户在网络上的身份被伪造或滥用.然而对于电网系统服务器端的设备或软件而言,安全漏洞造成的危害更加严重,可能导致服务器权限被窃取.另一种可能是由于一台服务器被控制,内网被暴露至外网,使得所有用户数据以及企业内部数据都处于危机当中.

在对以上这些目标的攻击中,往往需要采用多种漏洞形式配合的方式.其中2类控制能力最强的漏洞就是任意地址读写漏洞和远程代码执行漏洞.

根据攻击目标的不同,远程代码执行漏洞的攻击分为不同的方式,其中一种目标为二进制目标,是直接运行在目标机器上的原生服务,采用传输控制协议(transmission control protocol, TCP)或用户数据报协议(user datagram protocol, UDP)通信.如果在已获取到针对二进制原生服务远程代码执行漏洞的攻击流量的前提下,能通过自动化的分析重现漏洞过程,可以快速分析出攻击流量中用到的漏洞具体位置、成因等信息或是提取出攻击过程作为后备武器.

2) 相关工作.

Avgerinos等人[2]在2014年AEG(automatic exploit generation)一文中提出了自动化漏洞利用的概念,将自动化漏洞利用定义为自动化寻找漏洞存在并针对安全漏洞生成漏洞利用,其主要针对在无攻击流量前提下的自动化漏洞利用.在此基础上文献[3-4]提出了基于符号执行等程序分析方法的自动化漏洞利用方法.

Bao等人[5]在2017年曾提出一种用于自动化对漏洞利用中的shellcode进行移植的方法,这一点与本文研究的将漏洞利用过程进行更换目标较为类似,不过该方法需要拥有漏洞利用过程,并非对网络攻击流量进行处理.Newsome[6]在2005年提出了对攻击流量进行动态污点分析的方法,该方法通过动态污点分析,对网络流量中出现的针对漏洞的攻击进行了检测.但该文没有进一步更换目标进行自动化漏洞利用.

本文主要研究在具有网络流量前提下的智能电网系统远程代码执行漏洞的分析与重现,在发现漏洞利用的存在性后需要重现漏洞,与目前存在的工作均有一定区别.

3) 研究目的.

本文将探究在存在针对内存破坏类型的远程代码执行漏洞的TCP攻击流量的前提下完成对同一目标同一环境利用过程的重现.在利用过程未采用暴力破解手段时,使得漏洞利用过程可以针对不同智能电网多次利用.

1 相关原理与技术

本节将介绍内存破坏漏洞的几种主要类型,针对内存破坏漏洞的保护手段及绕过方法,为后文讨论难点及电网系统设计提供必要的背景知识.

1.1 内存破坏漏洞

在C,C++等底层语言中,为了对内存分配过程进行精确控制,一般采用手动分配方式进行内存管理.这种内存管理方式比垃圾收集器[7]更加高效和精确,程序员能精确地控制分配和释放的时间,使系统的整体延时更低,但也带来了一定的问题.由于内存的分配、使用和释放都由程序员自行控制,在这个过程中,程序员可能会错误地使用内存,严重时则可以直接导致攻击者完全控制目标系统.上述类型的漏洞被称为内存破坏漏洞或内存损坏漏洞[8].

软件安全的攻击技术主要有2类,分别为Web应用攻击技术和二进制攻击技术.本节将对二进制安全漏洞类型进行简要介绍.

1.1.1 缓冲区溢出漏洞

缓冲区溢出漏洞是目前最为严重的安全问题之一[9],指在程序员对内存进行分配时,错误地计算分配内存的大小,在使用内存区域时使用了超出分配内存边界的内存空间,导致使用到的内存空间实际为无效内存.而该无效内存中可能存放有程序中其他位置需要的数据结构,导致其数据结构被破坏.在执行流程被控制后就可以通过精确的构造方法完成任意代码的执行,使得漏洞转化为最为严重的任意代码执行漏洞.

1.1.2 use-after-free漏洞

除缓冲区溢出漏洞以外,另一种具有极大风险的内存破坏漏洞则是use-after-free漏洞[8].这种漏洞会导致用户输入内容可能被存放于已释放内存中,根据堆管理实现机制的不同,部分实现机制的已释放内存与已分配内存存在内存空间上的复用[10].

1.1.3 Double-free漏洞

Double-free漏洞与use-after-free漏洞类似,同样由于程序员错误地使用内存分配和释放机制导致.Double-free漏洞的原理为程序员在内存释放后未对指针进行清空,之后错误地再次对该指针进行释放.

1.1.4 格式化字符串漏洞

格式化字符串漏洞[9]是指程序员在使用scanf,printf等C语言中的格式化字符串函数时,错误地将用户输入作为格式化字符串进行输入或输出,使用户可以控制格式化字符串内容.这种情况下,攻击者就可以通过传入构造的格式化字符串,使额外数据按照传参规则被输出.

1.2 内存破坏漏洞缓解技术与绕过技术

内存破坏漏洞在早期智能电网系统中极为常见,后来又陆续发展出一些有效的缓解技术保护系统.

1.2.1 数据不可执行与绕过

在漏洞利用过程中,当攻击者拥有一次性控制目标程序执行流程的能力时,为进一步控制目标程序执行多条指令,可采用称为shellcode的技术[11].针对这类攻击方法的缓解措施被命名为数据不可执行保护[12],该方法可以有效防止shellcode技术的使用,不过一种被称为面向返回地址编程[13]的新型技术可以绕过该保护机制.

1.2.2 地址空间随机化与绕过

在系统内存破坏漏洞利用中,地址空间信息是可以被利用的关键信息.通过以页为单位的随机化,既不影响程序原有的运行过程,又使得攻击者无法预测随机后的基地址,从而使得需要预测内存空间的地址的攻击无效[14].针对这类保护,攻击者需要通过与其他漏洞进行配合,利用其他漏洞将目标进程的地址信息泄露,从而完成漏洞利用过程.

2 系统设计

2.1 漏洞利用重现过程的挑战

本文研究的目的是通过攻击流量重现漏洞利用,一种最朴素的方法就是直接将攻击流量重放,完整将攻击流量再次输出到另一目标.然而这种方式在二进制内存破坏漏洞利用的重现上会面临诸多问题.

2.1.1 TCP流量记录不稳定性

二进制原生服务常使用C,C++等底层语言编写,使用TCP协议网络通信.TCP网络通信与HTTP等应用层协议相比更为底层,所以在原生服务上往往通信过程更加底层,封装更为简陋,甚至缺少封装.由于缺少如HTTP等应用层标准协议的封装,流量捕获一般也是在TCP协议层级进行捕获,导致捕获过程存在不稳定性或重现失败.

2.1.2 地址空间随机化绕过重现

在攻击流量的分析过程中,对地址空间随机化绕过会影响漏洞重现.绕过时如果存在地址空间随机化就需要通过利用漏洞进行地址信息泄露.这就需要对已记录的远程代码执行漏洞的流量中识别地址空间随机化绕过过程,以及识别后重现,从而可以完成多次重现的目标.

2.2 攻击流量自动分析与重现系统设计

系统主要分为3个部分,如图1所示.通过网络流量预处理部分对系统进行整体初始化、环境搭建和流量清洗处理,为后续的分析部分提供条件和数据输入,经过配置可以对其他远程服务重现攻击流程完成自动化漏洞利用重现.

2.2.1 网络流量的预处理

系统启动首先会经过网络流量预处理部分.该部分主要工作为对已抓取流量进行格式解析并清洗流量以及服务准备.在现代流量抓取软件中,常用PCAPNG[15]作为流量抓取记录格式.流量清洗主要工作为将已解析以及按流结构进行处理后的流量初步按照端口号和根据部分筛选规则进行清洗,提高流量的处理效率.

服务准备部分包括目标服务准备和影子服务准备.目标服务指在分析过程中,本地预备的与原攻击流量的远程环境相同的目标靶机环境.影子服务是通过配置与受攻击系统尽量相同的环境,使本地运行与受攻击环境几乎相同的环境,但是需保留一定的控制权限.目标服务与影子服务的对比如图2所示:

图2 目标服务(靶机)与影子服务对比

2.2.2 网络流量自动化分析

流量分析部分为本系统的核心模块,其主要工作为利用影子服务对已记录流量进行分析从而提取流量内的地址信息,恢复已记录流量的地址空间信息.由于地址空间随机化攻击的绕过本质上是部分恢复远程服务地址空间信息,在绕过过程中需要进行地址信息泄露攻击,获取到目标进程地址空间的信息,所以通过一定的分析,可以推断出攻击载荷中的地址信息.

流量同步处理主要方法为按照已记录流量的收发情况,在影子服务上同步操作.根据已记录流量中的发送长度和接收次数同步发送和接收,发送和接收到的具体数据进一步处理.这一部分需要对包结构进行处理,对TCP流中由于不稳定产生的包拆分情况进行合并,合并过程在发送端和接收端稍有不同.

流量补齐阶段是针对发送或是接收过程中,影子服务和已记录流量中数据长度不同处理的.由于接收过程中高位地址为空字节导致长度不一致的情况,可以通过对地址信息进行处理使长度一致.流量补齐的模型被设置为通过补充空字节使2部分网络流量之间的差距最小,这个模型可采用动态规划的算法解决.如图3所示,通过补充红色部分的空字节,让2部分流量趋于一致,使得后续分析过程中不会由于地址字节不全导致字节错位.

图3 流量补齐示例

地址提取阶段是在发送或是接收过程中尝试提取数据中的地址数据.过程如图4所示,如果该数据能够确认位于影子服务的地址空间中,按照同步处理的方法,可以将该部分数据对应到原服务数据中,从而确认原服务中的地址数据位置.

图4 地址提取过程

在地址提取阶段成功提取到影子服务接收到的流量中的地址位置之后,就可以进入映射恢复阶段.如图5所示,虽然这个阶段无法恢复全部的内存映射信息,但可以恢复出在发送中需要的所有内存映射信息.

图5 映射恢复过程

在映射恢复之后,为保证发送流量的正确性,需要修正即将发送流量中用到的地址信息,使利用过程继续进行下去.修正方法为采用与地址提取阶段相同的滑动窗口方式,如图6所示,可以得到适用于当前影子服务的地址完成修正步骤.

图6 地址修正过程

在流量分析模块中,通过流量同步处理的方式,接收和发送步骤分别映射恢复和地址修正,通过循环发送和接收流程,完成已记录流量中所有内存映射信息的恢复,为后续漏洞利用过程提供必要信息.

2.2.3 自动化漏洞利用重现

在分析流量分析模块时,已经记录了接收过程中恢复映射的地址位置和偏移量及发送时的地址位置,记录过程如图7所示.此时在自动化利用过程中,可以通过对所有记录逐条处理,根据每条发送和接收类型的不同分别完成不同的步骤.发送记录类型执行地址修正以及发送流程,接收记录执行接收、计算映射基址以及记录映射的流程,此时只需要对所有记录进行循环处理就可以完成自动化的漏洞重现过程.

图7 记录处理

3 实验结果及分析

3.1 实验环境

本文实验在表1所示的环境下进行.

表1 实验环境

3.2 实验方法

在实验中,预计使用强网杯CTF中的二进制题目以及CVE-2013-2028和CVE-2010-4221漏洞样本作为目标.强网杯CTF中的二进制题目所涉及漏洞具有相对容易利用的特性,可以较为容易地模拟真实环境中危害最大的一类漏洞出现时的情况.

实验方法主要为首先对目标环境进行测试,确认样本存在远程代码执行漏洞,之后,通过已构造好的漏洞利用对目标样本远程代码执行攻击,在攻击过程中,将攻击流量通过tcpdump[16]记录,这是一种网络中传送的数据包完全截获下来提供分析的方式,以此来获取远程代码执行攻击的流量.

之后使用本文研究的系统,输入漏洞样本和已获取的远程代码执行攻击漏洞的流量,通过观察系统结果可确认是否漏洞利用已经成功,可通过漏洞利用情况判断本文方法的具体效果.为保证实验环境的一致性,Docker应用容器引擎被用来提供一致的二进制稳定执行环境,实验均运行于ubuntu 16.04的Docker基础镜像下.

3.3 实验结果

实验使用3个强网杯CTF题目的二进制文件以及CVE-2013-2028,CVE-2010-4221的带有漏洞的样本二进制文件作为测试对象.在ubuntu16.04环境下这5个测试项目均可以成功完成自动化漏洞利用重现过程,实验结果如表2所示:

表2 测试结果

3.4 实验结果分析

在实验中,2个真实CVE漏洞利用过程主要采用面向返回地址编程的攻击方式,首先通过该方式对地址空间进行信息泄露攻击.利用过程中的read和write部分可能造成连续性问题而影响漏洞利用过程,另外其地址空间随机化绕过部分可以很好地对系统进行测试.经过测试后,系统在该情况下可以稳定地执行漏洞利用过程.

在强网杯CTF赛题中,由于其漏洞本身更具理论性,利用过程也更加精确,因此3个题目利用正常且稳定,可以对空字节的情况恰当处理.在重现过程中需要保证与利用过程的高度一致性,否则无法完成漏洞利用过程.

经过实验可以证明,在实验假设前提下系统运行稳定,对拥有二进制内存破坏类型远程代码执行漏洞攻击流量的情况下自动化分析,并稳定地自动化利用重现.

4 结 论

本文通过对二进制远程代码执行类漏洞进行研究,设计并实现了基于流量的自动化分析与利用智能电网系统.该系统在原流量利用过程中,绕过手段为二进制形式的情况下,可以成功完成对原生服务攻击流量的分析和再次利用,并完成对攻击过程的重现.通过使用该系统,智能电网安全专员可以快速对针对原生服务的远程代码执行漏洞调查,从而防止同类漏洞的再次攻击;也可以提取出漏洞攻击利用样本探测攻击的相似性,便于揭露攻击过程.

未来工作可对泄露信息格式进一步研究,利用启发式方法等对泄露形式抽象处理,使本文系统得到进一步增强,以应用于更广泛的基于智能电网系统的远程代码执行漏洞利用过程流量的自动化分析.

猜你喜欢
二进制漏洞内存
漏洞
用二进制解一道高中数学联赛数论题
有用的二进制
有趣的进度
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
基于selenium的SQL注入漏洞检测方法
侦探推理游戏(二)
漏洞在哪儿
内存搭配DDR4、DDR3L还是DDR3?