掌桥专利:专业的专利平台
掌桥专利
首页

面向可执行文件的off-by-one的漏洞检测方法及系统

文献发布时间:2023-06-19 18:37:28


面向可执行文件的off-by-one的漏洞检测方法及系统

技术领域

本发明涉及一种面向可执行文件的off-by-one漏洞检测方法及系统,属于网络安全技术领域。

背景技术

off-by-one漏洞是信息安全攻防比赛中经常出现的漏洞类型,具有丰富的缓冲区相关灵活利用方式。栈中可以利用该漏洞覆盖ebp的LSB从而修改eip的指向。堆中既可以覆盖堆块size域的inuse位,联合unlink机制,劫持控制流;也可以修改堆块大小,扩大缩小堆块,读写目标内存空间。同时在实际软件和操作系统组件中的利用也屡见不鲜。off-by-one漏洞不同场景的有多样利用方式,正是其多种应用场景和利用方式,off-by-one漏洞的自动化检测难以全面覆盖。

目前,针对漏洞检测问题,学者们提出了多种解决方案。(一)2013年,Bugalyze.com将可执行文件部分反编译成中间语言,通过数据流分析检测是否有指向已释放堆块的指针,有则提示出现UAF,但过程中没有进行别名分析,和路径可达性分析,会造成漏报和误报。(二)GUEB使用专用值分析来跟踪堆操作和地址传输,同时考虑别名问题,然后利用以上结果来静态识别UAF漏洞,最后为UAF提取子图,描述悬空指针的穿件、释放和使用位置,但没有验证实际运行过程中的路径可达性。本发明所关注的off-by-one漏洞虽然是UAF的一种,但是通过对已分配堆块写,从而改变空闲堆块的内容。所以通常情况下UAF的检测不是适用于面向堆利用的off-by-one。(三)2015年中国工程物理研究院与发表在iccc上的一篇论文,提出一种高度自动化的面向可执行文件的off-by-one漏洞评估技术。不断重复输入样本,通过windbg查看崩溃程序中EBP值的格式是否正确、EIP是否被崩溃指令污染,若被破坏则表示漏洞触发且利用程度高,进而生成POC代码。该方法只针对off-by-one与栈相关的利用,且更适用于32位的环境,64位操作系统中,前七个参数优先使用寄存器存储而不是栈存储,使栈相关的off-by-one漏洞触发更加困难。

上述这些传统方法都难以有效定位漏洞位置,解决off-by-one漏洞的自动化检测全面覆盖的问题。

发明内容

为了解决上述问题,本发明提出了一种面向可执行文件的off-by-one漏洞检测方法及系统。能够有效定位漏洞位置,实现off-by-one漏洞的自动化检测全面覆盖。

本发明解决其技术问题采取的技术方案是:

一方面,本发明实施例提供的一种面向可执行文件的off-by-one漏洞检测方法,包括以下步骤:

反编译可执行文件机器码得到汇编语言,将汇编语言划分为六种语义规则形成中间语言;

利用中间语言对可执行文件进行静态分析,检测指向已分配堆块的指针集和疑似路径信息;

对可执行文件的全局变量进行跟踪分析,找出全局指针指向的内存地址和对内存空间的读写操作;

从有分配行为的函数中筛选有相同分配行为的函数,若引用相同的指针,在指针数据集内合并,去除冗余函数;

对可执行文件进行动态符号执行,依据路径选择规则选择可疑分支和路径,当有分配行为的函数调用时,记录分配的堆块大小和地址;

继续检测对分配堆块的操作,对该地址进行读写操作时,记录写入信息的长度,判断是否存在off-by-one漏洞。

作为本实施例一种可能的实现方式,所述将汇编语言划分为六种语义规则,包括:

MOV规则,表示将原信息更新给目标;

NOP规则,表示不对源信息和目标信息作任何处理;

ADD规则,表示将源污点信息添加至目标信息中;

LEA规则,用来表示指令lea计算指针的情况;

CHA规则,表示源污点信息和目标污点信息互换值;

CLE规则,表示清楚目标污点信息。

作为本实施例一种可能的实现方式,所述利用中间语言对可执行文件进行静态分析,检测指向已分配堆块的指针集和疑似路径信息,包括:

