CN107220537B - 一种程序内存布局信息泄露行为的检测方法 - Google Patents

一种程序内存布局信息泄露行为的检测方法 Download PDF

Info

Publication number
CN107220537B
CN107220537B CN201710376190.0A CN201710376190A CN107220537B CN 107220537 B CN107220537 B CN 107220537B CN 201710376190 A CN201710376190 A CN 201710376190A CN 107220537 B CN107220537 B CN 107220537B
Authority
CN
China
Prior art keywords
turning
program
sensitive area
information
security sensitive
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
CN201710376190.0A
Other languages
English (en)
Other versions
CN107220537A (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.)
Nanjing University
Original Assignee
Nanjing University
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 Nanjing University filed Critical Nanjing University
Priority to CN201710376190.0A priority Critical patent/CN107220537B/zh
Publication of CN107220537A publication Critical patent/CN107220537A/zh
Application granted granted Critical
Publication of CN107220537B publication Critical patent/CN107220537B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)

Abstract

本发明公开了一种程序内存布局信息泄露行为的检测方法,其特征在于,包括如下步骤:步骤一:获取目标程序及其动态链接库;步骤二:识别与提取目标程序的安全敏感区域;步骤三:确定目标程序安全敏感区域运行时的地址;步骤四:动态管理安全敏感区域;步骤五:程序运行时,监控输出操作,检测内存信息是否泄漏。本发明提供了一种基于程序输出操作模式的检测方法,从而阻止和避免内存布局信息的泄露,降低了攻击者成功实施代码复用攻击的风险。

Description

