專利名稱:信息設(shè)備、程序、防止執(zhí)行不正當(dāng)程序代碼的方法、及計算機能夠讀取的記錄介質(zhì)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及信息設(shè)備、程序、防止執(zhí)行不正當(dāng)程序代碼的方法、及計算機能夠讀取的記錄介質(zhì)。
背景技術(shù):
通常,在PC (Personal Computer 個人計算機)或 WS (Work Mation 工作站) 等信息設(shè)備中,CPU (Central Processing Unit 中央處理單元)等控制部依次執(zhí)行在 RAM (Random Access Memory 隨機存取存儲器)等存儲部的工作區(qū)域中展開的程序代碼,由此執(zhí)行各種數(shù)據(jù)處理。近年來,由于由具有惡意的用戶制作的程序代碼引起的不正當(dāng)處理, 產(chǎn)生對信息設(shè)備的不正當(dāng)訪問。通常,對信息設(shè)備所管理的數(shù)據(jù)設(shè)定訪問權(quán)限。因此,如果沒有對數(shù)據(jù)的訪問權(quán)限,就不能進行不正當(dāng)訪問。但是,在利用具有對數(shù)據(jù)的訪問權(quán)限的通常的程序代碼而執(zhí)行了不正當(dāng)操作的情況下,將能夠進行不正當(dāng)訪問。關(guān)于這種方法,已被公知的方法是采用所謂緩沖器溢出(buffer overflow)的方法,即,使執(zhí)行程序代碼時的數(shù)據(jù)從在RAM等中確保的規(guī)定區(qū)域中溢出。在此,關(guān)于采用緩沖器溢出的不正當(dāng)訪問,通過對比來詳細說明正常執(zhí)行了程序代碼的情況和在執(zhí)行程序代碼時不正當(dāng)?shù)貓?zhí)行的情況。首先,參照圖9、圖10說明正常執(zhí)行程序代碼的情況。圖9表示對程序代碼的源代碼進行例示的示意圖。圖9所示的程序代碼從main () 函數(shù)開始,在mainO函數(shù)中調(diào)用strcpyjielIoworld()函數(shù)。在該程序代碼中,在strcpy_ helloworldO函數(shù)中準(zhǔn)備字符串“Hello ! ”,利用mainO函數(shù)的printf()函數(shù)使該字符串顯示于監(jiān)視器等中。另外,函數(shù)是指將規(guī)定的功能模塊化而形成的子循環(huán)(subroutine)、 子程序等,能夠在為主的程序內(nèi)隨時調(diào)用。在執(zhí)行圖9所示的程序代碼時的數(shù)據(jù)被存儲于在RAM等中確保的堆棧區(qū)域中。在該堆棧區(qū)域中,按照后入先出(LIF0:Last In First Out)構(gòu)造來存儲數(shù)據(jù)。圖10表示對執(zhí)行程序代碼時的堆棧區(qū)域的概況進行例示的示意圖。如圖10所示, 從上到下向依次確保的區(qū)域中存儲執(zhí)行程序代碼時的數(shù)據(jù)。例如,在執(zhí)行基于圖9例示的源代碼的程序代碼時,在處理了 mainO函數(shù)時, ReturnAddressUebp backup>char buf[8]等被存儲為一個堆棧幀(stack frame)。然后, 當(dāng)在 mainO 函數(shù)中調(diào)用了 strcpy_helIoworld()函數(shù)時,ReturnAddress2、ebp backup2、 int i等被存儲為一個堆棧幀。ReturnAddress (返回地址)表示在程序結(jié)束時應(yīng)該返回的地址值、及在子程序被函數(shù)等調(diào)用的情況下該子程序結(jié)束時應(yīng)該返回的地址值。該ReturnAddress在剛剛執(zhí)行程序后及子程序剛剛被函數(shù)等調(diào)用后,通過CPU被自動存儲在堆棧區(qū)域中。ebp是CPU的寄存器的一種,表示當(dāng)前使用的臨時性存儲器區(qū)域的地址的緊前面
4(緊挨著且位于其前面)。在圖10的示例中,是char buf[8]、int i的前面的地址,是堆棧幀的ReturnAddress。因此,在堆棧幀中,通過將上述寄存器值備份(backup)為ebp backup, 能夠容易地將該堆棧幀內(nèi)的一個區(qū)域用作存儲臨時性數(shù)據(jù)(變量、數(shù)組等)的存儲器區(qū)域。char buf [8]存儲作為在mainO函數(shù)中使用的數(shù)組的buf。該buf是存儲8個char 型變量(1字節(jié))的數(shù)組,能夠存儲8字節(jié)的數(shù)據(jù)。int i存儲作為在StrCpy_hellOWOrld() 函數(shù)中使用的int型變量的i。因此,通過執(zhí)行上述程序代碼,在堆棧區(qū)域中,確保mainO函數(shù)的堆棧幀,并確保StrCpy_hellOWOrld()函數(shù)的堆棧幀。然后,int i的值順序遞增,6字節(jié)量的字符串“Hello ! ”被存儲在char buf [8]中。然后,根據(jù)strcpyjielloworld()函數(shù)的結(jié)束, ReturnAddress2被讀出,并向main()函數(shù)返回,根據(jù)main()函數(shù)的結(jié)束,ReturnAddressl 被讀出,程序正常結(jié)束。下面,參照圖11、圖12說明在執(zhí)行程序代碼時不正當(dāng)執(zhí)行的情況。圖11表示對程序代碼的源代碼進行例示的示意圖。圖11所示的程序代碼與圖9 所示的程序代碼的不同之處在于,向數(shù)組buf中寫入12字節(jié)量(11字符+字符串末尾)的數(shù)據(jù) “Hello World,,。圖12表示對在執(zhí)行程序代碼時的堆棧區(qū)域的概況進行例示的示意圖。如圖12所示,在堆棧區(qū)域中,確保8字節(jié)量的區(qū)域作為存儲數(shù)組buf的區(qū)域。因此,在執(zhí)行strCpy_ helloworldO函數(shù)時,寫入了所確保的大小以上的數(shù)據(jù)。這樣,如果在存儲器中寫入了所確保的大小以上的數(shù)據(jù),則產(chǎn)生緩沖器溢出。另外,將在堆棧區(qū)域中產(chǎn)生這種緩沖器溢出的情況稱為基于堆棧的緩沖器溢出。在圖12所示的堆棧區(qū)域中,從上到下順序地確保區(qū)域,而在向該確保的區(qū)域中寫入數(shù)據(jù)時是從下到上來進行的。因此,在執(zhí)行了 strcpyjielIoworldO函數(shù)時, ReturnAddress 1、ebp backup 被 12 字節(jié)的數(shù)據(jù)"Hello World”不正當(dāng)?shù)馗采w(overwrite)。 由于上述覆蓋,ReturnAddressl的內(nèi)容被改寫為能夠執(zhí)行的程序代碼所在的地址的情況下,根據(jù)mainO函數(shù)的結(jié)束,ReturnAddressl被讀出,并執(zhí)行在該被改寫后的地址中存儲的程序代碼。在圖11所示的源代碼中,由于預(yù)先定義的字符串“Hello World”而導(dǎo)致緩沖器溢出。但是,實際上也存在如下情況,即通過郵件服務(wù)器、Web服務(wù)器等的通信端口而接收到的數(shù)據(jù)、或者從控制臺(console)及文件輸入的數(shù)據(jù)等,被存儲在數(shù)組buf中。在這種情況下,具有惡意的用戶通過通信、控制臺輸入、文件輸入等而執(zhí)行任意的程序代碼,致使產(chǎn)生數(shù)據(jù)的被盜、篡改等不正當(dāng)訪問。作為檢測這些不正當(dāng)訪問的方法,可以考慮下述方法,即檢查在堆棧區(qū)域中存儲的返回地址,并比較正常執(zhí)行程序時和攻擊代碼動作時的返回地址的配置模式(pattern) 的差異,由此檢測是否執(zhí)行不正當(dāng)訪問。例如,返回地址所表示的目的地的存儲器屬性是支持用于配置程序代碼的存儲器區(qū)域的情況下、或者該存儲器區(qū)域是不能寫入的屬性的情況下,判定為正常的程序。但是,在這種不正當(dāng)訪問的檢測方法中,存在不能檢測Return-to-libc攻擊(參照非專利文獻1)的可能性。Return-to-libc攻擊是指這樣的攻擊方法,S卩不向程序代碼追加寫入具有惡意的代碼,通過調(diào)用已經(jīng)在計算機中存儲的函數(shù)來進行不正當(dāng)訪問。
圖13表示對在執(zhí)行圖11所示的程序代碼時受到Return-to-libc攻擊時的堆棧區(qū)域的概況進行例示的示意圖。如圖13所示,在Return-to-libc攻擊中,以上說明的返回地址所表示的值即ReturnAddressl的內(nèi)容被設(shè)定為OS (Operating System:操作系統(tǒng))的標(biāo)準(zhǔn)函數(shù)等正常函數(shù)的開頭地址。堆棧區(qū)域上的返回地址表示用于放置程序代碼的存儲器區(qū)域、或者該存儲器區(qū)域是不能寫入的屬性的情況下,存在不能與正常程序進行區(qū)分的可能性。還可以考慮這樣的攻擊,即應(yīng)用該Return-to-libc攻擊,將已經(jīng)存儲在信息設(shè)備的存儲部中的程序的程序代碼進行組合,由此執(zhí)行規(guī)定的程序代碼。在這種攻擊方法中, 堆棧區(qū)域上的返回地址具有與Return-to-libc攻擊相同的特征,因而也存在不能與正常程序進行區(qū)分的可能性。專利文獻1公開了一種技術(shù),S卩使用CPU的功能之一即分支跟蹤(branch trace),從正在執(zhí)行中的函數(shù)返回到調(diào)用源的函數(shù)的處理時,對返回到OS的標(biāo)準(zhǔn)函數(shù)的開頭地址這種行動進行檢測,由此檢測Return-to-libc攻擊?,F(xiàn)有技術(shù)文獻專利文獻專利文獻1 美國專利第10/763867號說明書非專利文獻非專利文獻1 :“Return-to-libc attack,,、[online]、λ ^ ^ r λ 7 財団、 [2009 年3月 23 日檢索]、4 >夕一才、7 卜、(URL :http://en. wikipedia. org/wiki/ Return-to-1ibc_attack)
發(fā)明概要發(fā)明要解決的問題但是,在專利文獻1記載的技術(shù)中,雖然能夠使用分支跟蹤功能來檢測 Return-to-libc攻擊,但是由于使用CPU具有的功能,因而存在CPU的處理負荷的增大、對除使用分支跟蹤功能之外的其它應(yīng)用(性能計測工具等)的使用產(chǎn)生限制等的可能性。即, 在執(zhí)行用于檢測Return-to-libc攻擊的處理的期間,計算機的處理負荷增大,有可能導(dǎo)致可用性的降低。
發(fā)明內(nèi)容
本發(fā)明的課題就是鑒于上述現(xiàn)有技術(shù)的問題而提出的,本發(fā)明提供一種技術(shù),不依據(jù)CPU具有的功能,即可容易且可靠地防止與緩沖器溢出有關(guān)的不正當(dāng)訪問。用于解決問題的手段為了解決上述問題,技術(shù)方案1記載的發(fā)明是一種通過在存儲器中展開的各個程序代碼與中央控制部之間的協(xié)作來進行數(shù)據(jù)處理的信息設(shè)備,具有檢測單元,檢測所述任意一個程序代碼的調(diào)用時刻;返回地址取得單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,依次取得在所述存儲器中展開的各個程序代碼的返回地址;以及停止單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,根據(jù)由所述返回地址取得單元依次取得的返回地址所表示的目的地的地址來檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。
技術(shù)方案2記載的發(fā)明是根據(jù)權(quán)利要求1記載的發(fā)明,所述存儲器具有存儲各個程序代碼的返回地址的堆棧區(qū)域,所述返回地址取得單元跟蹤(trace)并取得在所述堆棧區(qū)域中存儲的返回地址。技術(shù)方案3記載的發(fā)明是根據(jù)權(quán)利要求1或2記載的發(fā)明,在由所述屬性取得單元取得的各個返回地址所表示的目的地的地址是函數(shù)的開始地址的情況下,所述停止單元檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。技術(shù)方案4記載的發(fā)明是根據(jù)權(quán)利要求1 3中任意一項記載的發(fā)明,在與由所述屬性取得單元取得的各個返回地址所表示的目的地的地址相對應(yīng)的前一個命令不是調(diào)用命令的情況下,所述停止單元檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。技術(shù)方案5記載的發(fā)明使執(zhí)行在存儲器中展開的各個程序代碼的計算機作為以下單元發(fā)揮作用檢測單元,檢測所述任意一個程序代碼的調(diào)用時刻;返回地址取得單元, 在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,依次取得在所述存儲器中展開的各個程序代碼的返回地址;以及停止單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,根據(jù)由所述返回地址取得單元依次取得的返回地址所表示的目的地的地址來檢測不正當(dāng)訪問, 在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。技術(shù)方案6記載的發(fā)明是一種防止計算機執(zhí)行不正當(dāng)程序代碼的方法,該計算機執(zhí)行在存儲器中展開的各個程序代碼,該方法中,檢測所述任意一個程序代碼的調(diào)用時刻, 在該檢測到的程序代碼的調(diào)用時刻,依次取得在所述存儲器中展開的各個程序代碼的返回地址,根據(jù)該取得的各個返回地址所表示的目的地的地址來檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。技術(shù)方案7記載的發(fā)明是一種存儲程序的計算機可讀取的記錄介質(zhì),該程序用于使執(zhí)行在存儲器中展開的各個程序代碼的計算機作為以下單元發(fā)揮作用檢測單元,檢測所述任意一個程序代碼的調(diào)用時刻;返回地址取得單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,依次取得在所述存儲器中展開的各個程序代碼的返回地址;以及停止單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,根據(jù)由所述返回地址取得單元依次取得的返回地址所表示的目的地的地址來檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。發(fā)明效果根據(jù)本發(fā)明,不依賴于CPU具有的功能,即可容易且可靠地防止與緩沖器溢出有關(guān)的不正當(dāng)訪問。
圖1是示意地表示本實施方式的信息設(shè)備的功能結(jié)構(gòu)的框圖。圖2A是表示當(dāng)執(zhí)行Return-to-libc攻擊時在RAM30的規(guī)定區(qū)域中確保的堆棧區(qū)域的一例的圖。圖2B是表示在采用了 Return-to-libc攻擊的應(yīng)用方法的攻擊的情況下、在RAM30 的規(guī)定區(qū)域中確保的堆棧區(qū)域的一例的圖。圖3是表示信息設(shè)備的掛鉤處理的流程圖。
圖4是表示在信息設(shè)備中執(zhí)行的堆棧布局檢查處理的安裝例的流程圖。圖5是表示返回地址是函數(shù)的開始地址附近的情況下的代碼的一例的示意圖。圖6是表示返回地址被設(shè)定為與函數(shù)的開始地址完全不同的程序代碼的地址來執(zhí)行該程序的情況下的代碼的一例的示意圖。圖7是表示在Return-to-libc攻擊中正在執(zhí)行CreateFile時的堆棧的內(nèi)容的圖。圖8是表示在Return-to-libc攻擊中正在執(zhí)行URLDownloacTTofile時的堆棧的內(nèi)容的圖。圖9是對程序代碼的源代碼進行例示的示意圖。圖10是對在執(zhí)行程序代碼時的堆棧區(qū)域的概況進行例示的示意圖。圖11是對程序代碼的源代碼進行例示的示意圖。圖12是對在執(zhí)行程序代碼時的堆棧區(qū)域的概況進行例示的示意圖。圖13是對在Return-to-libc攻擊中執(zhí)行程序代碼時的堆棧區(qū)域的概況進行例示的示意圖。
具體實施例方式下面,參照附圖來說明本發(fā)明的實施方式,但本發(fā)明的范圍不局限于下面的實施方式。首先,對本實施方式的信息設(shè)備的結(jié)構(gòu)進行說明。圖1示意地表示信息設(shè)備1的功能性結(jié)構(gòu)。如圖1所示,信息設(shè)備1具有CPU 10、 存儲部20、RAM 30、操作部40、顯示部50、I/F部60。上述信息設(shè)備1的各個部分通過總線 70而電連接。具體地講,信息設(shè)備1是PC、WS、PDA (Personal Digital Assistant :個人數(shù)字助理)、手機等。CPU 10對信息設(shè)備1的動作進行中央控制。CPU 10將在存儲部20中存儲的程序代碼及各種數(shù)據(jù)展開到RAM 30的工作區(qū)域中,通過與在RAM 30中展開的數(shù)據(jù)的協(xié)作,向各個部分輸出控制信號。存儲部20以能夠由CPU 10進行讀寫的方式存儲程序代碼及各種設(shè)定信息等數(shù)據(jù)。例如,存儲部20是HDD (Hard Disk Drive 硬盤驅(qū)動器)、半導(dǎo)體存儲器等。并且,存儲部20也可以構(gòu)成為,將上述數(shù)據(jù)存儲在ROM (Read Only Memory :只讀存儲器)等中。另外, 作為存儲部20存儲的程序代碼,除OS (Operating System)等基本軟件之外,還包括供應(yīng)商提供的各種應(yīng)用程序、與后述的處理相關(guān)的程序等。在RAM 30中確保用于對執(zhí)行程序代碼時的數(shù)據(jù)進行存儲的堆棧區(qū)域。圖2A表示在執(zhí)行Return-to-libc攻擊的情況下、RAM 30的堆棧區(qū)域中的某個堆棧幀的一例。如圖2A所示,在堆棧區(qū)域中,存儲有Exitprocess的自變量、ReturnAddress、 WinExec 的自變量 2 和 1、ExitProcess 的開始地址、ebp backup 等數(shù)據(jù)。在 Return-to-libc 攻擊中,作為執(zhí)行WinExecO后的返回地址,有時設(shè)定Exitfrocess ()的開始地址。圖2A 示出的示例表示,在進行Return-to-libc攻擊、并且正在執(zhí)行WinExecO時的堆棧區(qū)域。Exitprocess ()是用于使程序結(jié)束的函數(shù),對自變量設(shè)定應(yīng)結(jié)束的程序的結(jié)束代碼。WinExecO是用于執(zhí)行所指定的程序的函數(shù)。在ebp backup的緊前面具有ReturnAddress,因而通過追溯(迪3 )ebp backup,能夠依次跟蹤并取得ReturnAddress。在依次執(zhí)行各個程序代碼的情況下,隨著該程序代碼的執(zhí)行來依次確保堆棧區(qū)域中所包含的堆棧幀。例如,在執(zhí)行為主的程序代碼、在該程序代碼內(nèi)調(diào)用與子循環(huán)相關(guān)的程序代碼、并且調(diào)用其它程序代碼的情況下等,按照堆棧幀的各個順序來確保與各個程序代碼相關(guān)的區(qū)域。在與該各個程序代碼相關(guān)的處理結(jié)束時,堆棧幀的ReturnAddress被讀出, 由此進行向為主的程序代碼的返回及程序結(jié)束后的處理。圖2B表示前述Return-to-libc攻擊的應(yīng)用方法中的在RAM30的規(guī)定區(qū)域中確保的堆棧區(qū)域的堆棧幀的一例。在“已有的程序代碼”的區(qū)域中,存儲有用于調(diào)用已有的程序代碼內(nèi)的ExitProcess的代碼。操作部40受理來自用戶的操作輸入,向CPUlO輸出與該操作相應(yīng)的操作信號。例如,操作部40是具有字符輸入鍵、數(shù)字輸入鍵、與其它各種功能對應(yīng)的鍵的鍵盤、鼠標(biāo)等指示(pointing)裝置等。顯示部50在顯示畫面上顯示基于從CPU 10輸出的顯示控制信號的圖像。例如, 顯示部 50 可以是 CRT (Cathode Ray Tube 陰極射線管)、LCD (Liquid Crystal Display 液晶顯示器)等。I/F部60具有數(shù)據(jù)通信用ICantegrated Circuit 集成電路)及連接用連接器等(均未圖示),與外部設(shè)備和通信網(wǎng)絡(luò)進行連接并能與它們通信。例如,I/F部60可以是 USB (Universal Serial Bus 通用串行總線)通信端口、或與 LAN (Local Area Network 局域網(wǎng))、WAN(Wide Area Network 廣域網(wǎng))、因特網(wǎng)等連接的網(wǎng)絡(luò)接口卡(NIC :Network Interface Card)。下面,說明信息設(shè)備1檢測不正當(dāng)?shù)某绦虼a的執(zhí)行時的動作。在信息設(shè)備1中, 為了防止執(zhí)行不正當(dāng)?shù)某绦虼a,需要插入如下處理,即檢測執(zhí)行不正當(dāng)?shù)某绦虼a所需要的API、庫函數(shù)、系統(tǒng)調(diào)用等,檢查有無執(zhí)行不正當(dāng)?shù)某绦虼a。在本實施方式的信息設(shè)備 1中,采用掛鉤(Hook)來實現(xiàn)如下處理的插入,該處理即對調(diào)用規(guī)定庫函數(shù)的具有惡意的代碼進行檢測和對不正當(dāng)進行檢查。掛鉤用于使利用者能夠向程序中的特定部位追加獨自的處理。即,被用于下述情況,即制作了被掛鉤側(cè)的程序代碼的編程員和制作了掛鉤側(cè)的程序代碼的編程員不是同一編程員、與相互的程序代碼相關(guān)的源代碼不由同一編程員制作的情況。因此,被用于供應(yīng)商提供的OS及函數(shù)的功能變更、或追加任意的處理時。另外,掛鉤也可以用于編程員自身能夠修正作為檢查對象的函數(shù)等的子程序的情況。但是,在編程員自身能夠修正子程序、并且修正為使得在執(zhí)行該子程序時進行對不正當(dāng)?shù)臋z查的情況下,不需要使用掛鉤,并且能夠?qū)⒁延械暮瘮?shù)及庫安裝為更安全的狀態(tài)。首先,關(guān)于進行API掛鉤(掛鉤庫函數(shù))并檢查有無執(zhí)行不正當(dāng)?shù)某绦虼a的情況,參照圖3進行說明。下面,例示供應(yīng)商準(zhǔn)備的WinExec ()這種庫函數(shù)的掛鉤處理(圖3),并例示在該庫函數(shù)被調(diào)用時執(zhí)行的堆棧布局檢查處理(圖4)。另外,同樣適用于其它庫函數(shù)(例如 ExitProcess ()等)的掛鉤處理。圖3表示在信息設(shè)備1中執(zhí)行的掛鉤處理的流程圖。通過CPU 10與在存儲部20 中存儲的程序之間的協(xié)作來執(zhí)行掛鉤處理。
如圖3所示,首先取得WinExecO函數(shù)的開始地址(步驟Si)。該函數(shù)的地址取得能夠通過調(diào)用由供應(yīng)商提供的函數(shù)來實現(xiàn)。然后,動態(tài)地生成對API的執(zhí)行進行掛鉤的較小函數(shù)(暫時性函數(shù))(步驟S2)。 該動態(tài)地生成的函數(shù)是指后面敘述的調(diào)用堆棧布局檢查處理的函數(shù)。然后,進行WinExecO的開頭代碼的改寫,進行變更以使得執(zhí)行在步驟S2生成的函數(shù)(步驟S3)。在信息設(shè)備1中,通過上述的掛鉤處理,能夠插入檢測子程序代碼的調(diào)用并進行對不正當(dāng)?shù)臋z查的處理。通常,在與函數(shù)相關(guān)的子程序被調(diào)用的情況下,直接執(zhí)行被某個函數(shù)調(diào)用的函數(shù)。但是,在信息設(shè)備1中,通過在子程序代碼被調(diào)用之前進行上述的掛鉤處理,能夠在子程序代碼調(diào)用時使得執(zhí)行堆棧布局檢查處理。圖4表示在信息設(shè)備1中執(zhí)行的堆棧布局檢查處理的流程圖。CPU 10與在存儲部 20中存儲的程序進行協(xié)作,從而利用通過掛鉤處理而動態(tài)生成的函數(shù)來調(diào)用堆棧布局檢查處理。另外,在該堆棧布局檢查處理中,使用MackWalkO函數(shù)進行堆棧跟蹤,但是也能夠不使用MackWalkO來進行堆棧跟蹤。如圖4所示,進行MackWalkO庫的初始化(步驟Sll)。MackWalkO庫是由供應(yīng)商準(zhǔn)備的進行堆棧跟蹤的函數(shù)。通過利用該MackWalkO使跟蹤位置增加或減少,能夠依次取得在堆棧區(qū)域中存儲的返回地址。然后,回溯跟蹤(back trace) 一個堆棧(步驟Si》,以便調(diào)用MackWalkO并順序調(diào)用堆棧區(qū)域的堆棧幀,在進行跟蹤后判定是否正確取得了返回地址(步驟S13)。在步驟S13,在沒有判斷為正確取得了返回地址的情況下(步驟S13 否),作為正常結(jié)束而繼續(xù)執(zhí)行作為檢查對象的WinExecO。這相當(dāng)于堆棧由于不正當(dāng)訪問以外的未知原因等而被破壞、MackWalkO不正常動作的情況等。另外,在本實施方式中,在 StackffalkO不正常動作的情況下正常結(jié)束,但也可以是,在該堆棧跟蹤失敗的情況下,也在顯示部50顯示用于程序停止、使用戶確認(rèn)是否停止的對話(dialogue)。另一方面,在判斷為正確取得了返回地址的情況下(步驟S13 是),判定該返回地址是否是函數(shù)的開始地址(步驟S14)。函數(shù)的開始地址可以利用公知的各種取得方法來取得,例如,可以參照預(yù)先在存儲部20中存儲的值來取得,還可以參照用于存儲所輸入的函數(shù)的實際存儲器地址的作為數(shù)組的IAT(Imp0rt Address Table)來取得。在沒有判斷為是開始地址的情況下(步驟S14 否),判斷返回地址的前一個命令是否是CALL命令(步驟SB)。CALL命令是用于調(diào)用子循環(huán)的命令,在步驟S15中,判斷返回地址所指示的目的地的前一個命令。在判斷為是CALL命令的情況下(步驟S15 是),判斷是否存在未檢查的返回地址 (步驟S16)。在判斷為存在未檢查的返回地址的情況下(步驟S16 是),返回步驟S12,跟蹤下一個返回地址。在沒有判斷為存在未檢查的返回地址的情況下(步驟S16 否),作為正常結(jié)束而執(zhí)行作為檢查對象的WinExec ()。另一方面,在判斷為是開始地址的情況下(步驟S14 是),在判斷為不是CALL命令的情況下(步驟S15 否),在顯示部50顯示使數(shù)據(jù)處理暫時停止的對話,以便檢測不
10正當(dāng)訪問等的攻擊并防止執(zhí)行不正當(dāng)?shù)某绦虼a(步驟S17),程序的執(zhí)行被停止(步驟 S18)。在以上說明的堆棧布局檢查處理中,在步驟S14和步驟S15中,檢測 Return-to-libc攻擊。在被進行了 Return-to-libc攻擊時,具有返回地址所指示的目的地是函數(shù)的開始地址的特征。在通常程序的情況下,返回地址所指示的目的地不是函數(shù)的開始地址,而是接著該函數(shù)開始繼續(xù)處理。并且,在作為Return-to-libc攻擊的應(yīng)用方法的對在信息設(shè)備1中存儲的程序代碼進行了組合的攻擊中,具有返回地址所指示的目的地的前一個命令不是CALL命令的特征。這兩個特征是執(zhí)行正常的程序時不具有的特征。在堆棧布局檢查處理中,根據(jù)這兩個特征來檢測Return-to-libc攻擊。下面,說明在堆棧布局檢查處理中能夠檢測的、Return-to-libc攻擊的派生模式。在上述說明的堆棧布局檢查處理中,通過檢查返回地址所指示的目的地,能夠檢測 Return-to-libc攻擊,但關(guān)于Return-to-libc攻擊公知有各種攻擊模式。圖5表示返回地址是函數(shù)的開始地址附近的情況下的代碼Cl的一例。通常,在OS 提供的函數(shù)的開始地址的緊前面,常配置有即使由CPU執(zhí)行也不進行任何動作的命令。在 Return-to-libc攻擊中,可以考慮不將返回地址指定為函數(shù)的開始地址,而故意指定為開始地址附近。如圖5所示,在函數(shù)的開始地址的位置前面插入有多個nop命令。nop命令是表示CPU什么也不執(zhí)行的命令。在圖5所示的情況下,由于返回地址所指示的目的地不是函數(shù)的開始地址,因而在步驟S14中不能檢測Return-to-libc攻擊,但通過在步驟S15中檢查返回地址所指示的目的地的前一個命令是否是CALL命令,能夠檢測Return-to-libc攻擊。圖6表示當(dāng)返回地址被設(shè)定為與函數(shù)的開始地址完全不同的程序代碼的地址來執(zhí)行該程序時的代碼C2的一例。在圖6示出的示例中,在返回地址所指示的目的地存儲有命令代碼“jmp eax”。命令“jmp eax”使得執(zhí)行在eax寄存器中存儲的值所指示的目的地的命令。在eax寄存器中存儲有想要執(zhí)行的函數(shù)的開始地址。若在圖6所示的狀態(tài)下執(zhí)行返回地址所指示的目的地的代碼,則首先執(zhí)行“ jmp eax",然后執(zhí)行想要執(zhí)行的函數(shù)的開始地址。在圖6所示的情況下,由于返回地址所指示的目的地不是函數(shù)的開始地址,因而在步驟S14中不能檢測Return-to-libc攻擊。但是,具有惡意的攻擊者需要從其它程序代碼的區(qū)域中尋找成為“jmp eax”的命令代碼,并設(shè)定為返回地址。在Return-to-libc攻擊中,成為“jmp eax”的命令代碼的前一個命令經(jīng)常不是CALL命令,因而在步驟S15中能夠檢測 Return-to-libc 攻擊。下面,舉出在Windows (注冊商標(biāo),下面省略注釋)中執(zhí)行的Return-to-libc攻擊的例子,說明本發(fā)明的信息設(shè)備1檢測Return-to-libc攻擊的時機。首先,說明由于執(zhí)行CPU 10制作的文件而引起的Return-to-1 ibc攻擊的一例。在這種情況下,使用Windows提供的函數(shù)即CreateFileO、WriteFileO、WinExecO、 Exitprocess ()等函數(shù),進行Return-to-libc攻擊。CreateFileO是用于制作文件等的函數(shù),所制作的文件名等成為自變量。WriteFileO是用于向文件寫入數(shù)據(jù)的函數(shù),表示寫入數(shù)據(jù)的對象的文件句柄(file handle)和寫入數(shù)據(jù)、數(shù)據(jù)大小等成為自變量。首先,在Return-to-libc 攻擊中,使用 CreateFile () ,WriteFile ()制作規(guī)定的文件。由WinExecO執(zhí)行該制作的文件,并在Exitfrocess ()中結(jié)束。圖7表示在Return-to-libc攻擊中當(dāng)正在執(zhí)行CreateFileO時在RAM30中存儲的堆棧區(qū)域的一例。在圖7所示的堆棧的狀態(tài)下,作為堆棧布局檢查處理中的檢查對象的返回地址,“WriteFile的開始地址”、“WinExec的開始地址”、“Exitfrocess的開始地址”這三個開始地址成為檢查對象。在開始地址表示如圖5所示的開始地址附近、或如圖6所示的其它程序代碼的情況下,也能夠在步驟S15中檢測Return-to-libc攻擊。還存在Return-to-libc攻擊中的攻擊代碼通過因特網(wǎng)而下載具有惡意的代碼并執(zhí)行其文件的情況。例如,首先使用Windows提供的函數(shù)URLDownloadTofile (),通過I/F 部60從因特網(wǎng)下載具有惡意的文件。通過使用WinExecO來執(zhí)行所下載的文件。圖 8 表示當(dāng)在 Return-to-libc 攻擊中正在執(zhí)行 URLDownloacTTofileO 時在 RAM30 中存儲的堆棧區(qū)域的一例。在圖8所示的堆棧的狀態(tài)下,作為堆棧布局檢查處理中的檢查對象的返回地址,“WinExec的開始地址”、“Exitfrocess的開始地址”這兩個開始地址成為檢查對象。在開始地址表示如圖5所示的開始地址附近、或如圖6所示的其它程序代碼的情況下,也能夠在步驟S15中檢測Return-to-libc攻擊。如上所述,根據(jù)本發(fā)明的信息設(shè)備,不依賴于CPU具有的功能,即可容易且可靠地防止與緩沖器溢出有關(guān)的不正當(dāng)訪問的方法即Return-to-libc攻擊。另外,上述的實施方式中的記述只示出了一例,本發(fā)明不限定于該示例。關(guān)于上述的實施方式中的結(jié)構(gòu)和動作能夠適當(dāng)進行變更。例如,在上面的說明中,作為本發(fā)明的程序的計算機可讀取的介質(zhì),公開了采用存儲部20或ROM的示例,但不限定于該示例。作為其它的計算機可讀取的介質(zhì),能夠采用閃存等非易失性存儲器、CD-ROM等可移動型記錄介質(zhì)。并且,作為通過與I/F部60連接的通信線路來提供本發(fā)明的程序的數(shù)據(jù)的介質(zhì),本發(fā)明也能夠采用載波。另外,包括說明書、權(quán)利要求書、附圖及摘要在內(nèi)的、2009年4月27日提交的日本專利申請No. 2009-107294號的所有公開內(nèi)容,都被直接引用于本申請的一部分。工業(yè)實用性本發(fā)明能夠應(yīng)用在PC、WS、手機、網(wǎng)絡(luò)設(shè)備等信息設(shè)備領(lǐng)域中。標(biāo)號說明1信息設(shè)備10 CPU20存儲部30 RAM40操作部50顯示部60 I/F 部70 總線
權(quán)利要求
1.一種信息設(shè)備,通過在存儲器中展開的各個程序代碼與中央控制部之間的協(xié)作來進行數(shù)據(jù)處理,其中,該信息設(shè)備具有檢測單元,檢測所述任意一個程序代碼的調(diào)用時刻;返回地址取得單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,依次取得在所述存儲器中展開的各個程序代碼的返回地址;以及停止單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,根據(jù)由所述返回地址取得單元依次取得的返回地址所表示的目的地的地址來檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。
2.根據(jù)權(quán)利要求1所述的信息設(shè)備,其中,所述存儲器具有堆棧區(qū)域,該堆棧區(qū)域存儲各個程序代碼的返回地址,所述返回地址取得單元跟蹤并取得在所述堆棧區(qū)域中存儲的返回地址。
3.根據(jù)權(quán)利要求1或2所述的信息設(shè)備,其中,在由所述屬性取得單元取得的各個返回地址所表示的目的地的地址是函數(shù)的開始地址的情況下,所述停止單元檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下,所述停止單元停止所述數(shù)據(jù)處理。
4.根據(jù)權(quán)利要求1 3中任意一項所述的信息設(shè)備,其中,在與由所述屬性取得單元取得的各個返回地址所表示的目的地的地址相對應(yīng)的前一個命令不是調(diào)用命令的情況下,所述停止單元檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下,所述停止單元停止所述數(shù)據(jù)處理。
5.一種程序,用于使執(zhí)行在存儲器中展開的各個程序代碼的計算機作為以下單元發(fā)揮作用檢測單元,檢測所述任意一個程序代碼的調(diào)用時刻;返回地址取得單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,依次取得在所述存儲器中展開的各個程序代碼的返回地址;以及停止單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,根據(jù)由所述返回地址取得單元依次取得的返回地址所表示的目的地的地址來檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。
6.一種防止計算機執(zhí)行不正當(dāng)程序代碼的方法,該計算機執(zhí)行在存儲器中展開的各個程序代碼,該方法中,檢測所述任意一個程序代碼的調(diào)用時刻,在該檢測到的程序代碼的調(diào)用時刻,依次取得在所述存儲器中展開的各個程序代碼的返回地址,根據(jù)該取得的各個返回地址所表示的目的地的地址來檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。
7.一種存儲程序的計算機可讀取的記錄介質(zhì),該程序用于使執(zhí)行在存儲器中展開的各個程序代碼的計算機作為以下單元發(fā)揮作用檢測單元,檢測所述任意一個程序代碼的調(diào)用時刻;返回地址取得單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,依次取得在所述存儲器中展開的各個程序代碼的返回地址;以及停止單元,在由所述檢測單元檢測到的程序代碼的調(diào)用時刻,根據(jù)由所述返回地址取得單元依次取得的返回地址所表示的目的地的地址來檢測不正當(dāng)訪問,在檢測到該不正當(dāng)訪問的情況下停止所述數(shù)據(jù)處理。
全文摘要
本發(fā)明不依賴于CPU具有的功能,即可容易且可靠地防止與緩沖器溢出有關(guān)的不正當(dāng)訪問。信息設(shè)備(1)通過在存儲器中展開的各個程序代碼與中央控制部之間的協(xié)作來進行數(shù)據(jù)處理,通過掛鉤處理來檢測程序代碼的調(diào)用時刻,通過堆棧布局檢查處理,依次取得在RAM(30)中展開的各個程序代碼的返回地址,根據(jù)該取得的返回地址所表示的目的地的地址來檢測不正當(dāng)訪問,在檢測到不正當(dāng)訪問的情況下停止數(shù)據(jù)處理。
文檔編號G06F21/24GK102422299SQ20108001852
公開日2012年4月18日 申請日期2010年4月12日 優(yōu)先權(quán)日2009年4月27日
發(fā)明者石山智祥 申請人:株式會社一四四零技術(shù)研究所