从已知的逆向路径中找出赋值操作,检查赋值操作的左边是否属于未检查的指针变量集ToCheckedPtr,如果是,将右边的指针加入所述指针变量集ToCheckedPtr;

判断右边的指针是否在已经检查过的指针变量集CheckedPtr中,如果不在,将其放入指向已经分配堆块的指针变量集MallocChunkPtr中;

将所述检查赋值操作的指针移入已经检查过的指针变量集CheckedPtr;

找出与控制流方向相同的正向路径,查看是否存在对该指针集的指针进行解引用的操作,有则作为疑似路径信息。

作为本实施例一种可能的实现方式,所述对可执行文件的全局变量进行跟踪分析,找出全局指针指向的内存地址和对内存空间的读写操作,包括:

利用全局变量分析算法抓取含有DS寄存器与偏移组合的赋值语句,并将偏移地址进行记录,形成全局指针数据集;

将全局指针数据集合并到所述指向已经分配堆块的指针变量集MallocChunkPtr。

作为本实施例一种可能的实现方式,所述从有分配行为的函数中筛选有相同分配行为的函数,若引用相同的指针,在指针数据集内合并,去除冗余函数,包括:

获取已知的具有分配行为的函数BaseFunc和调用所述函数BaseFunc的函数TagFunc的地址、参数信息;

如果两个函数的参数存在别名关系,并且TagFunc参数重中存在指向已分配堆块的指针,则将TagFunc函数放入已经分配堆块的指针变量集,保存函数地址、名称和参数信息;

不断重复迭代上述过程,找到所有具有分配行为的函数及指向空闲堆块的指针。

作为本实施例一种可能的实现方式,所述依据路径选择规则选择可疑分支和路径,包括:

在分支选择过程中,优先选择疑似路径所在的分支;

在分配点之前的路径选择靠近分配点的路径;

在分配点和指向已经分配堆块的指针变量集MallocChunkPtr之间的路径进行分支选择时,选择靠近指向分配堆块指针的路径;

其他情况的路径采用随机选择方式。

作为本实施例一种可能的实现方式,所述继续检测对分配堆块的操作,对该地址进行读写操作时,记录写入信息的长度,判断是否存在off-by-one漏洞,包括:若写入信息的大小比堆块用户数据空间多一个字节,则报告发生溢出,存在off-by-one漏洞,并产生错误报告。

另一方面,本发明实施例提供的一种面向可执行文件的off-by-one漏洞检测系统,包括:

反编译模块,用于反编译可执行文件机器码得到汇编语言,将汇编语言划分为六种语义规则形成中间语言;

堆块检测模块,用于利用中间语言对可执行文件进行静态分析,检测指向已分配堆块的指针集和疑似路径信息;

全局指针跟踪模块,用于对可执行文件的全局变量进行跟踪分析,找出全局指针指向的内存地址和对内存空间的读写操作;

函数筛选模块,从有分配行为的函数中筛选有相同分配行为的函数,若引用相同的指针,在指针数据集内合并,去除冗余函数;

动态符号执行模块,对可执行文件进行动态符号执行,依据路径选择规则选择可疑分支和路径,当有分配行为的函数调用时,记录分配的堆块大小和地址;

漏洞检测模块,继续检测对分配堆块的操作,对该地址进行读写操作时,记录写入信息的长度,判断是否存在off-by-one漏洞。

作为本实施例一种可能的实现方式,所述off-by-one漏洞检测系统使用S2E符号执行工具。

第三方面,本发明实施例提供的一种计算机设备,包括处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当所述AGV仿真装置运行时,所述处理器与所述存储器之间通过总线通信,所述处理器执行所述机器可读指令,以执行如上述任意面向可执行文件的off-by-one漏洞检测方法的步骤。

第四方面,本发明实施例提供的一种存储介质,该存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如上述任意面向可执行文件的off-by-one漏洞检测方法的步骤。

本发明实施例的技术方案可以具有的有益效果如下:

提出新的静态分析方案,静态分析过程中收集分配点和使用点信息,查找具有释放行为的函数和指向已分配堆块的指针集,以此作为动态分析路径选择的依据,排除无关路径,提高了动态符号执行的效率。

