基于程序内部行为监控的软件安全保障的方法

文档序号:6420615阅读:187来源:国知局
专利名称:基于程序内部行为监控的软件安全保障的方法
技术领域
本发明涉及一种计算机系统安全(system security)保障方法,特别是一种软件不因为本身自带的漏洞而受到攻击所提供的安全保障方法。
背景技术
软件的安全问题是指由于软件的研究、设计、开发、测试,以及使用过程中的缺陷而造成的安全漏洞(security flaws)。攻击者可能利用这些漏洞使得软件的运行偏离原本设计的意图来达到特有的攻击目的,典型的例子包括缓冲区溢出(buffer overflow)漏洞,格式化串(format string)错误,malloc/free错误等。随着计算机应用和互联网的迅速发展,计算机之间的交互不断增强,软件的安全问题已成为计算机系统安全的最大问题所在。目前解决此问题的方法大致分两类一是针对已知漏洞的方法,二是程序的行为管理。前者缺乏通用性,每种方法都只能防范一小部分的攻击,并且对于未知攻击类型毫无作用;后者的分析粒度比较有相当精确度的损失,即较高的漏报率和错报率。这两种方法都已经在现实中有了一定程度的应用,两种方法的代表作有Immunix Secured OS、Computer Misuse DetectionSystem等。

发明内容
1、发明目的本发明的目的是为了弥补目前防范软件漏洞攻击的两类方法通用性和精确程度难以结合的不足,提供了一种基于程序内部行为监控的同时具有很高的精确性和通用性的方法。
2、技术方案为了实现本发明所述目的,本发明从操作系统环境的角度来提供对经过特别处理的程序的攻击防护,其方法包括以下步骤(1)C语言代码分析器分析程序的控制流,并在关键位置(分为函数调用点、被调用函数入口、函数返回点)添加描述控制流转换代码,添加程序的协助保护功能,然后按照正常方式编译成可执行程序;(2)处理过的程序递交给程序加载器,程序加载器判断当前程序是否具有保护功能,如果有则加载辅助计算控制流转和向操作系统递交控制流转信息的运行环境,如果没有转到步骤(4);(3)向操作系统递交该进程的保护信息并设置该程序进程的保护标志为真;(4)操作系统内核在整个系统运行中一旦获得控制权利,则立即判断当前进程的保护标志,如果为假转到步骤(7);(5)操作系统内核检查该进程控制流转换的一致性,如果不一致,发出安全警告,并杀死进程,转到步骤(7);(6)继续运行进程;(7)保护机制结束。
在具体系统实现中,即构建一个具有以上安全保障特性的操作系统环境,构建的方法按照以下的流程(1)改造通用操作系统内核,添加监控机制;(2)构造C语言分析器或者修改编译器,使其具有分析控制流和添加合适代码的功能;(3)从源代码重新创建可运行的程序,在这个过程中自动添加描述控制流的代码;(4)修改系统程序加载器和运行库,提供对这种特殊的添加了保护特性的程序的加载和运行提供支持;(5)将以上的各部分按照以上描述的保护机制的总体步骤整合成一个一致的操作系统环境。
本发明的主要思想是通过分析程序的控制流转换,给普通程序添加描述控制流转换的代码,通过操作系统内核来监控程序的运行,达到判断一个程序是否收到攻击的目的。该方法一个非常重要的出发点,也是目前几乎所有攻击的一个共性,就是对程序正常控制流的篡改。
3、有益效果本发明的显著优点是克服了现有两类方法防范软件漏洞攻击的通用性和精确程度难以结合的不足,提高了安全保障方法的精确性和通用性。