一种程序内存布局信息泄露行为的检测方法
技术领域
本发明涉及一种程序运行过程中内存布局信息泄露行为的识别和检测方法,具体涉及一种基于程序的输出操作来识别和检测内存信息泄露行为的方法。本发明属于计算机安全保护领域。
背景技术
代码复用攻击不需要注入攻击代码,因而具有较强的隐蔽性和危害性。程序的内存布局信息是发动代码复用攻击的基础信息之一。内存布局信息泄露有助于攻击者对系统的完成攻击,因此防止内存信息泄露是保护程序安全的一种有效措施。随着细粒度地址空间布局随机化技术的运用,攻击者找到构造攻击所需的代码片段变得较为困难,而通过程序中存在的内存暴露漏洞来获取内存布局信息,使得攻击者能轻易定位所需的代码片段,因此可大幅提高攻击者攻击成功的概率。为此,需要有效地识别程序在运行过程中发生的内存布局信息泄露行为,从而采取有效处理措施阻止和避免攻击者获取足够的信息、发动进一步的攻击行动。
程序的输出操作,可能产生内存布局信息泄露,是攻击者可能实施代码复用攻击常用手段。目前,已有一些对于内存布局信息泄露行为的检测方法。但是,对于频繁输入输出的程序行为,现有检测方法会产生大量的误报,从而对系统性能会有较大的损失。
发明内容
为解决现有技术的不足,本发明的目的在于提供一种程序内存布局信息泄露行为的检测方法,从而阻止和避免内存布局信息的泄露,降低了攻击者成功实施代码复用攻击的风险。
为了实现上述目标,本发明采用如下的技术方案:
一种程序内存布局信息泄露行为的检测方法,其特征在于,包括如下步骤:
步骤一:获取目标程序及其动态链接库;
步骤二:识别与提取目标程序的安全敏感区域,所述安全敏感区域被定义为代码和能被用来推测代码布局的数据;
步骤三:确定目标程序安全敏感区域运行时的地址;
步骤四:动态管理安全敏感区域;
步骤五:程序运行时,监控输出操作,检测内存信息是否泄漏;
步骤一包括:找到受保护程序及其动态链接的共享库,并将它们的二进制文件所处的完整路径加入目标路径集合protectSet,所述protectSet集合用于存放受保护程序及其动态链接库对应的二进制文件在计算机中所处的完整路径,根据完整路径找到待分析的二进制文件;
步骤二包括:对目标路径集合protectSet包含的每个完整路径对应的二进制文件,通过分析其段表和节表得到安全敏感区域的大小和安全敏感区域相对于对应段加载位置的偏移量,将结果存放到auxiliaryInfo文件中,所述auxiliaryInfo文件用于存放protectSet集合中每个路径所对应二进制文件的安全敏感区域的大小以及安全敏感区域相对于对应段加载位置的偏移量,一条记录对应一个安全敏感区域,用于在程序加载完成后确认安全敏感区域的开始地址以及结束地址;
步骤三包括:在程序装载完成后,程序自身和装载时链接的共享库最终位置已经确定,根据anxiliaryInfo中的信息,确定相应安全敏感区域在进程地址空间中的起始地址和终止位置,将其加入到boundInfo,所述boundInfo用于存放每一个安全敏感区域在进程地址空间中的开始地址以及结束地址,用于在运行时确认程序是否访问了安全敏感区域;
步骤四包括:在程序运行过程中,对安全敏感区域进行动态管理,以更新boundInfo中的边界信息;
步骤五包括:在程序运行时,对输出操作添加钩子,检查其访问的区域是否和安全敏感区域有重合部分;若重合,则说明检测到内存布局信息泄露,终止程序的运行并提醒用户;若没有与任意一个安全敏感区域重合,程序正常运行。
前述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤一包括:
步骤20:初始动作;
步骤21:从集合中取出一条未经处理的目标程序或共享库的路径信息;
步骤22:判断是否得到,若得到转步骤23,否则转步骤28;
步骤23:使用ldd命令处理得到的程序;
步骤24:逐条获取ldd的分析结果,其中每条结果表示共享库的路径信息;
步骤25:判断是否得到,若得到转步骤26,否则转步骤21;
步骤26:判断分析结果是否已存在于protectSet集合中,若是,转步骤24,否则转步骤27;步骤27:将尚未加入集合的共享库路径信息添加到protectSet集合中,转到步骤24执行;
步骤28:结束状态。
前述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤二包括:
步骤30:初始动作;
步骤31:从protectSet集合中取出未被处理的一项;
步骤32:判断是否取到,若取到,转步骤33,否则,转步骤3c;
步骤33:对目标二进制文件进行取段表的操作;
步骤34:对目标二进制文件进行取节表的操作;
步骤35:从段表中逐一取出可装载段的段表项;
步骤36:判断是否取到,若取到,转步骤37,否则转步骤31;
步骤37:根据段表项标记的节信息,从节表中取出对应的节表项;
步骤38:判断是否取到,若取到转步骤39,否则转步骤3a;
步骤39:根据取到的节偏移信息和节大小信息记录节首尾位置相对于段的偏移信息,转步骤37;
步骤3a:将同一个段中相邻的节进行合并;
步骤3b:合并后的节信息存入auxiliaryInfo文件,转步骤35;
步骤3c:结束状态。
前述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤三包括:
步骤40:初始动作;
步骤41:使用cat /proc/<pid>/maps命令来获取指定进程的内存布局信息,其中pid为目标进程的PID,可以通过ps aux命令来获得;
步骤42:判断是否获得进程内存布局信息,若得到,则转步骤43,否则转步骤49;
步骤43:逐条读取/proc/pid/maps的输出,每条输出给出了该段的映射地址、权限及对应的映射文件信息;
步骤44:是否读取完所有输出,若是,则转步骤49,否则转步骤45;
步骤45判断该映射是否为文件映射,若是,转步骤46,否则转步骤43;
步骤46:根据输出信息的名称和权限在auxiliaryInfo中找到其所对应的安全敏感区域;
步骤47:根据最终映射地址及安全敏感区相对于最终映射地址的偏移量计算出安全敏感区域在进程地址空间中的起始地址和终止地址;
步骤48:把计算结果存入boundInfo,转步骤43;
步骤49:结束状态。
前述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤四包括:提取加载的共享库辅助信息;动态添加安全敏感区域;动态删除安全敏感区域。
前述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤四中,提取加载的共享库辅助信息包括如下步骤:
步骤50:开始状态;
步骤51:判断open系统调用的调用者是否是目标程序,若是,转步骤52,否则转步骤58;步骤52:判断打开的文件是否是共享库,若是,转步骤53,否则转步骤58;
步骤53:判断系统调用是否成功执行,若是,转步骤54,否则转步骤58;
步骤54:记录打开文件的路径和其对应的文件描述符,将键值对存入openFile映射中;
步骤55:判断新打开的共享库是否已经被分析,若是,转步骤58,否则转步骤56,如果共享库已经被分析,则其路径一定已经存在于protectSet中,否则,该共享库还未被分析;
步骤56:对共享库进行分析,分析结果将存入auxiliaryInfo中;
步骤57:将共享库路径添加到protectSet中;
步骤58:结束状态。
前述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤四中,动态添加安全敏感区域包括如下步骤:
步骤60:开始状态;
步骤61:判断mmap系统调用的调用者是否是目标程序,若是,转步骤62,否则转步骤68;步骤62:判断打开的文件是否是共享库,若是,转步骤63,否则转步骤68;
步骤63:判断系统调用是否成功执行,若是,转步骤64,否则转步骤68;
步骤64:记录映射的起始位置;
步骤65:根据文件路径信息和映射区域的权限信息从auxiliaryInfo中找到对应的安全敏感区域辅助信息,所述文件路径信息是根据文件描述符在openFile映射中检索得到的;
步骤66:计算安全敏感区域的最终起始位置和终止位置;
步骤67:将新的安全敏感区域加入boundInfo;
步骤68:结束状态。
前述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤四中,动态删除安全敏感区域包括如下步骤:
步骤70:开始状态;
步骤71:判断munmap系统调用的调用者是否是目标程序,若是,转步骤72,否则转步骤75;
步骤72:判断系统调用是否成功执行,若是,转步骤73,否则转步骤75;
步骤73:将记录取消映射的起始位置和大小来计算起止位置;
步骤74:从boundInfo中删除和解除映射区域对应的安全敏感区域;
步骤75:结束状态。
前述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤五包括:
步骤80:开始状态;
步骤81:判断输出操作是否由目标程序调用,若是则转到步骤82,否则转到步骤86;
步骤82:从boundInfo中逐条取出安全敏感区域信息,即对应区域的起始地址和终止地址;
步骤83:判断是否取到安全敏感区域的信息,即获取该区域在进程地址空间中的开始和结束的地址,若成功,则转步骤84,否则转步骤86;
步骤84:将输出操作要访问的区域同取出的敏感区域进行对比,检测是否重合,若是,转步骤85,否则转步骤82;
步骤85:检测到内存布局信息泄露;
步骤86:结束状态;
其中,步骤84的具体判断流程为:
步骤90:检查writeBegin是否在敏感区域内,若在则转步骤85,否则转步骤 91;
步骤91:检查writeEnd在不在敏感区域里,若在,则转步骤85,否则转步骤 92;
步骤92:检查writeBegin和writeEnd所表示的区域是否包含了安全敏感区域,若是转步骤85,否则转步骤82。
本发明的有益之处在于:本发明提供了一种基于程序输出操作模式的检测方法,从而阻止和避免内存布局信息的泄露,降低了攻击者成功实施代码复用攻击的风险。
附图说明
图1是本发明基于程序输出操作的内存信息泄露检测流程示意图;
图2是本发明目标程序及其动态链接库获取流程图;
图3是本发明程序安全敏感区域辅助信息提取流程图;
图4是本发明程序安全敏感区域加载地址提取流程图;
图5是本发明运行时加载共享库辅助信息提取流程图;
图6是本发明动态添加安全敏感区域流程图;
图7是本发明动态删除安全敏感区域流程图;
图8是本发明程序输出操作检测流程图;
图9是本发明输出操作边界检测流程图。
具体实施方式
以下结合附图和具体实施例对本发明作具体的介绍。
本发明提供基于程序输出操作模式的内存信息泄露行为检测方法,主要包括程序安全敏感区域集合的建立和运行时检测等方法。
本发明的核心内容主要有5点:(1)目标程序及其动态链接库的获取;(2)目标程序安全敏感区域的识别与提取;(3)目标程序安全敏感区域运行时地址的确定;(4)安全敏感区域的动态管理;(5)程序运行时监控。
下面结合附图对本发明进行详细说明。
图1所示为本内存信息泄露行为检测方法实施的整体结构和工作流程。本方案在程序运行过程中对程序中涉及写操作的系统调用添加钩子,以检查其将要访问的内存区域;如果发现该访问区域与安全敏感区域有重合部分,则认为攻击者在利用程序中与写操作相关的系统调用进行内存布局信息泄露,因此会提醒用户并终止程序的运行。如果受访问区域没有与任何安全敏感区域重合,则认为与写操作相关的系统调用正常,程序不受影响、继续运行。受监控的与写操作相关的系统调用包括以下几项:write()、 pwrite64()、writev()、sendto()、sendmsg()、mq_timedsend、pwritev()、 sendmmsg()。如果有新的系统调用执行将内存内容进行输出的操作,则也可将被列入受监控范围。在本方法后续的说明中,将以输出操作指代所有的与写相关的系统调用。安全敏感区域被定义为代码和能被用来推测代码布局的数据(例如全局偏移量表),有关详细信息在后续章节给出。本方法适用的系统平台为linux,所用linux内核需支持 kprobe机制来实现对系统调用添加钩子。方法中所需的分析程序通常集成在linux的发行版中或易于下载得到。
本方法整体上分为两部分,即收集管理安全敏感区域的信息和运行时针对输出操作的检查。大致流程如下:找到受保护程序及其动态链接的共享库,并将它们的二进制文件所处的完整路径加入目标路径集合protectSet。对protectSet包含的每个完整路径对应的二进制文件,通过分析其段表(segment table)和节表(section table)得到安全敏感区域的大小和安全敏感区域相对于对应段加载位置的偏移量,将结果存放到auxiliaryInfo文件中。在程序装载完成后,程序自身和装载时链接的共享库最终位置已经确定,根据anxiliaryInfo中的信息,可以确定相应安全敏感区域在进程地址空间中的起始地址和终止位置,将其加入到boundInfo。程序在运行过程中也会加载和卸载共享库,因此会引入和删除安全敏感区域,需要对安全敏感区域进行动态管理,以更新boundInfo中的边界信息。最终,在程序运行时,对输出操作添加钩子,检查其访问的区域是否和安全敏感区域有重合部分;若重合,则说明检测到内存布局信息泄露,终止程序的运行并提醒用户。若没有与任意一个安全敏感区域重合,程序正常运行。所述protectSet集合用于存放受保护程序及其动态链接库对应的二进制文件在计算机中所处的完整路径,根据完整路径找到待分析的二进制文件;所述 auxiliaryInfo文件用于存放protectSet集合中每个路径所对应二进制文件的安全敏感区域的大小以及安全敏感区域相对于对应段加载位置的偏移量,一条记录对应一个安全敏感区域,用于在程序加载完成后确认安全敏感区域的开始地址以及结束地址;所述boundInfo用于存放每一个安全敏感区域在进程地址空间中的开始地址以及结束地址,用于在运行时确认程序是否访问了安全敏感区域。
图2表示目标程序及其装载时链接的共享库的获取流程。共享库根据链接时间的不同可分为两类,分别是装载时链接的共享库和运行时链接的共享库。程序在装载时链接的共享库可以通过ldd命令的运行结果知晓,ldd的使用方式是在终端命令行中输入lddprogram,其中program参数表示文件名。然而ldd命令运行结果中不包含程序运行时链接的共享库。有关程序运行中引入的共享库的信息,可通过对open系统调用添加钩子进行分析来获得,有关详细信息在后续章节给出。
本过程输入为protectSet集合,protectSet的初始值中只包含用户提供的目标程序的路径。本过程结束后,protectSet中将包含目标程序及其装载时链接的共享库的路径信息。具体流程如下:步骤20是初始动作;步骤21表示从集合中取出一条未经处理的目标程序或共享库的路径信息;步骤22判断是否得到,若得到转步骤23,否则转步骤28;步骤23使用ldd命令处理得到的程序;步骤24表示逐条获取ldd的分析结果,其中每条结果表示共享库的路径信息;步骤25判断是否得到,若得到转步骤26,否则转步骤21;步骤26判断分析结果是否已存在于protectSet集合中,若是,转步骤24,否则转步骤27;步骤27将尚未加入集合的共享库路径信息添加到protectSet 集合中,转到步骤24执行;步骤28是结束状态。
图3表示用来构造目标程序及其依赖的共享库的安全敏感区域的辅助信息提取流程图。安全敏感区域被定义为输出操作在程序运行过程中不应当访问的区域。通过readelf-l program(program代表文件名)命令可以获得指定程序的段表(segmenttable),段表是被用来指导程序装载的数据结构。标识为LOAD的段表条目表示该段将在程序装载时被映射到进程地址空间。段由相应的节(section)组成,段表按顺序给出了相应段中所包含的所有节。可装载的段通常有两段,可分别称为代码段和数据段。代码段中除了.rodata节以外全部被标记位安全敏感区域,数据段中除了.data和.bss 节以外全部标记为安全敏感区域。需要注意的是,在c++程序中会存在虚函数表,该数据结构是相当重要的,有关虚函数表位置的分析并不在本文关注范围内,但是通过分析得到的虚函数表同样包含在安全敏感区域内。通过readelf–S program命令可以获得指定程序的节表(sectiontable)信息,节表中每个条目对应二进制文件中的一个节,节表条目中的偏移条目被用来计算该节相对于段的偏移,节表条目中的大小条目表示了该节的大小。通过这两条信息可以得到节的起始位置和结束位置相对于所属段起始位置的偏移量。如果节在二进制文件中位置相邻,则可以将相邻的节合并为一个节以减少安全敏感区域的数量,合并节的首尾偏移量分别由第一节起始位置的偏移量和最后一个节结束位置的偏移量表示。
本过程的输入是protectSet集合,通过对集合中的程序逐一进行分析,将分析结果输出到auxiliaryInfo文件。auxiliaryInfo文件中存放和安全敏感区域有关的信息,其中每一行代表一个安全敏感区域信息,包括一个安全敏感区域所属文件的文件名、所属段以及首尾位置相对于段加载位置的偏移量。具体流程如下:步骤30是初始动作;步骤31表示从protectSet集合中取出未被处理的一项;步骤32判断是否取到,若取到,转步骤33,否则,转步骤3c;步骤33表示对目标二进制文件进行取段表的操作;步骤34表示对目标二进制文件进行取节表的操作;表中35表示从段表中逐一取出可装载段的段表项;步骤36判断是否取到,若取到,转步骤37,否则转步骤31;步骤37 表示根据段表项标记的节信息,从节表中取出对应的节表项;步骤38判断是否取到,若取到转步骤39,否则转步骤3a;步骤39根据取到的节偏移信息和节大小信息记录节首尾位置相对于段的偏移信息,转步骤37;步骤3a表示将同一个段中相邻的节进行合并;步骤3b表示合并后的节信息存入auxiliaryInfo文件,转步骤35。步骤3c表示结束状态;
图4表示安全敏感区域的加载地址提取流程图。不是地址无关可执行文件/地址无关代码(PIE/PIC)的程序其加载地址通常是固定的,对攻击者来说易于分析从而构造分析。现在主流操作系统中大多部署了地址空间布局随机化防御方案,同时很多程序出于安全因素的考虑被编译为PIE/PIC,因此,程序的最终加载地址通常等到程序装载完成后才能确定。在程序加载完成后,通过cat /proc/<PID>/maps命令可以得到指定PID 进程的内存映射情况。通过得到的映射情况,可以得到每个段最终被加载的位置,结合上一节中获得的安全敏感区域相对于对应段加载位置偏移量信息,进而可以计算出安全敏感区域在进程地址空间中起始地址和结束地址,最终存入boundInfo中。这部分信息会被用来进行运行时检查。
本过程所需的信息是程序装载完成后的内存布局以及安全敏感区域的辅助信息auxiliaryInfo,最终会得到安全敏感区域在进程地址空间中的边界信息boundInfo。具体流程如下:步骤40表示初始动作;步骤41表示使用cat /proc/<pid>/maps命令来获取指定进程的内存布局信息,其中pid为目标进程的PID,可以通过ps aux命令来获得;步骤42判断是否获得进程内存布局信息,若得到,则转步骤43,否则转步骤 49;步骤43表示逐条读取/proc/pid/maps的输出,每条输出给出了该段的映射地址、权限及对应的映射文件等信息;步骤44表示是否读取完所有输出,若是,则转步骤 49,否则转步骤45;步骤45判断该映射是否为文件映射,若是,转步骤46,否则转步骤43;步骤46表示根据输出信息的名称和权限在auxiliaryInfo中找到其所对应的安全敏感区域;步骤47表示根据最终映射地址及安全敏感区相对于最终映射地址的偏移量计算出安全敏感区域在进程地址空间中的起始地址和终止地址;步骤48表示把计算结果存入boundInfo,转步骤43;步骤49表示结束状态。
图5表示运行时加载共享库辅助信息提取流程图。程序在运行时会使用dlopen来动态加载共享库,并且使用dlopen函数加载的共享库不会在ldd命令的结果中显示,因此需要在运行时对其进行分析。系统会使用open系统调用来打开文件,因此对open 系统调用添加钩子能够获取运行时加载共享库的信息。内核提供了kprobe机制来对系统调用添加钩子,通过kprobe机制,能够获取系统调用参数、返回值以及添加系统调用的功能。本方法中对系统调用添加钩子都是基于kprobe实现。
本过程通过对open系统调用添加钩子来获得打开共享库的路径和文件描述符,并将结果存放到openFile映射中,同时分析打开的共享库的安全敏感区域信息,将分析结果添加到auxiliaryInfo文件中。openFile是一个映射,关键字为文件描述符,值为其对应的文件路径。open系统调用的第一个参数表示想要打开的文件的路径,如果路径中存在.so关键字,则想要打开的文件为共享库。当open系统调用成功执行时,会返回文件描述符,否则返回-1,通过返回值可以判断文件是否成功打开。具体流程如下:步骤50表示开始状态;步骤51表示判断open系统调用的调用者是否是目标程序,若是,转步骤52,否则转步骤58;步骤52判断打开的文件是否是共享库,若是,转步骤53,否则转步骤58;步骤53判断系统调用是否成功执行,若是,转步骤54,否则转步骤58;步骤54记录打开文件的路径和其对应的文件描述符,将键值对存入 openFile映射中;步骤55判断新打开的共享库是否已经被分析,若是,转步骤58,否则转步骤56,如果共享库已经被分析,则其路径一定已经存在于protectSet中,否则,该共享库还未被分析;步骤56表示对共享库进行分析,分析结果将存入auxiliaryInfo中,具体分析过程如图3所示;步骤57表示将共享库路径添加到protectSet中;步骤58表示结束状态。
图6表示动态添加安全敏感区域流程图。程序运行过程中加载的共享库会引入新的安全敏感区域,运行时释放的共享库也会导致安全敏感区域的减少,因此需要进行动态管理。操作系统使用mmap系统调用来完成对文件的映射,对mmap系统调用添加钩子,可以得到文件描述符、映射区域的权限和映射的起始地址。文件描述符用来在openFile映射中检索文件路径信息,若文件描述符对应的文件是共享库,则以该文件描述符为关键字的键值对存在于openFile映射中。mmap成功执行时返回映射地址,否则返回-1。通过文件路径信息和映射区域的权限可在auxiliaryInfo中找到对应的安全敏感区域,辅助信息和映射结果可以计算得到安全敏感区域的最终地址,将其加入检查集合boundInfo来支持运行时检查。
本过程对mmap函数添加钩子,获得映射的地址,以此来计算新引入的安全敏感区域的最终地址同时更新boundInfo。具体流程如下:步骤60表示开始状态;步骤61表示判断mmap系统调用的调用者是否是目标程序,若是,转步骤62,否则转步骤68;步骤62判断打开的文件是否是共享库,若是,转步骤63,否则转步骤68;步骤63判断系统调用是否成功执行,若是,转步骤64,否则转步骤68;步骤64记录映射的起始位置;根据步骤65表示根据文件路径信息和映射区域的权限信息从auxiliaryInfo中找到对应的安全敏感区域辅助信息,所述文件路径信息是根据文件描述符在openFile映射中检索得到的;步骤66表示计算安全敏感区域的最终起始位置和终止位置;步骤67 表示将新的安全敏感区域加入boundInfo;步骤68:结束状态。
图7表示动态删除安全敏感区域流程图。munmap系统调用会取消指定地址范围的映射,对该系统调用添加钩子可获得取消映射区域的首尾地址,如果安全敏感区域和取消映射区域对应,则从安全敏感区域中删除此区域。munmap成功执行返回0,否则返回-1。
本过程对munmap系统调用添加钩子,获得取消映射区域的起止位置,并删除boundInfo中对应的安全敏感区域。具体流程如下:步骤70表示开始状态;步骤71表示判断munmap系统调用的调用者是否是目标程序,若是,转步骤72,否则转步骤75;步骤72判断系统调用是否成功执行,若是,转步骤73,否则转步骤75;步骤73将记录取消映射的起始位置和大小来计算起止位置;步骤74表示从boundInfo中删除和解除映射区域对应的安全敏感区域;步骤75表示结束状态。
图8表示程序输出操作检测流程图。程序的输出操作会通过与写相关的系统调用来实现,因此,对系统中所有的写操作系统调用添加钩子可以发现程序任意时刻的输出。每当系统中有输出操作被使用时,会首先检查该输出操作是不是被保护程序调用的,若不是,则程序正常运行,若是,则触发运行时检查。以write系统调用为例,该函数含有三个参数,其中buf和size分别表示write要访问区域的起始地址和访问的字节数,据此可以得到write访问区域的开始和结束地址。对boundInfo中每一个安全敏感区域,都会检查输出操作想要访问的区域是否与该安全敏感区域重合,若重合,说明检测到内存信息泄露,终止程序运行并提醒用户。若所有的安全敏感区域检查完成后发现都没有发生重合,则程序正常运行。
本过程对输出操作系统调用添加钩子,获取其要访问的区域来判断是否合法。具体步骤如下:步骤80表示开始状态;步骤81表示判断输出操作是否由目标程序调用,若是则转到步骤82,否则转到步骤86;步骤82表示从boundInfo中逐条取出安全敏感区域信息,即对应区域的起始地址和终止地址;步骤83表示判断是否取到安全敏感区域的信息,即获取该区域在进程地址空间中的开始和结束的地址,若成功,则转步骤84,否则转步骤86;步骤84:将输出操作要访问的区域同取出的敏感区域进行对比,检测是否重合,若是,转步骤85,否则转步骤82;步骤85:检测到内存布局信息泄露;步骤86:结束状态;其中,步骤84的具体判断流程为:步骤90:检查 writeBegin是否在敏感区域内,若在则转步骤85,否则转步骤91;步骤91:检查 writeEnd在不在敏感区域里,若在,则转步骤85,否则转步骤92;步骤92:检查 writeBegin和writeEnd所表示的区域是否包含了安全敏感区域,若是转步骤85,否则转步骤82。
图9表示输出操作边界检查流程图,该过程的目的是检测输出操作所访问的区域与安全敏感区域是否有重合部分。通过有关输出操作的函数参数可以得到访问区域的起始位置,分别记为writeBegin和writeEnd。检查非常便捷,以单个敏感区域为例。首先检查writeBegin在不在敏感区域里,即检查writeBegin是否大于等于该敏感区域的起始地址,同时小于等于该敏感区域的终止地址,若在,即检测到内存信息泄露,终止程序运行并提醒用户。若不在,进行下一步操作。再检测writeEnd在不在敏感区域里,若在,检测到内存信息泄露,终止程序运行并提醒用户。最后,检查安全敏感区域是不是在writeBegin和writeEnd包含的范围里,若是,检查到内存信息泄露,终止程序运行并提醒用户,否则程序正常运行。
本过程的输入是输出操作访问区域的上下界和安全敏感区域信息boundInfo,通过比较边界信息来判断是否存在内存信息泄露。
本发明通过分析程序在正常运行过程中输出操作的访问区域的规律,以减少对内存布局信息泄露行为的误报,使得基于程序的输出操作识别内存布局信息泄露行为更为准确。而且,本方法的检测过程,仅进行简单的输出操作访问区域边界检查,提高了检测处理的效率,减少了系统性能开销。
以上显示和描述了本发明的基本原理、主要特征和优点。本行业的技术人员应该了解,上述实施例不以任何形式限制本发明,凡采用等同替换或等效变换的方式所获得的技术方案,均落在本发明的保护范围内。