本发明利用静态分析对可疑路径筛选、记录找出所有指向已分配堆块的指针,同时借助符号执行路径探索功能面向可执行文件进行堆块分配监控,结合污点分析实现指针传播追踪,从而有效定位漏洞位置,实现off-by-one漏洞的自动化检测全覆盖。

附图说明

图1是根据一示例性实施例示出的面向可执行文件的off-by-one漏洞检测方法的流程图;

图2是根据一示例性实施例示出的面向可执行文件的off-by-one漏洞检测系统的示意图;

具体实施方式

下面结合附图与实施例对本发明做进一步说明:

为能清楚说明本方案的技术特点,下面通过具体实施方式,并结合其附图,对本发明进行详细阐述。下文的公开提供了许多不同的实施例或例子用来实现本发明的不同结构。为了简化本发明的公开,下文中对特定例子的部件和设置进行描述。此外,本发明可以在不同例子中重复参考数字和/或字母。这种重复是为了简化和清楚的目的,其本身不指示所讨论各种实施例和/或设置之间的关系。应当注意,在附图中所图示的部件不一定按比例绘制。本发明省略了对公知组件和处理技术及工艺的描述以避免不必要地限制本发明。

如图1所示,本发明实施例提供的面向可执行文件的off-by-one漏洞检测方法,包括以下步骤:

反编译可执行文件机器码得到汇编语言,将汇编语言划分为六种语义规则形成中间语言;

利用中间语言对可执行文件进行静态分析,检测指向已分配堆块的指针集和疑似路径信息;

对可执行文件的全局变量进行跟踪分析,找出全局指针指向的内存地址和对内存空间的读写操作;

从有分配行为的函数中筛选有相同分配行为的函数,若引用相同的指针,在指针数据集内合并,去除冗余函数;

对可执行文件进行动态符号执行,依据路径选择规则选择可疑分支和路径,当有分配行为的函数调用时,记录分配的堆块大小和地址;

继续检测对分配堆块的操作,对该地址进行读写操作时,记录写入信息的长度,判断是否存在off-by-one漏洞。

作为本实施例一种可能的实现方式,所述off-by-one漏洞检测过程,分为静态分析和动态分析,查找具有释放行为的函数和指向已分配堆块的指针集,以此作为动态分析路径选择的依据,排除无关路径,提高动态符号执行的效率,动态分析时,采用动态符号执行的思路,依照选择路径进行探索,记录分配堆块的大小,并与写入数据的长度进行对比,若不相符且相差一个字节,则提示off-by-one漏洞存在,并产生错误报告。

作为本实施例一种可能的实现方式,所述将汇编语言划分为六种语义规则,包括:

MOV规则,表示将原信息更新给目标,src=des,src污点信息覆盖des信息;

NOP规则,表示不对源信息和目标信息作任何处理,即src=src,des=des,通常适用跳转指令:cmp、jz等;

ADD规则,表示将源污点信息添加至目标信息中,即:des=des+src;

LEA规则,由于lea过程比较复杂,LEA规则单独用来表示指令lea计算指针的情况;

CHA规则,表示源污点信息和目标污点信息互换值,即:tmp=src,src

=des,des=t。相当于两次MOV规则;

CLE规则,表示清楚目标污点信息,即:des=0。

作为本实施例一种可能的实现方式,通过工具IDA反编译可执行文件机器码得到汇编语言,为重点关注指针传播相关指令,将汇编语言划分为六种语义规则,简化汇编语言分析难度与目标代码范围,形成方便进一步分析的中间语言。

作为本实施例一种可能的实现方式,所述利用中间语言对可执行文件进行静态分析,检测指向已分配堆块的指针集和疑似路径信息,包括:

从已知的逆向路径中找出赋值操作,检查赋值操作的左边是否属于未检查的指针变量集ToCheckedPtr,如果是,将右边的指针加入所述指针变量集ToCheckedPtr;

判断右边的指针是否在已经检查过的指针变量集CheckedPtr中,如果不在,将其放入指向已经分配堆块的指针变量集MallocChunkPtr中;

将所述检查赋值操作的指针移入已经检查过的指针变量集CheckedPtr;

