CN111597109B - 一种跨架构固件堆内存的缺陷检测方法及系统 - Google Patents

一种跨架构固件堆内存的缺陷检测方法及系统 Download PDF

Info

Publication number
CN111597109B
CN111597109B CN202010335247.4A CN202010335247A CN111597109B CN 111597109 B CN111597109 B CN 111597109B CN 202010335247 A CN202010335247 A CN 202010335247A CN 111597109 B CN111597109 B CN 111597109B
Authority
CN
China
Prior art keywords
memory
heap
defect detection
firmware
application program
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202010335247.4A
Other languages
English (en)
Other versions
CN111597109A (zh
Inventor
高健
许怡文
姜宇
罗冰
何跃鹰
张晓明
张嘉玮
孙中豪
曹可建
李建强
何清林
王庆
邢燕祯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tsinghua University
National Computer Network and Information Security Management Center
Original Assignee
Tsinghua University
National Computer Network and Information Security Management Center
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tsinghua University, National Computer Network and Information Security Management Center filed Critical Tsinghua University
Priority to CN202010335247.4A priority Critical patent/CN111597109B/zh
Publication of CN111597109A publication Critical patent/CN111597109A/zh
Application granted granted Critical
Publication of CN111597109B publication Critical patent/CN111597109B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/2205Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing using arrangements specific to the hardware being tested
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/2273Test methods
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/26Functional testing
    • G06F11/261Functional testing by simulating additional hardware, e.g. fault simulation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明实施例提供一种跨架构固件堆内存的缺陷检测方法及系统。该方法包括:获取仿真器和固件中的应用程序,在仿真器中基于二进制翻译技术对应用程序进行解析,使得应用程序与预设测试环境系统架构进行适配;通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果。本发明实施例通过仿真执行模块的跨平台特性,免于将检测工具部署到固件所在设备中,极大克服了传统内存检测工具需要部署到设备中的不切实际需求,提高对固件测试的效率,解决IoT设备存储空间有限的问题,同时内存缺陷检测模块也为在跨架构固件场景下检测多种堆内存缺陷提供有效解决方案。

Description

一种跨架构固件堆内存的缺陷检测方法及系统
技术领域
本发明涉及缺陷检测技术领域,尤其涉及一种跨架构固件堆内存的缺陷检测方法及系统。
背景技术
随着物联网IoT设备数量飞速增长,到2020年底IoT设备数量预计可达99亿台。当今实施攻击的技术门槛越来越低,IoT终端设备成为新的攻击对象,路由器、摄像头、冰箱、扫地机器人、水表、智能路灯都会成为潜在的攻击目标。卡巴斯基IoT安全报告《New trendsin the world of IoT threats》指出,近年来捕获到的IoT恶意样本数量呈现爆炸式增长。据Gartner公司预测,2020年底各企业所察觉的超过25%的网络攻击涉及IoT设备。
缓冲区溢出等内存安全性缺陷一直是网络攻击中常常被利用的漏洞。根据美国国家计算机通用漏洞数据库(National Vulnerability Database,NVD)的统计,在过去三年内,已披露的漏洞中至少9.82%的漏洞和内存缺陷相关,包括缓冲区溢出、释放后使用(use-after-free,UAF)等。而单单在2019年Cisco设备中与内存相关的漏洞就有27项被收录在知名的漏洞信息披露库CVE Details中。如:CVE-2019-1663是一个影响Cisco公司多个低端设备的堆栈缓冲区内存缺陷,由于管理界面未对登录表单的“pwd”字段进行严格的过滤,底层在处理请求时,strcpy函数中出现堆栈溢出情况,使得未经身份验证的远程攻击者可以在设备上执行任意恶意代码。通过缓冲区溢出等内存安全性漏洞入侵设备连带的影响或许就是利用短短几天时间构建十万量级的IoT僵尸网络,引发Tb级的DoS攻击。
然而,现存相对有效的主流内存检测工具如Page Heap、Purify等存在不支持多处理器架构的问题。如Purify可以在Intel-IA32构架的Linux系统以及Windows上使用,但不支持IoT设备中常用的ARM构架。而对于多构架支持较好的Valgrind、Dr.Memory等内存检测工具能运作的前提必须是能成功装载在测试固件所在的运行环境中,但是对于已出产的固件设备,这种需求是难以满足的。例如,Valgrind工具包提供了多种检测程序安全性的工具,虽然支持某些版本的ARM、MIPS、X86、AMD64等构架,但这些安全检查工具必须要部署到目标设备上才能运行。在无法获得制作固件的源代码时,在源码上展示出良好性能的AddressSanitizer,基于编译时插装的内存安全检查工具也无法在IoT设备固件上发挥作用。即使某些基于二进制运行时插装的内存检查工具可以在固件运行的设备上安装,也会受制于IoT的存储空间小和计算处理能力弱的问题,检测效率低效,无法搭配模糊测试技术完成对大量测试输入的众多执行路径的堆内存安全性检查。
由此可见,针对IoT设备跨构架、低处理能力、低存储容量、设备生态封闭的特点,目前主流的内存安全检测工具在跨架构的固件检测背景下难以施展拳脚,受制于处理器架构支持不足、实施困难、实施后效率低的关键问题。
发明内容
本发明实施例提供一种跨架构固件堆内存的缺陷检测方法及系统,用以解决现有技术中跨架构固件内存缺陷检测方法存在的处理器架构支持不足、实施困难、实施后效率低等问题。
第一方面,本发明实施例提供一种跨架构固件堆内存的缺陷检测方法,包括:
获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配;
通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果。
进一步地,所述方法还包括:
根据所述堆内存缺陷检测结果生成缺陷检测报告。
进一步地,所述获取固件中的应用程序,基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配,之前还包括:
对所述固件进行解包提取,设置所述预设测试环境的根目录为解包后固件文件系统所在的根目录;
指定所述固件中的预设应用程序作为内存安全测试入口,解析所述预设应用程序的头部信息,得到所述仿真器。
进一步地,所述获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配,具体包括:
解析固件应用程序头部,确定固件应用程序原始运行环境架构,基于所述固件应用程序原始运行环境架构构建符合固件应用程序架构的仿真动态链接器和内核;
根据固件应用程序二进制头部信息将二进制文件的每个段和所需依赖库映射到内库中。
进一步地,所述仿真器通过引入中间语言来实现在当前宿主机中执行若干处理器架构的客户机指令代码。
进一步地,所述通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果,具体包括:
遍历执行注册的钩子函数,启动内存缺陷检测;
通过注册的堆内存分配钩子函数和释放钩子函数,拦截与堆块分配及释放相关联的预设库函数,获得堆块分配及释放的内存位置信息;
通过修改所述预设库函数的参数和返回值来调整堆块的区域结构,设置堆块每个区域的映射值,对所述应用程序的堆空间分配和释放情况生成镜像状态,得到标识堆块读写权限属性和分配及释放状态的影子内存;
根据所述应用程序运行状态,动态更新所述影子内存中记录的堆内存单元的预设信息;
通过所述注册的钩子函数,拦截内存读写访问指令;
基于所述预设信息及当前指令访问地址和操作情况,运行所述预设内存缺陷检测算法,得到所述堆内存缺陷检测结果。
进一步地,所述预设信息包括属性与状态关联信息。
第二方面,本发明实施例提供一种跨架构固件堆内存的缺陷检测系统,包括:
程序仿真执行模块,用于获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配;
内存缺陷检测模块,用于通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果。
第三方面,本发明实施例提供一种电子设备,包括:
存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现任一项所述跨架构固件堆内存的缺陷检测方法的步骤。
第四方面,本发明实施例提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现任一项所述跨架构固件堆内存的缺陷检测方法的步骤。
本发明实施例提供的跨架构固件堆内存的缺陷检测方法及系统,通过仿真执行模块的跨平台特性,免于将检测工具部署到固件所在设备中,极大克服了传统内存检测工具需要部署到设备中的不切实际需求,提高对固件测试的效率,解决IoT设备存储空间有限的问题,同时内存缺陷检测模块也为在跨架构固件场景下检测多种堆内存缺陷提供有效解决方案。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种跨架构固件堆内存的缺陷检测方法流程图;
图2为本发明实施例提供的模块整体组成及工作流程图;
图3为本发明实施例提供的二进制翻译工作流程图;
图4为本发明实施例提供的原始堆块布局与带“属性-状态”信息标记的封装堆块布局对比图;
图5为本发明实施例提供的指令片段模式匹配实例图;
图6为本发明实施例提供的一种跨架构固件堆内存的缺陷检测系统结构图;
图7为本发明实施例提供的电子设备的结构框图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
针对现有技术存在问题,提供了一种仿真实现跨架构固件对内存缺陷检测方法与系统,利用算力丰富的服务器资源在固定且单一的运行环境中实现对跨架构固件的堆内存缺陷检测。
图1为本发明实施例提供的一种跨架构固件堆内存的缺陷检测方法流程图,如图1所示,包括:
S1,获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配;
S2,通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果。
具体地,首先进行固件中选定程序的二进制翻译工作,使得不同构架下的固件可以运行在测试环境所在的当前系统构架中,从而无需将检测工具部署到IoT设备中,解决了存储空间和计算能力的难题;同时支持注册堆内存读写的钩子函数(Hook)和堆内存分配释放操作的钩子函数以映射产生影子内存(Shadow Memory),进一步地,基于影子内存信息来执行多种堆内存缺陷检测算法,得到堆内存缺陷检测结果,即判断是否存在与堆内存相关缺陷导致的漏洞。整体模块工作如图2所示,由两个功能模块组成,分别是基于二进制翻译技术的程序仿真执行模块和基于影子内存的内存缺陷检测模块。
本发明实施例通过仿真执行模块的跨平台特性,免于将检测工具部署到固件所在设备中,极大克服了传统内存检测工具需要部署到设备中的不切实际需求,提高对固件测试的效率,解决IoT设备存储空间有限的问题,同时内存缺陷检测模块也为在跨架构固件场景下检测多种堆内存缺陷提供有效解决方案。
基于上述实施例,所述方法还包括:
根据所述堆内存缺陷检测结果生成缺陷检测报告。
具体地,当系统中固件应用程序仿真执行结束后,根据堆内存缺陷检测的情况,生成详细的缺陷报告。
基于上述任一实施例,该方法中步骤S1,之前还包括:
对所述固件进行解包提取,设置所述预设测试环境的根目录为解包后固件文件系统所在的根目录;
指定所述固件中的预设应用程序作为内存安全测试入口,解析所述预设应用程序的头部信息,得到所述仿真器。
具体地,系统首先对完整的固件做解包提取操作,进而设置测试环境根目录为解包后固件的文件系统所在的根目录。然后由测试人员指定固件中的具体应用程序作为内存安全测试的入口。通过解析应用程序的头部信息,本系统将产生符合程序构架要求的仿真器。在仿真执行固件程序过程中,检测其对堆内存的空间分配操作、空间释放操作、读操作、写操作等,不断更新影子内存的状态,并动态地进行堆内存缺陷检测工作。
基于上述任一实施例,所述获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配,具体包括:
解析固件应用程序头部,确定固件应用程序原始运行环境架构,基于所述固件应用程序原始运行环境架构构建符合固件应用程序架构的仿真动态链接器和内核;
根据固件应用程序二进制头部信息将二进制文件的每个段和所需依赖库映射到内库中。
其中,所述仿真器通过引入中间语言来实现在当前宿主机中执行若干处理器架构的客户机指令代码。
具体地,首先解析固件应用程序头部,确定固件应用程序原始运行环境的架构以构建符合固件应用程序构架的仿真动态链接器和内核。根据固件应用程序二进制头部的信息映射二进制文件的各个段、所需依赖库到内存中。在进行一系列初始化和钩子函数注册之后,从映射后的程序入口地址开始对固件应用程序的每条指令进行二进制翻译工作,仿真执行当前固件应用程序二进制。
此处,程序仿真执行模块通过引入一层中间语言(TCG)来实现在当前宿主机中执行不同处理器架构的客户机指令代码。通过即时编译技术,以基本块(BB)为单位对指令进行翻译工作,将翻译过的代码缓存起来以降低性能损耗,并得到符合当前处理器架构的翻译块(TB),使得不同构架下的固件应用程序可以无修改地运行在当前系统构架中。同时,在进行目标代码翻译的过程中,插入相关的TCG指令,使得最终翻译得到的代码块回调注册的堆内存读写的钩子函数和堆内存分配、释放操作的钩子函数,使得内存缺陷检测模块获得实时更新的堆内存“属性-状态”信息。
可以理解的是,基于二进制翻译技术的程序仿真执行模块通过如下流程来实现上述功能:
由跨架构仿真框架的底层模拟器来启动输入到本系统中的固件应用程序二进制。通过解析固件应用程序的程序头部,分析固件应用程序所需的运行环境架构要求,由虚拟机监视器构建符合程序构架的处理器内核,负责管理整个固件应用程序作为客户程序的仿真执行阶段,并协调分配虚拟化后的硬件资源。
跨架构仿真框架的底层模拟器作为主机上的一个进程运行,固件应用程序作为客户程序以底层模拟器进程的子线程方式运行,因此底层模拟器利用mmap系统调用从自己的进程空间中申请一部分连续的内存空间作为客户程序的内存空间。
接下来,根据客户程序(固件应用程序)的段表等信息将客户程序的某些段和依赖库映射到客户内存中。得到映射后的客户程序入口地址后,进行程序IO、堆栈等初始化操作,并准备开始对客户程序的每条指令进行二进制翻译工作。
在微代码生成器(TCG)中,将客户程序机器代码块转换为宿主机机器代码块,并将这些已经翻译的代码块放在代码翻译缓存中,便于很多相同的翻译块(TB)会被反复地使用,这样能够提高执行效率,减少翻译量。
当虚拟机监视器在仿真执行代码时,存放于代码翻译缓存中的链接指令可以跳转到指定的代码块,并且仿真执行可以在不同的已翻译代码块上运行,直到需要翻译新块为止。如图3所示,在执行的过程中,如果遇到了需要翻译的代码块,执行动作就会暂停并回会跳回到虚拟机监视器中,即虚拟机监视器就会使用和协调微代码生成器对需要进行二进制翻译的客户架构指令进行转换和翻译并存储到代码翻译缓存中。
在客户程序目标代码块翻译成翻译块时,需要插入相关的TCG指令以实现钩子功能,从而可以回调注册的钩子函数,由于TCG指令和处理器架构无关,因此使用统一的方式添加TCG指令可以直接实现不同架构下的钩子功能。
客户程序通过仿真执行,访问内存时会进行客户程序虚拟地址到主机物理地址的转换过程,借助影子页表技术,实现客户程序页表到主机页表的直接映射,当固件程序需要访问物理内存的时候,只会经过一层影子页表的转换,减少额外地址转换带来的开销。
仿真运行客户程序的过程中,仿真执行模块的钩子功能会遍历执行注册的钩子函数,以监视与堆内存分配、释放相关的库函数和内存访问指令,并启动内存缺陷检测模块。
基于上述任一实施例,所述通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果,具体包括:
遍历执行注册的钩子函数,启动内存缺陷检测;
通过注册的堆内存分配钩子函数和释放钩子函数,拦截与堆块分配及释放相关联的预设库函数,获得堆块分配及释放的内存位置信息;
通过修改所述预设库函数的参数和返回值来调整堆块的区域结构,设置堆块每个区域的映射值,对所述应用程序的堆空间分配和释放情况生成镜像状态,得到标识堆块读写权限属性和分配及释放状态的影子内存;
根据所述应用程序运行状态,动态更新所述影子内存中记录的堆内存单元的预设信息;
通过所述注册的钩子函数,拦截内存读写访问指令;
基于所述预设信息及当前指令访问地址和操作情况,运行所述预设内存缺陷检测算法,得到所述堆内存缺陷检测结果。
其中,所述预设信息包括属性与状态关联信息。
具体地,在上述实施例基础上,在仿真器运行固件应用程序的过程中,会遍历执行注册的钩子函数,由这些钩子函数启动内存缺陷检测模块。在内存缺陷检测模块中,通过注册的堆内存分配、释放的钩子函数拦截与堆块分配、释放相关的库函数(如malloc()、free()等),从而获取堆块分配、释放的内存位置信息。通过修改这些库函数的参数和返回值来调整堆块的区域结构、设置堆块各个区域的映射值,对当前仿真的固件应用程序的堆空间分配、释放情况生成一个镜像状态,得到一个标识堆块读写权限属性,及分配、释放状态的影子内存。同时,在程序运行过程中,不断动态地更新影子内存中记录的堆内存单元“属性-状态”信息。然后,通过注册的堆内存读写钩子函数,内存缺陷检测模块将拦截内存读写访问指令。根据影子内存中的“属性-状态”信息,以及当前指令的访问地址和操作情况,运行多种堆内存缺陷检测算法,判断当前内存访问是否合法,是否产生了某种堆内存缺陷。
此处,基于影子内存的内存缺陷检测模块的主要功能是在被回调的堆内存分配、释放操作的钩子函数中记录当前堆内存单元的可访问情况,产生和当前被仿真固件应用程序进程的堆内存分配、释放状态一致的影子内存,并在每个影子内存单元中记录对应被仿真固件应用程序进程实际使用内存单元的读写权限属性,及堆内存分配、释放状态等“属性-状态”信息。在被回调的堆内存读写的钩子函数中,获取当前指令的读写操作情况,执行多种堆内存缺陷检测算法,比对当前指令操作对某内存单元的操作是否与影子内存中的“属性-状态”信息冲突,并根据冲突情况,判断错误缺陷类型,以检测出堆内存缺陷,生成相应的漏洞报告。
可以理解的是,基于影子内存的内存缺陷检测模块通过以下流程来完成上述功能:
内存缺陷检测模块首先通过注册主函数钩子函数,拦截主函数的执行。当固件程序执行到主函数入口指令时,此时__libc_start_main动态链接符号在内存中的起始地址已经被解析存储到GOT表项中,因此可以通过运行时库中的函数偏移差计算得到运行时库中任意一个函数的真实地址。
具体如下,假设现在要获得函数ψ在当次固件应用程序仿真运行时内存加载起始地址K(ψ),记Υ为__libc_start_main符号在内存中的起始地址;记γ为__libc_start_main符号在运行时库(如glibc)中的偏移地址;记κ为函数ψ在运行时库中的起始指令偏移地址,则由于在装载运行时库时,只会更改装载基地址,不会更改两个符号的相对位置,因此若__libc_start_main和函数ψ在运行时库中的相对位置差为ε,那么__libc_start_main和函数ψ在内存中的起始指令地址差也为ε,则函数ψ在当次固件运行时内存加载起始地址K(ψ)=κ+ε=κ+Υ-γ。
通过如上计算可以得到运行时库中任意函数在内存中加载的起始地址。这时在主函数的钩子函数中,解析堆内存分配、释放相关的所有库函数的起始地址(如malloc()、realloc()、free()等),并注册这些函数的起始位置的钩子函数,以拦截堆块的释放、分配操作的入口指令。同时在主函数中注册内存读写访问的钩子函数。
在仿真器运行固件应用程序的过程中,如果进行了堆块的分配操作,即调用了malloc等堆分配库函数,则会由已注册的堆块分配库函数入口钩子F获得执行控制权。F优先于堆块分配库函数主体执行,因此可以修改固件应用程序传入此函数的参数,修改分配堆块的大小。为了进行缓冲区溢出缺陷的检测,如图4所示,需要在堆块前后插入边界警示区(通过修改堆块大小实现),以标示堆块空间的边界,得到重封装后的新堆块,用于后续的仿真运行代码继续使用。
根据函数调用约定的规则,在寄存器或对应内存单元获得堆块分配函数主体执行后返回的指令地址,并在这个地址处(也就是库函数的退出处)注册钩子函数H,那么当程序继续运行到堆块分配库函数ret指令后,又会产生截断效果。
由于此时堆块分配函数主体已经执行完,H可以得到已分配堆块的用户区域起始地址。此时进行堆块内部的区域划分,计算堆块各个区域的起始位置和区域大小,并设置区域“属性-状态”标记值,将封装后的堆块映射到影子内存中。
具体而言,如图4所示,将整个堆块标记为已分配状态,记固件应用程序请求的内存大小为u,设置标记值为defined,表示可寻址访问;记高低地址处的两个边界警示区的内存大小为r,堆管理机制要求的对齐处理填充块大小为p,这两块区域均设置标记值为undefined,表示未定义不可访问,因此整个映射堆块的大小为S=r+u+p+r,其中r=8x,p=8n-4-u,x、n∈N*,将堆块的各个区域的内存空间位置和对应标记值映射到红黑树中,就得到了能实时反映当前运行程序的堆空间分配、释放情况镜像状态的影子内存。
在仿真运行固件应用程序的过程中,如果进行了堆块的释放操作,即调用了free等堆释放库函数,则会由已注册的堆块释放库函数入口钩子G获得执行控制权,由于封装后的堆块设置了边界警示区,在释放操作的时候也需要将其一并释放掉,因此需要在G中修改释放的堆块地址,使得低地址处的边界警示区也得到释放,同时在释放过程中修改堆块在影子内存中的“属性-状态”标记值,即将整个堆块的标记为已释放状态,且其中的各个区域都标记为undefined,表示未定义、不可访问。
在仿真运行固件应用程序的过程中,如果对内存进行了访问,那么访问内存的指令执行之前会被钩子函数拦截。通过判断访问的指令特征和访问的内存地址,确定是否访问了堆空间以及访问指令是用户代码还是库函数代码。如果是访问了堆空间的指令,那么将调用堆内存缺陷检测算法,比对当前指令操作对某内存单元的操作是否合乎影子内存中对应内存单元的“属性-状态”要求。
在基于影子内存的内存缺陷检测模块中设置了9种内存缺陷检测算法,来定位9种堆内存缺陷类型。
具体而言,当堆块处于已分配状态时,如果当前内存访问指令读取或写入了影子内存中没有映射到内存单元,则引发了不可寻址访问内存缺陷;如果当前内存访问指令写入了影子内存中记录为不可寻址属性值的内存单元(即系统填充对齐块、下界边界警示区),那么将会检测到缓冲区溢出写内存缺陷;如果当前内存访问指令读取了影子内存中记录为不可寻址属性值的内存单元(即系统填充对齐块、下界边界警示区),那么将会检测到缓冲区溢出读内存缺陷;同理如果对影子内存中记录为不可寻址属性值的上界边界警示区进行了读写,则会产生缓冲区上溢出读/写内存缺陷。
当堆块处于释放状态时,如果对这个堆块中的用户区域内存地址再次调用堆释放库函数,由于已经对这个堆块标记为释放状态,第二次释放会检测出双重释放(doublefree)内存缺陷;如果对这个已释放的堆块进行了读写操作,那么会引发释放后使用(use-after-free)内存缺陷;如果对堆空间中某个非真实分配“堆块”(伪造堆块头后的某个地址)的起始地址执行恶意释放操作,则会检测出野释放(wild free)内存缺陷。此外,通过注册系统调用钩子函数,拦截主函数结束后的exit系统调用,判断当前堆区是否还存在状态标记值为分配状态的堆块,以确定固件程序是否存在内存泄露内存缺陷。
当检测出上述堆内存缺陷时,还将调用误报处理子模块,对一些误报结果予以放行,主要是用于缓解溢出读内存缺陷以及不可寻址访问产生的误报问题。
第一种情形是对于某些堆块分配释放库函数而言,由于运行时库的堆空间管理机制的运行需求,会不时地修改堆块头的大小字段、标记字段等,而这些堆块头并未映射到影子内存中,如果是来自.text段的代码指令修改了堆块头信息,则会破坏堆空间的管理机制,影响堆块的大小、链表结构等,甚至造成某种恶意攻击,因此有必要检测出未映射内存单元的内存访问而造成的不可寻址访问内存缺陷。但是堆块分配释放库函数对这些区域的访问是合法的且必须的,因此对于堆块分配释放库函数中的指令操作堆块头引发的不可寻址访问内存缺陷应予以放行。
第二种情形对strlen、memchr等一些字符串处理和内存操作相关的函数的C运行库而言,为了实现高效的算法可能会采用每次读取4字节内存单元的方式来检测‘\0’等字符,从而造成对非4字节对齐的用户空间可用的堆块访问,这种以4字节为单元的读取模式会引发溢出读内存缺陷。但是这种溢出读,在检测到某一个4字节中存在‘\0’等检测字符时就停止读取。由于不影响被仿真固件应用程序的正确行为,这种合理的溢出读问题应该予以放行。但是这类函数群体庞大,不便逐个处理,不便完全枚举,因此本发明采用指令片段模式匹配的方式,来确定当前检测出的溢出读内存缺陷是否是因为4字节单元的读取模式造成的。
如图5所示,以strlen函数中的代码片段为例,如果当前的mov读取指令,检测出了溢出读内存缺陷,匹配当前指令是否是从内存加载数据的指令,且是由ecx寄存器指定的地址进行间接寻址,加载数据到eax寄存器,同时下一条指令是立即数0x7efefeff的mov指令,则认为这个溢出读内存缺陷是某种字符串处理和内存操作相关的函数以4字节为单元的模式读取内存造成的,允许该操作执行,即不报告缓冲区溢出读内存缺陷。
最后,对于9种堆内存缺陷检测算法检测出来的漏洞威胁,进行误报缓解后,生成相应的漏洞报告,提供内存缺陷位置信息和内存缺陷类型信息,便于安全分析人员定位内存缺陷和高效修复,从而保障了固件应用程序的堆内存安全。
本发明实施例通过基于物联网固件仿真执行和影子内存,以固定其单一的运行环境充分利用算力丰富的服务器资源,实现了跨架构物联网固件的堆内存缺陷检测。基于固件仿真执行带来的跨平台特性,运行在处理能力优越的宿主机中的仿真执行模块将固件的执行从嵌入式设备中剥离,免去了将内存检测工具部署到物联网设备中的困难,提升了对物联网固件内存安全检测的效率,实现了为生态封闭的跨架构固件提供零修改、无需访问程序源代码的9种类型堆内存缺陷检测方案。因此,本发明实施例可以克服现有办法的局限性,以更少的时间成本和更低的部署难度,有效地检测出跨架构物联网固件中存在的堆内存缺陷。
图6为本发明实施例提供的一种跨架构固件堆内存的缺陷检测系统结构图,如图6所示,包括:程序仿真执行模块61和内存缺陷检测模块62;其中:
程序仿真执行模块61用于获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配;内存缺陷检测模块62用于通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果。
本发明实施例提供的系统用于执行上述对应的方法,其具体的实施方式与方法的实施方式一致,涉及的算法流程与对应的方法算法流程相同,此处不再赘述。
本发明实施例通过仿真执行模块的跨平台特性,免于将检测工具部署到固件所在设备中,极大克服了传统内存检测工具需要部署到设备中的不切实际需求,提高对固件测试的效率,解决IoT设备存储空间有限的问题,同时内存缺陷检测模块也为在跨架构固件场景下检测多种堆内存缺陷提供有效解决方案。
图7示例了一种电子设备的实体结构示意图,如图7所示,该电子设备可以包括:处理器(processor)710、通信接口(Communications Interface)720、存储器(memory)730和通信总线740,其中,处理器710,通信接口720,存储器730通过通信总线740完成相互间的通信。处理器710可以调用存储器730中的逻辑指令,以执行如下方法:获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配;通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果。
此外,上述的存储器730中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明实施例还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各实施例提供的传输方法,例如包括:获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配;通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (8)

1.一种跨架构固件堆内存的缺陷检测方法,其特征在于,包括:
获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配;
通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果;
所述通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果,具体包括:
遍历执行注册的钩子函数,启动内存缺陷检测;
通过注册的堆内存分配钩子函数和释放钩子函数,拦截与堆块分配及释放相关联的预设库函数,获得堆块分配及释放的内存位置信息;
通过修改所述预设库函数的参数和返回值来调整堆块的区域结构,设置堆块每个区域的映射值,对所述应用程序的堆空间分配和释放情况生成镜像状态,得到标识堆块读写权限属性和分配及释放状态的影子内存;
根据所述应用程序运行状态,动态更新所述影子内存中记录的堆内存单元的预设信息;
通过所述注册的钩子函数,拦截内存读写访问指令;
基于所述预设信息及当前指令访问地址和操作情况,运行所述预设内存缺陷检测算法,得到所述堆内存缺陷检测结果;
其中,基于所述预设信息及当前指令访问地址和操作情况,运行所述预设内存缺陷检测算法,得到所述堆内存缺陷检测结果,具体包括:
在被回调的所述钩子函数中,获取当前指令读写操作情况,执行所述预设内存缺陷检测算法,比对当前指令操作对任一内存单元的操作是否与所述影子内存中的所述预设信息相冲突,并根据冲突情况判断获得错误缺陷类型,检测得到堆内存缺陷,生成漏洞报告;
所述预设信息包括属性与状态关联信息;
所述属性包括所述堆内存单元的读写权限属性,所述状态关联信息包括堆内存分配和释放状态的属性状态关联信息。
2.根据权利要求1所述的跨架构固件堆内存的缺陷检测方法,其特征在于,所述方法还包括:
根据所述堆内存缺陷检测结果生成缺陷检测报告。
3.根据权利要求1或2所述的跨架构固件堆内存的缺陷检测方法,其特征在于,所述获取固件中的应用程序,基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配,之前还包括:
对所述固件进行解包提取,设置所述预设测试环境的根目录为解包后固件文件系统所在的根目录;
指定所述固件中的预设应用程序作为内存安全测试入口,解析所述预设应用程序的头部信息,得到所述仿真器。
4.根据权利要求1所述的跨架构固件堆内存的缺陷检测方法,其特征在于,所述获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配,具体包括:
解析固件应用程序头部,确定固件应用程序原始运行环境架构,基于所述固件应用程序原始运行环境架构构建符合固件应用程序架构的仿真动态链接器和内核;
根据固件应用程序二进制头部信息将二进制文件的每个段和所需依赖库映射到内库中。
5.根据权利要求4所述的跨架构固件堆内存的缺陷检测方法,其特征在于,所述仿真器通过引入中间语言来实现在当前宿主机中执行若干处理器架构的客户机指令代码。
6.一种跨架构固件堆内存的缺陷检测系统,其特征在于,包括:
程序仿真执行模块,用于获取仿真器和固件中的应用程序,在所述仿真器中基于二进制翻译技术对所述应用程序进行解析,使得所述应用程序与预设测试环境系统架构进行适配;
内存缺陷检测模块,用于通过遍历执行注册堆内存读写钩子函数和堆内存分配钩子函数,映射生成影子内存,基于所述影子内存执行预设内存缺陷检测算法,得到堆内存缺陷检测结果;
所述内存缺陷检测模块具体用于:
遍历执行注册的钩子函数,启动内存缺陷检测;
通过注册的堆内存分配钩子函数和释放钩子函数,拦截与堆块分配及释放相关联的预设库函数,获得堆块分配及释放的内存位置信息;
通过修改所述预设库函数的参数和返回值来调整堆块的区域结构,设置堆块每个区域的映射值,对所述应用程序的堆空间分配和释放情况生成镜像状态,得到标识堆块读写权限属性和分配及释放状态的影子内存;
根据所述应用程序运行状态,动态更新所述影子内存中记录的堆内存单元的预设信息;
通过所述注册的钩子函数,拦截内存读写访问指令;
基于所述预设信息及当前指令访问地址和操作情况,运行所述预设内存缺陷检测算法,得到所述堆内存缺陷检测结果;
其中,基于所述预设信息及当前指令访问地址和操作情况,运行所述预设内存缺陷检测算法,得到所述堆内存缺陷检测结果,具体包括:
在被回调的所述钩子函数中,获取当前指令读写操作情况,执行所述预设内存缺陷检测算法,比对当前指令操作对任一内存单元的操作是否与所述影子内存中的所述预设信息相冲突,并根据冲突情况判断获得错误缺陷类型,检测得到堆内存缺陷,生成漏洞报告;
所述预设信息包括属性与状态关联信息;
所述属性包括所述堆内存单元的读写权限属性,所述状态关联信息包括堆内存分配和释放状态的属性状态关联信息。
7.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至5任一项所述跨架构固件堆内存的缺陷检测方法的步骤。
8.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1至5任一项所述跨架构固件堆内存的缺陷检测方法的步骤。
CN202010335247.4A 2020-04-24 2020-04-24 一种跨架构固件堆内存的缺陷检测方法及系统 Active CN111597109B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010335247.4A CN111597109B (zh) 2020-04-24 2020-04-24 一种跨架构固件堆内存的缺陷检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010335247.4A CN111597109B (zh) 2020-04-24 2020-04-24 一种跨架构固件堆内存的缺陷检测方法及系统

Publications (2)

Publication Number Publication Date
CN111597109A CN111597109A (zh) 2020-08-28
CN111597109B true CN111597109B (zh) 2022-03-11

Family

ID=72185121

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010335247.4A Active CN111597109B (zh) 2020-04-24 2020-04-24 一种跨架构固件堆内存的缺陷检测方法及系统

Country Status (1)

Country Link
CN (1) CN111597109B (zh)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111931191A (zh) * 2020-09-09 2020-11-13 中国人民解放军国防科技大学 Linux平台二进制软件堆溢漏洞动态检测方法及系统
CN112232000B (zh) * 2020-10-23 2021-08-10 海光信息技术股份有限公司 跨多个验证域的验证系统、验证方法、验证设备
CN112270018B (zh) * 2020-11-11 2022-08-16 中国科学院信息工程研究所 一种场景敏感的自动化放置钩子函数的系统及方法
CN112685745B (zh) * 2020-12-31 2023-11-21 北京梆梆安全科技有限公司 一种固件检测方法、装置、设备及存储介质
CN112951314B (zh) * 2021-02-01 2023-05-05 上海航天计算机技术研究所 一种基于tsc695处理器的可加载型通用ram自测试方法
CN113438273B (zh) * 2021-05-21 2022-08-16 中国科学院信息工程研究所 一种物联网设备中应用程序的用户级仿真方法及装置
CN113452532B (zh) * 2021-06-25 2022-08-12 统信软件技术有限公司 一种网络通信方法、计算设备及可读存储介质
CN113703920B (zh) * 2021-08-27 2023-08-08 烽火通信科技股份有限公司 一种硬件仿真方法及平台
CN114328575A (zh) * 2021-12-02 2022-04-12 北京思特奇信息技术股份有限公司 基于Hook过滤器的HiveSQL规范性检测方法及系统
CN116627848B (zh) * 2023-07-24 2023-09-29 成都中科合迅科技有限公司 应用程序的自动化测试方法和系统
CN117435440B (zh) * 2023-12-20 2024-04-05 麒麟软件有限公司 一种程序堆空间的动态分析方法及系统
CN118152037A (zh) * 2024-05-10 2024-06-07 北京腾达泰源科技有限公司 应用程序运行方法、装置、设备、存储介质及产品

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7437759B1 (en) * 2004-02-17 2008-10-14 Symantec Corporation Kernel mode overflow attack prevention system and method
CN101470619A (zh) * 2007-12-29 2009-07-01 安凯(广州)软件技术有限公司 一种基于微核操作系统的应用程序动态加载方法
CN106407114A (zh) * 2016-09-20 2017-02-15 腾讯科技(深圳)有限公司 内存泄漏分析方法和装置
CN106610892A (zh) * 2015-10-23 2017-05-03 腾讯科技(深圳)有限公司 内存泄漏检测方法和装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7437759B1 (en) * 2004-02-17 2008-10-14 Symantec Corporation Kernel mode overflow attack prevention system and method
CN101470619A (zh) * 2007-12-29 2009-07-01 安凯(广州)软件技术有限公司 一种基于微核操作系统的应用程序动态加载方法
CN106610892A (zh) * 2015-10-23 2017-05-03 腾讯科技(深圳)有限公司 内存泄漏检测方法和装置
CN106407114A (zh) * 2016-09-20 2017-02-15 腾讯科技(深圳)有限公司 内存泄漏分析方法和装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于动态二进制探测工具的程序执行行为分析与研究;林凌;《中国优秀硕士学位论文全文数据库信息科技辑》;20111225;正文第5-42页 *

Also Published As

Publication number Publication date
CN111597109A (zh) 2020-08-28

Similar Documents

Publication Publication Date Title
CN111597109B (zh) 一种跨架构固件堆内存的缺陷检测方法及系统
CN109918903B (zh) 一种基于llvm编译器的程序非控制数据攻击防护方法
US9229881B2 (en) Security in virtualized computer programs
US7428626B2 (en) Method and system for a second level address translation in a virtual machine environment
US7757035B2 (en) Method for optimizing virtualization technology and memory protections using processor-extensions for page table and page directory striping
US9811663B2 (en) Generic unpacking of applications for malware detection
US20130132690A1 (en) Selective access to executable memory
CN108920253B (zh) 一种无代理的虚拟机监控系统和监控方法
US11868481B2 (en) Method for discovering vulnerabilities of operating system access control mechanism based on model checking
Guanciale et al. Provably secure memory isolation for Linux on ARM
Talbot et al. A security perspective on unikernels
WO2015100327A1 (en) Generic unpacking of program binaries
CN113407946A (zh) 一种针对IoT设备的智能防护方法、系统
Cotroneo et al. Timing covert channel analysis of the vxworks mils embedded hypervisor under the common criteria security certification
CN114143024B (zh) 基于生成对抗网络的黑盒恶意软件检测对抗样本生成方法、系统、电子设备及存储介质
CN114065208A (zh) 一种面向堆内存错误的检测方法及装置
KR102183649B1 (ko) 커널 무결성 검증 장치 및 그 방법
Lyles et al. Machine learning analysis of memory images for process characterization and malware detection
Zhan et al. A low-overhead kernel object monitoring approach for virtual machine introspection
CN115357912B (zh) 一种瞬态执行攻击漏洞检测方法、终端及存储介质
McDaniel et al. Identifying weaknesses in VM/hypervisor interfaces
US20240362321A1 (en) Systems and methods for interpreter based application cybersecurity
Schneider Full Virtual Machine State Reconstruction for Security Applications
Yang et al. A GPU memory leakage code defect detection method based on the API calling feature
Svoboda et al. Analysis of security possibilities of platforms for 3D graphics

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant