论文部分内容阅读
[摘 要]本文对现有动态完整性度量模型进行了分析与研究,针对现有模型不能对进程堆栈的返回地址进行度量,利用影子栈技术的思想,提出了基于可信计算进程的完整性度量模型,该模型是对进程更细粒度的度量,能够有效防止缓冲区溢出的攻击,从而能够保护进程的安全。
[关键词]动态完整性度量;影子栈技术;可信计算;缓冲区溢出
中图分类号:V584 文献标识码:A 文章编号:1009-914X(2017)18-0062-01
进程是保证计算机系统安全关键因素,而现在很多的木马或者病毒通过破坏进程的完整性使计算机系统的安全遭到严重的威胁,如何保护进程的完整性及完全性是目前需要解决的重要问题。文献[1]提出了一种基于可信计算的动态完整性度量模型,该度量模型将进程分为可信、可疑、恶意3类,在其度量架构中,引用虚拟化技术,来对运行中的进程行为进行监控,但并没有说清楚什么样的进程是可信、可疑、恶意的。文都对进程进行更细粒度的动态完整性度量,通过度量进程地址空间得信息,使进程在运行的过程中,不会遭到恶意进程的攻击,确保进程的可信性。而文献[2][3][5]在加载之前不能确保进程在启动时是可信的,从而就不能确保整个进程在运行中是可信的。
以上这些现有的各种动态完整性度量模型或者架构对堆栈里进程函数的返回地址进行度量并没有提出很好的方法,如果沒有对返回地址进行很好的度量,很可能会被攻击者抓住漏洞,进行ROP缓冲区溢出攻击。针对现有动态度量系统不能对堆栈函数的返回地址进行很好的度量的问题,并且综合现有动态度量模型的优点,在现有动态度量模型的基础之上,并且利用了影子栈技术的思想,对堆栈函数的返回地址进行完整性度量,本文设计了基于可信计算进程的动态完整性度量模型。
1 模型设计
1.1 度量对象
(1)进程相关文件
在计算机系统中,影响进程完整性的对象有进程的配置文件、可执行文件、动态链接库,以及进程的地址空间。由于病毒或者木马通常会修改进程的执行文件、配置文件或链接库文件,以便用户在下次启动系统的时候仍然能够获得系统的控制权,因此必须将进程相关的这些文件作为度量对象之一,以保证进程在启动之前是可信的。
(2)进程代码段
现在很多的黑客就是通过修改进程的代码段,使进程去执行攻击者满足需要的程序,以达到攻击的目的。由于进程的代码段是不变的,因此可以通过对进程代码段进行完整性度量,在进程遭到攻击者攻击的时候,如果发现进程代码段的度量结果发生改变,说明遭到攻击者的攻击,就可以阻止进程的运行,避免攻击者的攻击。因此必须将进程的代码段作为进程完整性度量的对象之一。
(3)堆栈函数返回地址
由于缓冲区溢出通常是堆栈函数的地址被破坏,因此堆栈函数地址也必须作为进程完整性度量的对象之一,本文利用影子栈技术的思想,对函数的返回地址进行完整性度量,来防止各种情况下缓冲区溢出攻击。
2 模型架构
为了对进程进行更好的动态完整性度量,弥补现有进程度量模型架构的不足,在现有动态度量方法的基础之上,设计了进程动态完整性度量模型。在进程载入之前,首先要通过进程相关文件的收集模块,扫描进程载入时所需要的二进制文件、动态链接库、配置文件等,然后交给静态完整性度量模块进行度量,如果进程是第一次运行,会把相应的度量结果经过加密以后直接存入完整性数据基库,如果不是第一次运行的,就从完整性数据基库中取出当前进程相应的基准值,经过解密后,进入完整性验证模块,与当前的度量结果进行比较,如果相同,那么它就可以获得信任,获得控制权,然后继续计算进程代码段的完整性度量值并将其加密存入完整性数据基库中;否则进程就会被监控模块进行监控。
在静态完整性度量通过以后,会首先将进程挂起,并计算进程代码段的度量值并与度量参考值进行比较,如果相等则进程继续运行,然后再对进程的堆栈函数的地址进行完整性度量验证;否则进程也会继续被监控模块监控。
2.1 进程相关文件收集
为了保证进程的静态完整性,使进程启动时可信的,就必须对进程启动的相关的文件进行完整性度量,进程相关文件收集就是去扫描进程运行时所需要的相关文件,以便交给静态完整性度量模块。假设需要度量的进程有,并且假设进程相关的文件有,,其中n为需要度量的进程数目,m是进程有可能相关的最大文件数目。那么,对于任意一个进程相关文件集合为:
2.2 完整性数据基库
完整性数据基库是存储进程完整性信息的基准值,包括进程运行时所需要的各种相关文件完整性值、动态进程代码段的完整性值、堆栈函数返回地址的完整性值,为了验证进程的完整性是否遭到破坏,通常将度量结果和完整性数据基库中的基准值进行比较,如果相等话说明进程完整性没有遭到破坏。其数据结构如下:
typedef struct proIntegrityInfo{
char *procName;//进程名字
char *fileHash;//进程相关文件的散列值
char *codeHash;//进程代码段内容的散列值
char *stackFunHash;//进程堆栈函数返回地址的散列值
}ProIntegrityInfo,*TprocinIntegrityInfo;
2.3 静态完整性度量
静态完整性度量就是在进程载入时对其相关文件的度量,每个文件都采用TPM提供的算法计算摘要值。对进程来说,完整性度量值定义为:计算所有目标进程相关文的摘要值,然后进行字符串连接(符号“|”定义为字符串简单的连接操作),然后在使用算法计算连接后的摘要值:
2.4 动态完整性度量
动态完整性度量主要是对进程的代码页信息和堆栈信息进行度量,来保证进程在运行过程中,不会遭到恶意程序的修改以及缓冲区溢出的攻击。
进程的代码段通常是指用来存放程序执行代码的一块内存区域,这部分区域的大小在程序运行前就已经确定。运行在系统中的进程的代码段可看作由一系列(设最多t个)内存页面组成:,每一个页面中的数据都对应一个完整性度量值。如果进程全部加载到内存中,则进程在内存中的代码页的完整性度量值应该等于该进程未加载到内存时代码页静态完整性度量值,否则阻止进程的运行。其中为:
为了避免进程遭到缓冲区溢出的攻击,本模型借鉴影子栈技术的思想,当堆栈函数被调用的时候,会对函数的地址进行完整性度量,作为基准值存储到完整性数据基库中,当函数的地址返回时,会再次对函数的返回地址进行完整性度量,如果与基准值相等,说明进程的完整性没有遭到破坏。
2.5 度量结果加密
为了保护度量结果不被攻击者利用或者损坏,通过由TPM提供的RSA加算法对度量结果进行加密,从而能够保证度量结果的安全性。
2.6 完整性验证
完整性验证为了校验进程的完整性是否遭到破坏,每次进程完整性度量之后,都会触发完整性验证模块进行完整性验证,将当前的度量结果与完整性数据库中基准值进行比较,然后将完整性验证结果交给监控模块去处理。
2.7 监控模块
监控模块是根据完整性验证结果来对进程的行为进行监控,当进程的完整性遭到破坏时,监控模块会立即停止进程的运行,保护系统的安全性,使系统不被木马或者病毒的入侵。
3 总结
本文通过借鉴影子栈技术的思想,提出了基于可信计算进程的动态完整性度量模型及其实现架构,该模型通过对进程所需要的相关文件进行静态完整性度量,从而保证进程加载到内存运行的过程中是可信的。在进程加载到内存过程中,又对进程的代码块和堆栈函数的返回地址进行完整性度量,保护进程在运行过程中不受到一些恶意程序的入侵以及缓冲区溢出的攻击,从而保证了进程在整个运行过程中的完整性,同时也提高了系统的安全性。
[关键词]动态完整性度量;影子栈技术;可信计算;缓冲区溢出
中图分类号:V584 文献标识码:A 文章编号:1009-914X(2017)18-0062-01
进程是保证计算机系统安全关键因素,而现在很多的木马或者病毒通过破坏进程的完整性使计算机系统的安全遭到严重的威胁,如何保护进程的完整性及完全性是目前需要解决的重要问题。文献[1]提出了一种基于可信计算的动态完整性度量模型,该度量模型将进程分为可信、可疑、恶意3类,在其度量架构中,引用虚拟化技术,来对运行中的进程行为进行监控,但并没有说清楚什么样的进程是可信、可疑、恶意的。文都对进程进行更细粒度的动态完整性度量,通过度量进程地址空间得信息,使进程在运行的过程中,不会遭到恶意进程的攻击,确保进程的可信性。而文献[2][3][5]在加载之前不能确保进程在启动时是可信的,从而就不能确保整个进程在运行中是可信的。
以上这些现有的各种动态完整性度量模型或者架构对堆栈里进程函数的返回地址进行度量并没有提出很好的方法,如果沒有对返回地址进行很好的度量,很可能会被攻击者抓住漏洞,进行ROP缓冲区溢出攻击。针对现有动态度量系统不能对堆栈函数的返回地址进行很好的度量的问题,并且综合现有动态度量模型的优点,在现有动态度量模型的基础之上,并且利用了影子栈技术的思想,对堆栈函数的返回地址进行完整性度量,本文设计了基于可信计算进程的动态完整性度量模型。
1 模型设计
1.1 度量对象
(1)进程相关文件
在计算机系统中,影响进程完整性的对象有进程的配置文件、可执行文件、动态链接库,以及进程的地址空间。由于病毒或者木马通常会修改进程的执行文件、配置文件或链接库文件,以便用户在下次启动系统的时候仍然能够获得系统的控制权,因此必须将进程相关的这些文件作为度量对象之一,以保证进程在启动之前是可信的。
(2)进程代码段
现在很多的黑客就是通过修改进程的代码段,使进程去执行攻击者满足需要的程序,以达到攻击的目的。由于进程的代码段是不变的,因此可以通过对进程代码段进行完整性度量,在进程遭到攻击者攻击的时候,如果发现进程代码段的度量结果发生改变,说明遭到攻击者的攻击,就可以阻止进程的运行,避免攻击者的攻击。因此必须将进程的代码段作为进程完整性度量的对象之一。
(3)堆栈函数返回地址
由于缓冲区溢出通常是堆栈函数的地址被破坏,因此堆栈函数地址也必须作为进程完整性度量的对象之一,本文利用影子栈技术的思想,对函数的返回地址进行完整性度量,来防止各种情况下缓冲区溢出攻击。
2 模型架构
为了对进程进行更好的动态完整性度量,弥补现有进程度量模型架构的不足,在现有动态度量方法的基础之上,设计了进程动态完整性度量模型。在进程载入之前,首先要通过进程相关文件的收集模块,扫描进程载入时所需要的二进制文件、动态链接库、配置文件等,然后交给静态完整性度量模块进行度量,如果进程是第一次运行,会把相应的度量结果经过加密以后直接存入完整性数据基库,如果不是第一次运行的,就从完整性数据基库中取出当前进程相应的基准值,经过解密后,进入完整性验证模块,与当前的度量结果进行比较,如果相同,那么它就可以获得信任,获得控制权,然后继续计算进程代码段的完整性度量值并将其加密存入完整性数据基库中;否则进程就会被监控模块进行监控。
在静态完整性度量通过以后,会首先将进程挂起,并计算进程代码段的度量值并与度量参考值进行比较,如果相等则进程继续运行,然后再对进程的堆栈函数的地址进行完整性度量验证;否则进程也会继续被监控模块监控。
2.1 进程相关文件收集
为了保证进程的静态完整性,使进程启动时可信的,就必须对进程启动的相关的文件进行完整性度量,进程相关文件收集就是去扫描进程运行时所需要的相关文件,以便交给静态完整性度量模块。假设需要度量的进程有,并且假设进程相关的文件有,,其中n为需要度量的进程数目,m是进程有可能相关的最大文件数目。那么,对于任意一个进程相关文件集合为:
2.2 完整性数据基库
完整性数据基库是存储进程完整性信息的基准值,包括进程运行时所需要的各种相关文件完整性值、动态进程代码段的完整性值、堆栈函数返回地址的完整性值,为了验证进程的完整性是否遭到破坏,通常将度量结果和完整性数据基库中的基准值进行比较,如果相等话说明进程完整性没有遭到破坏。其数据结构如下:
typedef struct proIntegrityInfo{
char *procName;//进程名字
char *fileHash;//进程相关文件的散列值
char *codeHash;//进程代码段内容的散列值
char *stackFunHash;//进程堆栈函数返回地址的散列值
}ProIntegrityInfo,*TprocinIntegrityInfo;
2.3 静态完整性度量
静态完整性度量就是在进程载入时对其相关文件的度量,每个文件都采用TPM提供的算法计算摘要值。对进程来说,完整性度量值定义为:计算所有目标进程相关文的摘要值,然后进行字符串连接(符号“|”定义为字符串简单的连接操作),然后在使用算法计算连接后的摘要值:
2.4 动态完整性度量
动态完整性度量主要是对进程的代码页信息和堆栈信息进行度量,来保证进程在运行过程中,不会遭到恶意程序的修改以及缓冲区溢出的攻击。
进程的代码段通常是指用来存放程序执行代码的一块内存区域,这部分区域的大小在程序运行前就已经确定。运行在系统中的进程的代码段可看作由一系列(设最多t个)内存页面组成:,每一个页面中的数据都对应一个完整性度量值。如果进程全部加载到内存中,则进程在内存中的代码页的完整性度量值应该等于该进程未加载到内存时代码页静态完整性度量值,否则阻止进程的运行。其中为:
为了避免进程遭到缓冲区溢出的攻击,本模型借鉴影子栈技术的思想,当堆栈函数被调用的时候,会对函数的地址进行完整性度量,作为基准值存储到完整性数据基库中,当函数的地址返回时,会再次对函数的返回地址进行完整性度量,如果与基准值相等,说明进程的完整性没有遭到破坏。
2.5 度量结果加密
为了保护度量结果不被攻击者利用或者损坏,通过由TPM提供的RSA加算法对度量结果进行加密,从而能够保证度量结果的安全性。
2.6 完整性验证
完整性验证为了校验进程的完整性是否遭到破坏,每次进程完整性度量之后,都会触发完整性验证模块进行完整性验证,将当前的度量结果与完整性数据库中基准值进行比较,然后将完整性验证结果交给监控模块去处理。
2.7 监控模块
监控模块是根据完整性验证结果来对进程的行为进行监控,当进程的完整性遭到破坏时,监控模块会立即停止进程的运行,保护系统的安全性,使系统不被木马或者病毒的入侵。
3 总结
本文通过借鉴影子栈技术的思想,提出了基于可信计算进程的动态完整性度量模型及其实现架构,该模型通过对进程所需要的相关文件进行静态完整性度量,从而保证进程加载到内存运行的过程中是可信的。在进程加载到内存过程中,又对进程的代码块和堆栈函数的返回地址进行完整性度量,保护进程在运行过程中不受到一些恶意程序的入侵以及缓冲区溢出的攻击,从而保证了进程在整个运行过程中的完整性,同时也提高了系统的安全性。