找出与控制流方向相同的正向路径,查看是否存在对该指针集的指针进行解引用的操作,解引用就意味着存在读写空闲堆块的行为,有则作为疑似路径信息。

作为本实施例一种可能的实现方式,所述对可执行文件的全局变量进行跟踪分析,找出全局指针指向的内存地址和对内存空间的读写操作,包括:

利用全局变量分析算法抓取含有DS寄存器与偏移组合的赋值语句,并将偏移地址进行记录,形成全局指针数据集;

将全局指针数据集合并到所述指向已经分配堆块的指针变量集MallocChunkPtr。

全局变量在函数外声明,地址分配在bss段,且在程序运行过程中基本不变,为减小静态分析复杂度,采用与局部变量不同的查找方法。

作为本实施例一种可能的实现方式,所述从有分配行为的函数中筛选有相同分配行为的函数,若引用相同的指针,在指针数据集内合并,去除冗余函数,包括:

获取已知的具有分配行为的函数BaseFunc和调用所述函数BaseFunc的函数TagFunc的地址、参数信息;

如果两个函数的参数存在别名关系,并且TagFunc参数重中存在指向已分配堆块的指针,则将TagFunc函数放入已经分配堆块的指针变量集,保存函数地址、名称和参数信息;

不断重复迭代上述过程,找到所有具有分配行为的函数及指向空闲堆块的指针。

作为本实施例一种可能的实现方式,所述依据路径选择规则选择可疑分支和路径,包括:

在分支选择过程中,优先选择疑似路径所在的分支;

在分配点之前的路径选择靠近分配点的路径;

在分配点和指向已经分配堆块的指针变量集MallocChunkPtr之间的路径进行分支选择时,选择靠近指向分配堆块指针的路径;

其他情况的路径采用随机选择方式。

对于量化代码块之间的距离,本发明通过路径进行分析,使用单源路径最短算法对路径进行量化。

作为本实施例一种可能的实现方式,所述继续检测对分配堆块的操作,对该地址进行读写操作时,记录写入信息的长度,判断是否存在off-by-one漏洞,包括:若写入信息的大小比堆块用户数据空间多一个字节,则报告发生溢出,存在off-by-one漏洞,并产生错误报告。

如图2所示,本发明实施例提供的面向可执行文件的off-by-one漏洞检测系统,包括:

反编译模块,用于反编译可执行文件机器码得到汇编语言,将汇编语言划分为六种语义规则形成中间语言;

堆块检测模块,用于利用中间语言对可执行文件进行静态分析,检测指向已分配堆块的指针集和疑似路径信息;

全局指针跟踪模块,用于对可执行文件的全局变量进行跟踪分析,找出全局指针指向的内存地址和对内存空间的读写操作;

函数筛选模块,从有分配行为的函数中筛选有相同分配行为的函数,若引用相同的指针,在指针数据集内合并,去除冗余函数;

动态符号执行模块,对可执行文件进行动态符号执行,依据路径选择规则选择可疑分支和路径,当有分配行为的函数调用时,记录分配的堆块大小和地址;

漏洞检测模块,继续检测对分配堆块的操作,对该地址进行读写操作时,记录写入信息的长度,判断是否存在off-by-one漏洞。

作为本实施例一种可能的实现方式,所述off-by-one漏洞检测系统使用S2E符号执行工具。

作为本实施例一种可能的实现方式,所述用于反编译可执行文件机器码得到汇编语言,将汇编语言划分为六种语义规则形成中间语言,选择集成反编译引擎BeaEngine,将机器指令反编译成汇编代码,进行语义分析。重新实现和封装几个重要函数与结构。REASM结构体用于存储反编译过程中以及结束时产生的指令相关信息,如存取指令地址、汇编语言类型等;INSTR结构体用于记录汇编指令的详细内容,是作为接下来污点分析模块的分析关键信息;ARGUMENT结构体用于存储操作数信息;read_instr为指令解析的关键函数。用于从addr地址读取结构为reasm指令信息。为指令分配存储空间,即给结构体REASM变量baddr、addr赋值,确定汇编指令存储地址。调用reasm()函数,分析机器码,输出REASM类型的汇编信息。