Claims (9)

1.一种程序内存布局信息泄露行为的检测方法,其特征在于,包括如下步骤:
步骤一:获取目标程序及其动态链接库;
步骤二:识别与提取目标程序的安全敏感区域,所述安全敏感区域被定义为代码和能被用来推测代码布局的数据;
步骤三:确定目标程序安全敏感区域运行时的地址;
步骤四:动态管理安全敏感区域;
步骤五:程序运行时,监控输出操作,检测内存信息是否泄漏;
步骤一包括:找到受保护程序及其动态链接的共享库,并将它们的二进制文件所处的完整路径加入目标路径集合protectSet,所述protectSet集合用于存放受保护程序及其动态链接库对应的二进制文件在计算机中所处的完整路径,根据完整路径找到待分析的二进制文件;
步骤二包括:对目标路径集合protectSet包含的每个完整路径对应的二进制文件,通过分析其段表和节表得到安全敏感区域的大小和安全敏感区域相对于对应段加载位置的偏移量,将结果存放到auxiliaryInfo文件中,所述auxiliaryInfo文件用于存放protectSet集合中每个路径所对应二进制文件的安全敏感区域的大小以及安全敏感区域相对于对应段加载位置的偏移量,一条记录对应一个安全敏感区域,用于在程序加载完成后确认安全敏感区域的开始地址以及结束地址;
步骤三包括:在程序装载完成后,程序自身和装载时链接的共享库最终位置已经确定,根据anxiliaryInfo中的信息,确定相应安全敏感区域在进程地址空间中的起始地址和终止位置,将其加入到boundInfo,所述boundInfo用于存放每一个安全敏感区域在进程地址空间中的开始地址以及结束地址,用于在运行时确认程序是否访问了安全敏感区域;
步骤四包括:在程序运行过程中,对安全敏感区域进行动态管理,以更新boundInfo中的边界信息;
步骤五包括:在程序运行时,对输出操作添加钩子,检查其访问的区域是否和安全敏感区域有重合部分;若重合,则说明检测到内存布局信息泄露,终止程序的运行并提醒用户;若没有与任意一个安全敏感区域重合,程序正常运行。
2.根据权利要求1所述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤一包括:
步骤20:初始动作;
步骤21:从集合中取出一条未经处理的目标程序或共享库的路径信息;
步骤22:判断是否得到,若得到转步骤23,否则转步骤28;
步骤23:使用ldd命令处理得到的程序;
步骤24:逐条获取ldd的分析结果,其中每条结果表示共享库的路径信息;
步骤25:判断是否得到,若得到转步骤26,否则转步骤21;
步骤26:判断分析结果是否已存在于protectSet集合中,若是,转步骤24,否则转步骤27;步骤27:将尚未加入集合的共享库路径信息添加到protectSet集合中,转到步骤24执行;
步骤28:结束状态。
3.根据权利要求1所述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤二包括:
步骤30:初始动作;
步骤31:从protectSet集合中取出未被处理的一项;
步骤32:判断是否取到,若取到,转步骤33,否则,转步骤3c;
步骤33:对目标二进制文件进行取段表的操作;
步骤34:对目标二进制文件进行取节表的操作;
步骤35:从段表中逐一取出可装载段的段表项;
步骤36:判断是否取到,若取到,转步骤37,否则转步骤31;
步骤37:根据段表项标记的节信息,从节表中取出对应的节表项;
步骤38:判断是否取到,若取到转步骤39,否则转步骤3a;
步骤39:根据取到的节偏移信息和节大小信息记录节首尾位置相对于段的偏移信息,转步骤37;
步骤3a:将同一个段中相邻的节进行合并;
步骤3b:合并后的节信息存入auxiliaryInfo文件,转步骤35;
步骤3c:结束状态。
4.根据权利要求1所述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤三包括:
步骤40:初始动作;
步骤41:使用cat /proc/<pid>/maps命令来获取指定进程的内存布局信息,其中pid为目标进程的PID,可以通过ps aux命令来获得;
步骤42:判断是否获得进程内存布局信息,若得到,则转步骤43,否则转步骤49;
步骤43:逐条读取/proc/pid/maps的输出,每条输出给出了段的映射地址、权限及对应的映射文件信息;
步骤44:是否读取完所有输出,若是,则转步骤49,否则转步骤45;
步骤45判断该映射是否为文件映射,若是,转步骤46,否则转步骤43;
步骤46:根据输出信息的名称和权限在auxiliaryInfo中找到其所对应的安全敏感区域;
步骤47:根据最终映射地址及安全敏感区相对于最终映射地址的偏移量计算出安全敏感区域在进程地址空间中的起始地址和终止地址;
步骤48:把计算结果存入boundInfo,转步骤43;
步骤49:结束状态。
5.根据权利要求1所述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤四包括:提取加载的共享库辅助信息;动态添加安全敏感区域;动态删除安全敏感区域。
6.根据权利要求5所述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤四中,提取加载的共享库辅助信息包括如下步骤:
步骤50:开始状态;
步骤51:判断open系统调用的调用者是否是目标程序,若是,转步骤52,否则转步骤58;步骤52:判断打开的文件是否是共享库,若是,转步骤53,否则转步骤58;
步骤53:判断系统调用是否成功执行,若是,转步骤54,否则转步骤58;
步骤54:记录打开文件的路径和其对应的文件描述符,将键值对存入openFile映射中;
步骤55:判断新打开的共享库是否已经被分析,若是,转步骤58,否则转步骤56,如果共享库已经被分析,则其路径一定已经存在于protectSet中,否则,该共享库还未被分析;
步骤56:对共享库进行分析,分析结果将存入auxiliaryInfo中;
步骤57:将共享库路径添加到protectSet中;
步骤58:结束状态。
7.根据权利要求6所述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤四中,动态添加安全敏感区域包括如下步骤:
步骤60:开始状态;
步骤61:判断mmap系统调用的调用者是否是目标程序,若是,转步骤62,否则转步骤68;步骤62:判断打开的文件是否是共享库,若是,转步骤63,否则转步骤68;
步骤63:判断系统调用是否成功执行,若是,转步骤64,否则转步骤68;
步骤64:记录映射的起始位置;
步骤65:根据文件路径信息和映射区域的权限信息从auxiliaryInfo中找到对应的安全敏感区域辅助信息,所述文件路径信息是根据文件描述符在openFile映射中检索得到的;
步骤66:计算安全敏感区域的最终起始位置和终止位置;
步骤67:将新的安全敏感区域加入boundInfo;
步骤68:结束状态。
8.根据权利要求7所述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤四中,动态删除安全敏感区域包括如下步骤:
步骤70:开始状态;
步骤71:判断munmap系统调用的调用者是否是目标程序,若是,转步骤72,否则转步骤75;
步骤72:判断系统调用是否成功执行,若是,转步骤73,否则转步骤75;
步骤73:将记录取消映射的起始位置和大小来计算起止位置;
步骤74:从boundInfo中删除和解除映射区域对应的安全敏感区域;
步骤75:结束状态。
9.根据权利要求1所述的一种程序内存布局信息泄露行为的检测方法,其特征在于,步骤五包括:
步骤80:开始状态;
步骤81:判断输出操作是否由目标程序调用,若是则转到步骤82,否则转到步骤86;
步骤82:从boundInfo中逐条取出安全敏感区域信息,即对应区域的起始地址和终止地址;
步骤83:判断是否取到安全敏感区域的信息,即获取该区域在进程地址空间中的开始和结束的地址,若成功,则转步骤84,否则转步骤86;
步骤84:将输出操作要访问的区域同取出的敏感区域进行对比,检测是否重合,若是,转步骤85,否则转步骤82;
步骤85:检测到内存布局信息泄露;
步骤86:结束状态;
其中,步骤84的具体判断流程为:
步骤90:检查writeBegin是否在敏感区域内,若在则转步骤85,否则转步骤91;
步骤91:检查writeEnd在不在敏感区域里,若在,则转步骤85,否则转步骤92;
步骤92:检查writeBegin和writeEnd所表示的区域是否包含了安全敏感区域,若是转步骤85,否则转步骤82。
CN201710376190.0A 2017-05-25 2017-05-25 一种程序内存布局信息泄露行为的检测方法 Active CN107220537B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710376190.0A CN107220537B (zh) 2017-05-25 2017-05-25 一种程序内存布局信息泄露行为的检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710376190.0A CN107220537B (zh) 2017-05-25 2017-05-25 一种程序内存布局信息泄露行为的检测方法

