一种基于哈希算法的库函数安全增强方法

文档序号:9667701阅读:386来源:国知局
一种基于哈希算法的库函数安全增强方法
【技术领域】
[0001]本发明涉及计算机技术领域,更具体地说,本发明涉及一种基于哈希算法的库函数安全增强方法。
【背景技术】
[0002]出于效率考虑,C/C++提供了很多如strcpy等字符串操作库函数。而C/C++在提供灵活的使用方式和高效目标码的同时,这些使用频度很高的库函数在实现时没有加入边界检查代码,缺乏相应的安全机制,存在着一些容易为攻击者利用的安全漏洞。针对不安全库函数的调用防范,目前提出的一种普遍做法是对不安全库函数进行增强,Libsafe即为一种最常用的方法。Libsafe利用动态库的预载机制,封装了若干已知的易受堆栈冲击方法攻击的库函数。安全库实现可分为三个阶段:拦截库函数调用;对库函数调用做安全性检查;漏洞处理。
[0003]对库函数调用做安全性检查为最关键的一步,直接决定对漏洞处理的方式。通过栈帧指针FP逐层回溯栈直到找到目标操作数被定义的函数栈信息,从而获取到该操作数的使用范围。然后比较源操作数和目标操作数的使用范围大小,进而判断该函数调用是否安全。若不安全,则报警并退出,否则用安全库函数调用替换该不安全函数。
[0004]Libsafe通过截获对库函数的调用,监控程序运行时堆栈指针的变化,使用安全的库函数替代有风险的库函数。然而其在对库函数调用做安全性监控时,是依赖栈帧指针回溯栈信息的,而栈帧指针FP并不是堆栈的必选内容,其受限于编译器中栈帧指针是否存在以及编译器是否优化掉了栈帧指针,在添加相关选项时,安全增强机制将被失效。

【发明内容】

[0005]本发明所要解决的技术问题是针对现有技术中存在上述缺陷,提供一种基于哈希算法的库函数安全增强方法,其能够实现一种通用的库函数安全增强机制,该机制将改进现有的安全增强库检查机制中的回溯栈的方法,使得安全库的增强更加有通用性。
[0006]为了实现上述技术目的,根据本发明,提供了一种基于哈希算法的库函数安全增强方法,包括:对同一函数的多次调用,将已经回溯的栈信息用链表保存起来,此后再次调用该函数时,以函数返回地址作为关键字检索链表以查找所述函数的栈信息,如果在链表中查找到所述函数的栈信息,则直接从链表取出对应的栈信息。
[0007]优选地,如果在链表中没有查找到所述函数的栈信息,则针对所述函数利用指令特征码进行指令匹配,直到找到所述函数的栈信息为止,并将找到的所述函数的栈信息加入到链表中。
[0008]优选地,针对所述函数利用指令特征码进行指令匹配包括:利用函数返回地址内容得到函数代码段中对应指向的指令;从该指令开始逐条将函数指令特征码与候选集里的指令特征码进行匹配,以获知栈帧的栈顶位置以及栈上分配临时空间大小,计算得到父函数的栈顶信息;此后,通过父函数的栈中返回地址信息来获取到父函数中的对应代码段的指令信息;利用父函数中的对应代码段的指令信息逐条与候选集里的指令特征码进行匹配,直到找到定义局部变量所在的函数栈信息。
【附图说明】
[0009]结合附图,并通过参考下面的详细描述,将会更容易地对本发明有更完整的理解并且更容易地理解其伴随的优点和特征,其中:
[0010]图1示意性地示出了进程中栈的结构示意图。
[0011]图2示意性地示出了根据本发明优选实施例的基于哈希算法的库函数安全增强方法的Libsafe库安全检测算法流程图。
[0012]图3示意性地示出了基于指令特征码回溯栈的示意图。
[0013]需要说明的是,附图用于说明本发明,而非限制本发明。注意,表示结构的附图可能并非按比例绘制。并且,附图中,相同或者类似的元件标有相同或者类似的标号。
【具体实施方式】
[0014]为了使本发明的内容更加清楚和易懂,下面结合具体实施例和附图对本发明的内容进行详细描述。
[0015]本发明提出根据指令特征码的信息来回溯栈信息的。图1是进程在栈中的结构示意图。函数的栈信息自上而下依次存放,不同的函数栈信息是相互关联的,可以通过当前函数栈信息来追溯上一层函数栈信息。在每个栈初始化时包括了栈空间预留以及栈顶指针的初始化过程、对栈帧指针FP的赋值。栈空间预留以及栈顶指针的初始化代码是每个函数体必须的操作,且在每个函数栈初始化过程中,栈顶指针SP最开始时指向该函数的栈底;分析程序开头部分栈的初始化过程特点,可以看出如果获取一个调用函数的栈顶指针SP和为该栈分配的临时空间大小,就可以对应知道定义变量所在函数的栈的上下限以及其父函数的栈信息,从而可知道每个局部变量的最大操作范围。针对该指令特征码的共性,提取函数体标准开头的指令共同特征码作为候选集保存,实现基于指令特征码的栈回溯的方法。依次分析程序代码段的每条指令特征,在一定条件限制下,将其与候选集指令特征码匹配,来回溯每个栈的栈信息内容。
[0016]对同一函数的多次调用,可将已经回溯的栈信息用链表保存起来,此后再次调用该函数时,可直接从链表中取出栈信息,避免了不必要的匹配操作。考虑到函数返回地址的唯一性,在每次栈回溯的时候(即每次从链表中取出栈信息),以函数返回地址作为关键字检索链表以查找所述函数的栈信息,如果在链表中查找到所述函数的栈信息,则直接从链表取出对应的栈信息。如果在链表中没有查找到所述函数的栈信息,则针对所述函数利用指令特征码进行指令匹配,直到找到所述函数的栈信息为止,并将找到的所述函数的栈信息加入到链表中。
[0017]优选地,将所有关键字为同义词的结点链接到同一个单链表中。将散列表定义为由B (表长B
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1