作为本实施例一种可能的实现方式,所述检测分配堆块的操作,使用S2E提供的插件FunctionMonitor,FunctionMonitor可以捕获call/ret的机器指令并调用相应的处理程序,监控目标函数的堆块分配状况,因此可以利用该插件hook堆相关的操作函数,来获得参数信息和返回值,从而得到指针指向和用户输入数据的大小。

作为本实施例一种可能的实现方式,所述记录分配的堆块大小和地址,包括:构造结构体并形成队列用于存储分配堆块的地址和大小,队列数据结构采用klee::ImmutableMap,该队列由klee实现,允许多线程访问,实例化可共享对象。还需构建反向队列,记录指向同一分配堆块的所有指针,方便进行信息回溯,用于存储已分配内存空间的地址和大小等信息。

作为本实施例一种可能的实现方式,所述依据规则选择可疑分支和路径,使用ksc为输入文件生成一个Lua解析器,并将该解析器嵌入到S2E配置文件中,使其可以被S2E访问。通过在输入定义中选择性地应用s2e_make_symbolic处理规范,可以实现更有针对性的符号执行。

作为本实施例一种可能的实现方式,所述跟踪指向已分配堆块的指针,包括:将用户输入标记为污点,程序动态运行过程中追踪污点的传播,当污点传播符合事先制定的信息流策略,则表示为安全的传播。

第三方面,一种计算机设备,包括处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当所述计算机设备运行时,所述处理器与所述存储器之间通过总线通信,所述处理器执行所述机器可读指令,以执行如上述任意所述的基于局部自适应窗口的胎侧帘线阈值分割方法的步骤。

本发明实施例提供的一种计算机设备,包括处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当所述装置运行时,所述处理器与所述存储器之间通过总线通信,所述处理器执行所述机器可读指令,以执行如上述任意基于局部自适应窗口的胎侧帘线阈值分割方法的步骤。

具体地,上述存储器和处理器能够为通用的存储器和处理器,这里不做具体限定,当处理器运行存储器存储的计算机程序时,能够执行上述基于局部自适应窗口的胎侧帘线阈值分割方法。

本领域技术人员可以理解,所述计算机设备的结构并不构成对计算机设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。

在一些实施例中,该计算机设备还可以包括触摸屏可用于显示图形用户界面(例如,应用程序的启动界面)和接收用户针对图形用户界面的操作(例如,针对应用程序的启动操作)。具体的触摸屏可包括显示面板和触控面板。其中显示面板可以采用LCD(LiquidCrystal Display,液晶显示器)、OLED(Organic Light-Emitting Diode,有机发光二极管)等形式来配置。触控面板可收集用户在其上或附近的接触或者非接触操作,并生成预先设定的操作指令,例如,用户使用手指、触笔等任何适合的物体或附件在触控面板上或在触控面板附近的操作。另外,触控面板可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位、姿势,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成处理器能够处理的信息,再送给处理器,并能接收处理器发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触控面板,也可以采用未来发展的任何技术实现触控面板。进一步的,触控面板可覆盖显示面板,用户可以根据显示面板显示的图形用户界面,在显示面板上覆盖的触控面板上或者附近进行操作,触控面板检测到在其上或附近的操作后,传送给处理器以确定用户输入,随后处理器响应于用户输入在显示面板上提供相应的视觉输出。另外,触控面板与显示面板可以作为两个独立的部件来实现也可以集成而来实现。

对应于上述应用程序的启动方法,本发明实施例还提供了一种存储介质,该存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如上述任意基于局部自适应窗口的胎侧帘线阈值分割方法的步骤。

本申请实施例所提供的应用程序的启动装置可以为设备上的特定硬件或者安装于设备上的软件或固件等。本申请实施例所提供的装置,其实现原理及产生的技术效果和前述方法实施例相同,为简要描述,装置实施例部分未提及之处,可参考前述方法实施例中相应内容。所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,前述描述的系统、装置和单元的具体工作过程,均可以参考上述方法实施例中的对应过程,在此不再赘述。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

在本申请所提供的实施例中,应该理解到,所揭露装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。

作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。

另外,在本申请提供的实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。

技术分类

06120115632678