本发明专利技术不依赖于CPU具有的功能,即可容易且可靠地防止与缓冲器溢出有关的不正当访问。信息设备(1)通过在存储器中展开的各个程序代码与中央控制部之间的协作来进行数据处理,通过挂钩处理来检测程序代码的调用时刻,通过堆栈布局检查处理,依次取得在RAM(30)中展开的各个程序代码的返回地址,根据该取得的返回地址所表示的目的地的地址来检测不正当访问,在检测到不正当访问的情况下停止数据处理。
【技术实现步骤摘要】
【国外来华专利技术】
本专利技术涉及信息设备、程序、防止执行不正当程序代码的方法、及计算机能够读取的记录介质。
技术介绍
通常,在PC (Personal Computer 个人计算机)或 WS (Work Mation 工作站) 等信息设备中,CPU (Central Processing Unit 中央处理单元)等控制部依次执行在 RAM (Random Access Memory 随机存取存储器)等存储部的工作区域中展开的程序代码,由此执行各种数据处理。近年来,由于由具有恶意的用户制作的程序代码引起的不正当处理, 产生对信息设备的不正当访问。通常,对信息设备所管理的数据设定访问权限。因此,如果没有对数据的访问权限,就不能进行不正当访问。但是,在利用具有对数据的访问权限的通常的程序代码而执行了不正当操作的情况下,将能够进行不正当访问。关于这种方法,已被公知的方法是采用所谓缓冲器溢出(buffer overflow)的方法,即,使执行程序代码时的数据从在RAM等中确保的规定区域中溢出。在此,关于采用缓冲器溢出的不正当访问,通过对比来详细说明正常执行了程序代码的情况和在执行程序代码时不正当地执行的情况。首先,参照图9、图10说明正常执行程序代码的情况。图9表示对程序代码的源代码进行例示的示意图。图9所示的程序代码从main () 函数开始,在mainO函数中调用strcpyjielIoworld()函数。在该程序代码中,在strcpy_ helloworldO函数中准备字符串“Hello ! ”,利用mainO函数的printf()函数使该字符串显示于监视器等中。另外,函数是指将规定的功能模块化而形成的子循环(subroutine)、 子程序等,能够在为主的程序内随时调用。在执行图9所示的程序代码时的数据被存储于在RAM等中确保的堆栈区域中。在该堆栈区域中,按照后入先出(LIF0:Last In First Out)构造来存储数据。图10表示对执行程序代码时的堆栈区域的概况进行例示的示意图。如图10所示, 从上到下向依次确保的区域中存储执行程序代码时的数据。例如,在执行基于图9例示的源代码的程序代码时,在处理了 mainO函数时, ReturnAddressUebp backup>char buf等被存储为一个堆栈帧(stack frame)。然后, 当在 mainO 函数中调用了 strcpy_helIoworld()函数时,ReturnAddress2、ebp backup2、 int i等被存储为一个堆栈帧。ReturnAddress (返回地址)表示在程序结束时应该返回的地址值、及在子程序被函数等调用的情况下该子程序结束时应该返回的地址值。该ReturnAddress在刚刚执行程序后及子程序刚刚被函数等调用后,通过CPU被自动存储在堆栈区域中。ebp是CPU的寄存器的一种,表示当前使用的临时性存储器区域的地址的紧前面4(紧挨着且位于其前面)。在图10的示例中,是char buf、int i的前面的地址,是堆栈帧的ReturnAddress。因此,在堆栈帧中,通过将上述寄存器值备份(backup)为ebp backup, 能够容易地将该堆栈帧内的一个区域用作存储临时性数据(变量、数组等)的存储器区域。char buf 存储作为在mainO函数中使用的数组的buf。该buf是存储8个char 型变量(1字节)的数组,能够存储8字节的数据。int i存储作为在StrCpy_hellOWOrld() 函数中使用的int型变量的i。因此,通过执行上述程序代码,在堆栈区域中,确保mainO函数的堆栈帧,并确保StrCpy_hellOWOrld()函数的堆栈帧。然后,int i的值顺序递增,6字节量的字符串“Hello ! ”被存储在char buf 中。然后,根据strcpyjielloworld()函数的结束, ReturnAddress2被读出,并向main()函数返回,根据main()函数的结束,ReturnAddressl 被读出,程序正常结束。下面,参照图11、图12说明在执行程序代码时不正当执行的情况。图11表示对程序代码的源代码进行例示的示意图。图11所示的程序代码与图9 所示的程序代码的不同之处在于,向数组buf中写入12字节量(11字符+字符串末尾)的数据 “Hello World,,。图12表示对在执行程序代码时的堆栈区域的概况进行例示的示意图。如图12所示,在堆栈区域中,确保8字节量的区域作为存储数组buf的区域。因此,在执行strCpy_ helloworldO函数时,写入了所确保的大小以上的数据。这样,如果在存储器中写入了所确保的大小以上的数据,则产生缓冲器溢出。另外,将在堆栈区域中产生这种缓冲器溢出的情况称为基于堆栈的缓冲器溢出。在图12所示的堆栈区域中,从上到下顺序地确保区域,而在向该确保的区域中写入数据时是从下到上来进行的。因此,在执行了 strcpyjielIoworldO函数时, ReturnAddress 1、ebp backup 被 12 字节的数据"Hello World”不正当地覆盖(overwrite)。 由于上述覆盖,ReturnAddressl的内容被改写为能够执行的程序代码所在的地址的情况下,根据mainO函数的结束,ReturnAddressl被读出,并执行在该被改写后的地址中存储的程序代码。在图11所示的源代码中,由于预先定义的字符串“Hello World”而导致缓冲器溢出。但是,实际上也存在如下情况,即通过邮件服务器、Web服务器等的通信端口而接收到的数据、或者从控制台(console)及文件输入的数据等,被存储在数组buf中。在这种情况下,具有恶意的用户通过通信、控制台输入、文件输入等而执行任意的程序代码,致使产生数据的被盗、篡改等不正当访问。作为检测这些不正当访问的方法,可以考虑下述方法,即检查在堆栈区域中存储的返回地址,并比较正常执行程序时和攻击代码动作时的返回地址的配置模式(pattern) 的差异,由此检测是否执行不正当访问。例如,返回地址所表示的目的地的存储器属性是支持用于配置程序代码的存储器区域的情况下、或者该存储器区域是不能写入的属性的情况下,判定为正常的程序。但是,在这种不正当访问的检测方法中,存在不能检测Return-to-libc攻击(参照非专利文献1)的可能性。Return-to-libc攻击是指这样的攻击方法,S卩不向程序代码追加写入具有恶意的代码,通过调用已经在计算机中存储的函数来进行不正当访问。图13表示对在执行图11所示的程序代码时受到Return-to-libc攻击时的堆栈区域的概况进行例示的示意图。如图13所示,在Return-to-libc攻击中,以上说明的返回地址所表示的值即ReturnAddressl的内容被设定为OS (Operating System:操作系统)的标准函数等正常函数的开头地址。堆栈区域上的返回地址表示用于放置程序代码的存储器区域、或者该存储器区域是不能写入的属性的情况下,存在不能与正常程序进行区分的可能性。还可以考虑这样的攻击,即应用该Return-to-libc攻击,将已经存储在信息本文档来自技高网...
【技术保护点】
【技术特征摘要】
【国外来华专利技术】...
【专利技术属性】
技术研发人员:石山智祥,
申请(专利权)人:株式会社一四四零技术研究所,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。