图1是C语言程序转换的流程图。
图2是系统程序加载器工作流程图。
图3是系统内核状态转换和执行流程图。
图4是系统构造及总体工作流程图。
具体实施例方式
为了更好地说明整个构建基于程序内部行为监控保护机制的操作系统环境的具体实施方式
,首先需要简单引入一些原理和概念。
1、控制流——函数调用关系图。
一个程序的执行通常由一系列顺序执行的语句或指令所连接的函数调用所组成,如果把一个程序的函数看作这样的相对独立的指令序列块,对于这个指令块有统一的入口点(entry point)和出口点(return point),并把所有函数的入/出口点,以及函数调用指令都缩减成图的节点,把连接这些节点的顺序指令看作节点间的路径,那么就称之为一个程序的函数调用关系图。
2、等价调用关系——简单函数调用轨迹。
为了构造简单函数调用轨迹,首先需要对call graph的信息做一定的转换。
等价调用关系计算方法是假设调用关系图G中调用点表示为Ci(i=1…N)函数的表示为Fj(j=1…M),Ci→Fj表示在call graph中存在一条由Ci到Fj的调用关系边。将G按照以下的算法转换为G’对于一个调用点Ci和它所调用关系所指向的集合F,如果存在任何其他调用点的调用关系Ck→Fh,且Fh∈F,则添加Ci→Fh到G’中。重复这个过程直到没有新边添加为止。将同一个调用点指向的函数称为“等价调用函数集合”,而所有指向同一个等价调用函数结合的调用点为“等价调用点集合”,它们之间的关系为“等价调用关系”。类似的,可以构造“等价返回函数集合”、“等价返回点集合”以及“等价返回关系”并说明它们的类似特性。
在此基础上,构造运行时候的“简单函数调用轨迹”对于所有程序中每一个“等价调用关系”赋值不同的标识数,并定义等价调用关系标识数的集合为IN,类似定义等价返回标识数集合OUT,它的简单函数调用轨迹是如下产生的两组整数数字序列对(调用序列对Ii、I’i;返回序列对Oi、O’i) (公式一) (公式二)其中,I为索引值,表示函数运行时候函数调用或者返回的次数。n、m为两个数列对的初始值,可以为任何整数,a,a’∈IN分别为本次的函数调用点和本次被调用返回函数所在“等价调用关系”(等价返回关系)的标识数。b,b’∈IN分别为本次的返回函数和本返回点所在“等价调用关系”(等价返回关系)的标识数。调用序列函数f(a,b),与返回序列函数g(x,y)为使得所生成的Ii、Oi满足以下条件的任意函数i,ji≠j→Ii≠Ij且Oi≠Oj(条件一) (条件二)。
本发明的流程
本发明的三个重要组成部分是C程序转换器、程序加载器和监控内核。它们分别来自通用的C语言分析器(CIL)、通用程序加载器(ld.so)和通用操作系统内核(Linux kernel 2.4.x)。为了更好的说明本发明的工作流程,我们将分别具体说明该三个主要组成部分的内部工作流程,然后再描述由这三个部分组成的整体工作流程。
1、C语言源码程序的保护机制的添加流程。
一个C语言源码的程序首先需要通过本发明的C语言分析器进行转换,C语言分析和添加保护代码的步骤如图1所示。首先扫描所有程序的C语言源文件,分析整个程序的函数调用关系,以一定格式记录(步骤10)。然后,根据所得的函数调用关系按照前面部分所介绍的等价调用关系计算法计算所有等价调用(返回)关系,并为每一个等价关系分配一个唯一的标识数(步骤11)。接着,根据标识数选择满足条件一、二的序列函数f(x,y)和g(x,y)(步骤12),这两个函数的选择原则上是任意满足条件一、二的任何函数,实现当中最简单的选择可以是f(x,y)=g(x,y)=x+y。再接着,分析器将上面所得的标识数和序列函数组成计算简单函数调用轨迹的C语言源代码并插入程序中适当的部位(步骤13)。所添加代码的主要任务是按照概念介绍部分的公式一和公式二计算简单函数调用轨迹序列。最后得到一个添加了保护机制的程序的C语言的源代码,通过系统编译器编译成具有保护功能的程序可执行程序。
2、保护程序加载器工作流程。
保护程序加载器是在通用程序加载器的基础上添加对受保护程序识别和运行时候支持的功能而产生的程序加载器。它的简单工作流程如图2所示。程序加载器通过发现可执行程序是否特别加载了某些库来判断它是否已经被添加了本发明的保护机制(步骤14)。如果是,就通过操作系统的特殊系统调用将需要监控的信息递交给操作系统作为该进程的相关信息保存,然后设置进程的保护标志为真(步骤15),并将保护机制需要的支撑库加载入进程寻址空间(步骤16),支撑库的作用是为受保护程序中的计算简单函数轨迹而由转换器添加的代码的提供辅助,具体功能和内容可以视转换器所添加的代码的功能而定。最后继续一般程序加载器的工作(步骤17)。如果加载器发现该程序为一个普通程序,则执行一般加载器的工作,进而保证了加载器对一般程序的兼容性。
3、系统内核状态转换和执行流程。
本发明的操作系统内核的主要工作是监控一个受保护程序的正常运行,它的主要状态转换和执行流程如图3,内核的监控代码全部运行于有特殊权限的系统空间。运行于用户空间的进程可能通过系统调用或者由于中断的发生陷入系统空间,导致内核取得CPU控制权限(步骤18),内核立即进行检查,看是否当前进程属于被保护进程(步骤19),如果是,则检查调用序列对Ii、I’i和返回序列对Oi、O’i是否一致(步骤20),如果不一致就作为受到攻击的情况处理(步骤21),具体处理可以包括杀死或停止进程以及发出攻击警告。内核执行流的最后为通用内核的正常事务处理(步骤22),包括系统调用、中断处理代码,任务调度等等。整个流程可以保证系统内核对程序监控的实时的性。
4、本发明总体工作流程。
整个系统构建的构建步骤以及工作流程如图4,需要保护的程序的C语言源码首先经过本发明的C语言转换器转换为添加了保护机制的C语言程序源码(步骤210),它的内部工作流程如前面第1节所述(步骤10~13);紧接着,添加了保护机制的C语言程序源码经过通用编译器(gnu cc)编译成为添加了保护机制的二进制可执行文件(步骤220),该二进制文件经由本发明的程序加载器加载,进入操作系统成为等待运行的含有保护机制的普通用户进程(步骤230),加载器的内部流程如前面第2节所述(步骤14~17)。本发明的操作系统内核将该等待运行的进程执行,并实时监控它的简单函数调用序列是否一致,以此作为受到攻击的判断(步骤240),本发明内核的内部工作流程如前面第3节所述(步骤18~步骤22)。
程序在受到攻击的情况下将被本发明系统内核杀死,进而作为被杀死的进程推出系统,或者正常运行结束自动推出系统,从而结束整个程序在整个系统中的生命周期。本发明的总体工作流程完整涵盖此生命周期。
权利要求
1.一种基于程序内部行为监控的软件安全保障的方法,其特征在于该方法包括以下步骤(1)C语言代码分析器分析程序的控制流,并在函数调用点、被调用函数入口、函数返回点添加描述控制流转换代码,添加程序的协助保护功能,然后按照正常方式编译成可执行程序;(2)处理过的程序递交给程序加载器,程序加载器判断当前程序是否具有保护功能,如果有则加载辅助计算控制流转和向操作系统递交控制流转信息的运行环境,如果没有转到步骤(4);(3)向操作系统递交该进程的保护信息并设置该程序进程的保护标志为真;(4)操作系统内核在整个系统运行中一旦获得控制权利,则判断当前进程的保护标志,如果为假转到步骤(7);(5)操作系统内核检查该进程控制流转换的一致性,如果不一致,发出安全警告,并杀死进程,转到步骤(7);(6)继续运行进程;(7)保护机制结束。
2.根据权利要求1所述的基于程序内部行为监控的软件安全保障的方法,其特征在于在步骤(1)中,C语言分析和添加保护代码的步骤是(10)首先扫描所有程序的C语言源文件,分析整个程序的函数调用关系,以一定格式记录;(11)根据所得的函数调用关系计算所有等价调用/返回关系,并为每一个等价关系分配一个唯一的标识数;(12)根据标识数选择满足条件的序列函数f(x,y)和g(x,y);(13)分析器将上面所得的标识数和序列函数组成计算简单函数调用轨迹的C语言源代码并插入程序中适当的部位。
3.根据权利要求1所述的基于程序内部行为监控的软件安全保障的方法,其特征在于在步骤(2)中,程序加载器的步骤是(14)程序加载器通过发现可执行程序是否特别加载了某些库来判断它是否已经被添加了保护机制,如果否转(17);(15)通过操作系统的特殊系统调用将需要监控的信息递交给操作系统作为该进程的相关信息保存,然后设置进程的保护标志为真;(16)将保护机制需要的支撑库加载入进程寻址空间;(17)继续一般程序加载器的工作。
4.根据权利要求1所述的基于程序内部行为监控的软件安全保障的方法,其特征在于在步骤(4)中,操作系统内核的的状态转换和执行流程步骤是(18)内核取得CPU控制权限;(19)内核立即进行检查,看是否当前进程属于被保护进程,如果否转(22);(20)检查调用序列对Ii、I’i和返回序列对Oi、O’、i是否一致,如果一致则转(22);(21)作为受到攻击的情况处理,可以包括杀死或停止进程以及发出攻击警告;(22)通用内核的正常事务处理,包括系统调用、中断处理代码、任务调度。
全文摘要
本发明公开了一种基于程序内部行为监控的软件安全保障的方法,其步骤是1.语言代码分析器分析程序的控制流,并添加描述控制流转换代码,添加程序的协助保护功能,然后编译成可执行程序;2.处理过的程序递交给程序加载器,判断当前程序是否具有保护功能,如果有则加载适当的运行环境,否则转到4;3.向操作系统递交该进程的保护信息并设置该程序进程的保护标志为真;4.操作系统内核一旦获得控制权利,则判断进程的保护标志,如果为假转到7;5.操作系统内核检查该进程控制流转换的一致性,如果不一致,发出安全警告,并杀死进程,转到7;6.继续运行进程;7.结束。本发明的显著优点是提高了安全保障方法的精确性和通用性。
文档编号G06F11/36GK1605968SQ200410065710
公开日2005年4月13日 申请日期2004年11月15日 优先权日2004年11月15日
发明者夏耐, 郭明松, 茅兵, 林志强, 王逸, 谢立 申请人:南京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1