Publications (2)

Publication Number Publication Date
CN107220537A CN107220537A (zh) 2017-09-29
CN107220537B true CN107220537B (zh) 2021-02-23

Family

ID=59944763

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710376190.0A Active CN107220537B (zh) 2017-05-25 2017-05-25 一种程序内存布局信息泄露行为的检测方法

Country Status (1)

Country Link
CN (1) CN107220537B (zh)

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105022956A (zh) * 2015-08-14 2015-11-04 中国科学院计算技术研究所 一种抵御代码重用攻击的方法
CN105184169A (zh) * 2015-09-14 2015-12-23 电子科技大学 Windows操作环境下基于插桩工具的漏洞检测方法
CN105488397A (zh) * 2015-12-02 2016-04-13 国网智能电网研究院 一种基于情境的rop攻击检测系统及方法
CN105787368A (zh) * 2016-02-26 2016-07-20 武汉大学 一种基于函数置乱的rop防御方法与装置
CN106022116A (zh) * 2016-05-12 2016-10-12 南京大学 基于安卓程序应用间攻击的自动化补丁系统及方法
CN106095689A (zh) * 2016-06-24 2016-11-09 北京奇虎科技有限公司 一种应用内存泄露的检测方法和装置
CN106407114A (zh) * 2016-09-20 2017-02-15 腾讯科技(深圳)有限公司 内存泄漏分析方法和装置
WO2017030805A1 (en) * 2015-08-18 2017-02-23 The Trustees Of Columbia University In The City Of New York Inhibiting memory disclosure attacks using destructive code reads
CN106502880A (zh) * 2016-09-20 2017-03-15 东软集团股份有限公司 一种内存泄漏调试方法及装置

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105022956A (zh) * 2015-08-14 2015-11-04 中国科学院计算技术研究所 一种抵御代码重用攻击的方法
WO2017030805A1 (en) * 2015-08-18 2017-02-23 The Trustees Of Columbia University In The City Of New York Inhibiting memory disclosure attacks using destructive code reads
CN105184169A (zh) * 2015-09-14 2015-12-23 电子科技大学 Windows操作环境下基于插桩工具的漏洞检测方法
CN105488397A (zh) * 2015-12-02 2016-04-13 国网智能电网研究院 一种基于情境的rop攻击检测系统及方法
CN105787368A (zh) * 2016-02-26 2016-07-20 武汉大学 一种基于函数置乱的rop防御方法与装置
CN106022116A (zh) * 2016-05-12 2016-10-12 南京大学 基于安卓程序应用间攻击的自动化补丁系统及方法
CN106095689A (zh) * 2016-06-24 2016-11-09 北京奇虎科技有限公司 一种应用内存泄露的检测方法和装置
CN106407114A (zh) * 2016-09-20 2017-02-15 腾讯科技(深圳)有限公司 内存泄漏分析方法和装置
CN106502880A (zh) * 2016-09-20 2017-03-15 东软集团股份有限公司 一种内存泄漏调试方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
Timely Rerandomization for Mitigating Memory;D.Bigelow etc.al;《22nd ACM Computer and Communications Security(CCS"15)》;20151031;全文 *

Also Published As

Publication number Publication date
CN107220537A (zh) 2017-09-29

Similar Documents

Publication Publication Date Title
CN108090346B (zh) 一种基于数据流监控的代码复用攻击防御方法及系统
US11159541B2 (en) Program, information processing device, and information processing method
US10235520B2 (en) System and method for analyzing patch file
JP4518564B2 (ja) 不正コード実行の防止方法、不正コード実行の防止用プログラム、及び不正コード実行の防止用プログラムの記録媒体
KR101174751B1 (ko) 커널 콜백 매커니즘을 이용한 악성코드 자동 분석 방법
US8943592B1 (en) Methods of detection of software exploitation
CN108920253B (zh) 一种无代理的虚拟机监控系统和监控方法
CN109255235B (zh) 基于用户态沙箱的移动应用第三方库隔离方法
CN108898012B (zh) 检测非法程序的方法和装置
JP2006330864A (ja) サーバ計算機システムの制御方法
US20040243986A1 (en) Interpreter and native code execution method
CN115688106A (zh) 一种Java agent无文件注入内存马的检测方法及装置
CN111914250A (zh) 一种Linux系统脚本程序运行时验证与管控方法
CN107220537B (zh) 一种程序内存布局信息泄露行为的检测方法
CN111931191A (zh) Linux平台二进制软件堆溢漏洞动态检测方法及系统
JP4643201B2 (ja) バッファオーバーフロー脆弱性分析方法、データ処理装置、分析情報提供装置、分析情報抽出処理用プログラムおよび分析情報提供処理用プログラム
EP3940566A1 (en) Using a variable write profile for detecting intrusion of a computer program
KR102271273B1 (ko) 네이티브 코드 분석방지 우회를 위한 프로세스 래핑 방법, 이를 수행하기 위한 기록 매체 및 장치
CN116628694B (zh) 反序列化0day安全风险防御方法、装置与设备
CN110610086B (zh) 非法代码识别方法、系统、装置及存储介质
CN117744082A (zh) 操作系统中恶意软件的检测方法及装置、存储介质
CN117370979A (zh) 一种系统软件脱壳方法及装置
CN117150487A (zh) 一种动态链接库文件注入检测方法及装置
CN117034278A (zh) 漏洞检测方法、装置、存储介质及电子设备
CN114328168A (zh) 异常检测方法、装置、计算机设备和存储介质

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