Cpu硬件支持的系统攻击防范方法

文档序号:6567006阅读:393来源:国知局
专利名称:Cpu硬件支持的系统攻击防范方法
技术领域
本发明涉及微处理器体系结构和计算机系统安全,特别涉及一种CPU硬件支持的系统攻击防范方法。
一种常见而危险的漏洞是缓冲区溢出,它在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序失败,可以执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出的原理是通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序没有仔细检查用户输入的参数,而系统又缺乏有效的防范措施。
当然,随便往缓冲区中填东西造成它溢出一般只会使得被攻击程序出现“分段错误”(Segmentation fault),而不能达到攻击的目的。要利用缓冲区溢出攻击,攻击者必须达到如下的两个目标(1)在目标程序地址空间安排攻击代码;(2)改变程序的控制流,执行攻击者安排的代码。最常见的缓冲区溢出攻击手段是攻击者定位一个可供溢出的自动变量(在堆栈分配空间的变量),然后向这个变量传递一个很大的字符串,引发缓冲区溢出,使得溢出的字符植入代码而且函数返回地址指向植入的代码;这样,当前函数一旦返回,植入的攻击代码就会被运行。因为很多编程语言习惯上只为变量和参数开辟很小的缓冲区,而且许多库函数缺乏严格的边界检查,所以这种漏洞攻击的实例十分常见。
例如,在

图1左边的C程序片断中,程序执行到gets函数时栈的内容如图1的中间部分所示。程序继续运行,调用gets函数取用户输入。由于gets不检查输入长度,直接把所有输入往buffer变量中拷贝,攻击者可以输入精心安排的字符串使得溢出的字符满足(1)包含一段攻击代码,(2)把fb返回地址改成攻击代码的起始地址。这样,fb一旦返回,攻击代码就将执行,以这个程序的权限运行非法内容。
除了缓冲区溢出之外,还有一些其它类型的漏洞。目前对付利用系统漏洞的攻击有三种办法(1)修改程序,消除程序的漏洞。这个方法最根本,但是难以防患于未然。因为系统程序数目极多,而且在不停地更新换代,不可能保证所有的系统程序都没有漏洞。目前系统软件厂商都采用这个方法来亡羊补牢每发现一个漏洞就发布一个补丁来消除它。
(2)修改编译器,使得编译器能够检查出可能产生漏洞的地方,或者插入运行时的检查代码。通常这要求对编程语言进行较大的修改,程序的效率可能也会受到比较大的影响。同时这也要求重新编译大量的程序,会带来兼容性的问题。
(3)操作系统提供更多的系统级防范,从根本上消除利用漏洞攻击的生效条件。例如,利用上述缓冲区溢出漏洞攻击时,攻击代码通常放在堆栈或者数据段中,正常情况下那些地址并不需要可执行的权限。因此,如果可以使得堆栈和数据段所在地址不可执行,这一类的攻击就可以统一地防范。
操作系统要提供系统级防范通常离不开CPU的硬件支持。现代CPU一般都具有多个具有不同权限的运行级,以及支持虚拟存储的存储管理部件(MMU)。可是,对于利用系统程序漏洞进行的攻击,现有的硬件支持往往不够。例如,对于需要在堆栈或者数据段中执行代码的一大类攻击,控制某个地址是否可执行的能力非常有用。但由于很多CPU,如MIPS,Sparc,ARM,M68K等没有相应的硬件支持,还有一些支持得不够灵活(如Intel Pentium,Powerpc只支持以段为单位的可执行控制),而操作系统的支持必须考虑效率以及应用兼容性,因此现有的操作系统很少提供这种能力。已经有一些Linux厂商发行的Linux操作系统实现了堆栈不可执行保护,他们利用的是Intel Pentium处理器的段保护机制。但这些方案有下列缺点1、粒度是段,不够灵活;2、仅仅堆栈不可执行也不足以有效地解决问题,因为利用数据段存放攻击代码的例子也很常见;3、有一些应用兼容问题,因为有些应用需要在堆栈上执行临时代码,不能简单地禁止在堆栈上执行代码。因此标准的Linux内核并没有接受这些方案。
为实现上述目的,硬件支持的攻击防范方法包括步骤CPU在存储管理部件中提供硬件支持,控制某个地址是否可执行;操作系统提供一个设置可执行地址限制范围的系统调用接口,供应用程序控制自己的可执行地址范围;操作系统提供一个系统程序,给二进制程序直接提供可执行地址限制,避免修改源代码和重新编译。
本发明给出了一个结合CPU硬件支持和操作系统支持的解决方案。该方案中,CPU在存储管理部件(MMU)提供控制进程虚地址可执行权限的能力;操作系统利用这种能力,实现对进程可执行地址范围的控制;操作系统提供系统调用接口,供应用程序控制自己的可执行地址范围;操作系统还提供一个系统程序,它可以直接限制二进制程序运行时的可执行地址范围。其中,CPU提供存储页级的细粒度控制能力,操作系统实现任意地址范围的控制和灵活的接口,既增大了能够防范的攻击的范围,又较好地解决了应用兼容性问题。
发明的
具体实施例方式
本发明针对MIPS R4000兼容CPU(参见(1)SGI/MIPS.MIPS R4000Microprocessor User′s Mannual,1996.(2)Dominic Sweetman.See MIPSRun.Morgan Kaufmann Publishers Inc.1999.)和Linux操作系统做了具体实施,下面将详细描述。
CPU要执行某个指令,必须先从内存中取出该指令,因此,控制某个地址的可执行权限可以在取指时通过MMU部件实现。为了提供最大的灵活性,本发明提供了两种支持可执行权限控制的CPU硬件。
其一是一个段式的控制硬件。在MIPS CPU的控制寄存器组中增加两个控制寄存器ProtMask和ProtAddr,允许系统控制可以取指的虚拟地址范围。ProtMask指定取指时检查的地址位ProtMask的相应位为1表示取指时要对该位地址进行检查。ProtAddr给出要禁止取指的地址。在ProtMask作用下,当ProtAddr和取指地址相等时就发生取指地址错例外,禁止取指。具体地说,若FetchAddr为取指地址,当ProtMask!=0 &&(FetchAddr & ProtMask)==(ProtAddr & ProtMask)时发生取指地址错例外。
ProtMask初始化为0,表示对取指空间不做限制。在核心态下,可以通过MTC0指令对ProtMask和ProtAddr赋值。
下面以例子说明上述机制的作用。在32位系统中,ProtMask和ProtAddr都为32位。●若ProtMask=0xff000000,ProtAddr=0x7fffffff,则从2G往下的16MB空间禁止取指。●若ProtMask=0xff000000,ProtAddr=0xbfffffff,则从3G往下的16MB空间禁止取指。●若ProtMask=0xffff0000,ProtAddr=0x7fffffff,则从2G往下的64KB空间禁止取指。●若ProtMask=0xffff0000,ProtAddr=0xbfffffff,则从3G往下的64KB空间禁止取指。
可以看出,上述机制可以灵活指定系统所要保护的禁止取指执行的地址空间,而且只要进行简单的逻辑运算,硬件开销很小。由于虚地址合法性检查与访问TLB是并行进行的,上述方法也不会增加访存延迟。在UNIX操作系统中,只要利用上述方法对堆栈所在地址空间进行取指保护,就可以有效防范许多利用缓冲区溢出漏洞进行的非法攻击(如图1所示的攻击)。
上述利用两个控制寄存器实现的段式可执行属性控制非常简单,有利于硬件实现。但它有个缺点不能同时控制多个大的不连续地址空间,从而不能同时保护堆栈段和数据段。为此,本发明提供了页一级的可执行控制。在MIPS R4000兼容的CPU中,如图2所示,在TLB的表项中还有一些位尚未使用。本发明使用其中之一(图2中的E位)来控制正在翻译的虚拟地址所在页面的可执行属性。如果虚实地址翻译的结果E=0而且该访问为取指,则发生访存错,操作系统可以据此杀死当前进程。同时,为了方便和ProtAddr/ProtMask机制协同使用,在ProtMask=0时,E位不起效;ProtMask非0时,ProtAddr/ProtMask和E位任一机制指定某地址不可执行则该地址不可执行。
CPU的硬件安全机制要通过操作系统来体现。本发明通过Linux操作系统的内核和系统程序提供给应用程序提供了灵活的接口服务。
在Linux 2.4内核中,进程数据用结构struct task struct描述,它包括进程所有的状态信息,其中和CPU相关的进程数据保存在子结构structthread struct中。为了利用CPU的硬件支持实现每个进程独立的地址保护控制,本发明给thread struct新增加了三个数据成员,分别保存ProtAddr,ProtMask寄存器的值以及ProtMask的一个临时备份(用于临时禁止保护,见下文),并在创建进程和切换进程时增加相应的维护代码。为了保证不干扰某些利用堆栈或者数据段存放临时执行代码的合法程序,始祖进程的ProtAddr和ProtMask都被初始化为0,即不作任何限制。接着我们让子进程继承父进程的这几个域的值,这样,所有进程缺省都是不限制可执行地址的。进程切换时,内核从新进程的thread_struct中取出两个安全寄存器的值并设置到CPU中,由此实现每个进程都可以拥有独立的地址限制范围。
实际实现时有一点困难由于Linux内核在信号处理和浮点模拟过程中使用用户栈存放和执行系统动态生成的代码,在这两个地方必须临时防止该地址被限制为不可执行。为此,我们引入一个ProtMask的备份域,在内核向用户栈放上可执行代码时,它检查该地址是否在该进程的地址限制范围内,如果是则将ProtMask的值保存到备份域并把ProtMask清为0。这样,收到信号的进程(或者发生浮点例外的进程)恢复执行时,CPU的ProtMask将被设为0从而暂时禁止了地址限制。在信号处理完成(或者浮点模拟完成)时,内核将重新得到控制并(如果需要)恢复进程的地址限制。
MIPS CPU提供的页面可执行属性控制的支持则由标准的UNIX系统调用mprotect实现。在MIPS平台的linux2.4内核中,在页表项增加可执行控制位以及少量的维护代码即可。
上述内核代码的最终目的是向用户程序提供服务。对每个虚页面的控制可以通过mprotect实现。此外,本发明扩充了现存的sysmips系统调用接口来利用ProtAddr/ProtMask寄存器。Sysmips系统调用本身就是为了操纵一些MIPS CPU的特殊属性而设置的,是增加安全服务接口的非常恰当的地方。Sysmips系统调用的形式如下int sysmips(int cmd,int arg1,int arg2,int arg3)它第一个参数是说明使用sysmips调用的哪个命令,后面三个参数这是该命令的参数。本发明增加了MIPS_SET_PROTECTION命令,它带有两个参数,分别对应ProtMask和ProtAddr寄存器的值。
这样,应用程序可以直接调用mprotect和sysmips系统调用设置自己需要的地址限制。这个方法的优点是程序可以非常灵活地控制自己的可执行地址,缺点是需要改变程序的源代码,这有时不太方便甚至无法做到。为此本发明提供了一个简单的系统程序secrun为任何可执行程序提供所需要的地址限制。Secrun先根据用户参数设置本进程地址限制范围,然后用exec系统调用执行指定的程序。由于exec系统调用不改变进程的ProtMask和ProtAddr值,它们就自然地被继承到所执行程序中了。Secrun的使用方法是secrun要保护的程序ProtMask值ProtAddr值运行之后要保护的程序就拥有了由所给的ProtMask和ProtAddr提供的可执行地址限制。而secrun和sysmips系统调用只能由系统的超级用户运行,攻击者在侵入系统之前不可能利用它们解除系统所设置的保护。
通过上述的技术方案,本发明提供了对一大类攻击的有效防范方法。本发明除了适用于利用缓冲区溢出漏洞的攻击外,还适用于一切使用堆栈或者数据段存放攻击代码的攻击方法。例如,Redhat7.0(非常流行的Linux操作系统)的打印机服务程序包(LPng-3.6.24-2.i386.rpm)存在一个漏洞,攻击者可以使用格式化字符串攻击远程获得根用户权限(参见Redhat公司的Security Advisory链接http//www.redhat.com/support/errata/RHSA-2000-065-06.html),虽然攻击过程和缓冲区溢出攻击很不一样,但攻击代码仍然是放在堆栈中的缓冲区中。因此在实施本方案后的Linux/MIPS系统上,只要利用系统提供的接口使目标程序的堆栈不可执行,这种攻击就失效了,甚至不用修改有漏洞的系统服务程序。
和现有的各种方案相比,本发明具有代价小,实现灵活,可行性高的优点。硬件上只增加了两个寄存器和一点简单逻辑,而且这些逻辑和其它原有逻辑并行因而并不增加电路的延迟。在软件上,通过操作系统的比较简单的增强,就能够做到不修改源程序而直接给应用程序提供安全防护能力。相比之下,要求消除系统程序的漏洞或者修改编译器重新编译的工作量和代价大得多,而可行性小得多。
权利要求
1.一种CPU硬件支持的系统攻击防范方法,其特征在于包括步骤CPU在存储管理部件中提供硬件支持,控制某个地址是否可执行;操作系统提供一个设置可执行地址限制范围的系统调用接口,供应用程序控制自己的可执行地址范围;操作系统提供一个系统程序,给二进制程序直接提供可执行地址限制,避免修改源代码和重新编译。
2.按权利要求1所述的方法,其特征在于所述的硬件支持包括在CPU的控制寄存器组中增加两个控制寄存器。
3.按权利要求1所述的方法,其特征在于还包括在TLB表项中增加可执行控制位,控制每个虚页的可执行权限。
4.按权利要求2或3所述的方法,其特征在于两个控制寄存器或者页表中记录可执行的地址范围。
5.按权利要求2或3所述的方法,其特征在于所述的两个控制寄存器和TLB表项的控制位协同使用。
6.按权利要求1所述的方法,其特征在于系统调用,应用程序可以直接在源程序中控制可执行地址范围;系统程序,操作系统可以给现有的二进制可执行程序直接提供可执行地址限制。
全文摘要
一种硬件支持的攻击防范方法,包括步骤CPU在存储管理部件中提供硬件支持,控制某个地址是否可执行;操作系统提供一个设置可执行地址限制范围的系统调用接口,供应用程序控制自己的可执行地址范围;操作系统提供一个系统程序,给二进制程序直接提供可执行地址限制,避免修改源代码和重新编译。在本发明中,CPU在存储管理部件提供控制进程虚地址可执行权限的能力;操作系统利用这种能力,实现对进程可执行地址范围的控制;操作系统提供系统调用接口,供应用程序控制自己的可执行地址范围;操作系统还提供一个系统程序,它可以直接限制二进制程序运行时的可执行地址范围。既增大了能够防范的攻击的范围,又较好地解决了应用兼容性问题。
文档编号G06F12/14GK1420441SQ0113504
公开日2003年5月28日 申请日期2001年11月16日 优先权日2001年11月16日
发明者胡伟武, 张福新, 李丙辰, 唐志敏 申请人:中国科学院计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1