數(shù)據(jù)處理系統(tǒng)以及用于操作數(shù)據(jù)處理系統(tǒng)的方法
【專利摘要】一種數(shù)據(jù)處理系統(tǒng)(10)包括處理單元(12)、第一存儲器(14)和第二存儲器(16),其中所述數(shù)據(jù)處理系統(tǒng)(10)被布置為當(dāng)執(zhí)行對所述第一存儲器(14)的寫訪問時硬件保護(hù)所述第二存儲器(16),其中所述處理單元(12)被布置為執(zhí)行具有至少一個跳轉(zhuǎn)指令(20)和至少一個返回指令(22)的程序(18),其中所述處理單元(12)被布置為在所述第一存儲器(14)中存儲程序棧(24),其中所述處理單元(12)被布置為當(dāng)執(zhí)行所述至少一個跳轉(zhuǎn)指令(20)時在所述程序棧(24)上存儲返回地址(26)并且在所述第二存儲器(16)中存儲返回地址副本,以及其中所述處理單元(12)被布置為當(dāng)執(zhí)行所述至少一個返回指令(22)時將所述返回地址(26)與所述返回地址副本進(jìn)行比較。
【專利說明】數(shù)據(jù)處理系統(tǒng)以及用于操作數(shù)據(jù)處理系統(tǒng)的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)處理系統(tǒng)以及用于操作數(shù)據(jù)處理系統(tǒng)的方法。
【背景技術(shù)】
[0002]現(xiàn)代數(shù)據(jù)處理系統(tǒng)通常以邏輯操作的序列的形式執(zhí)行程序。在程序的執(zhí)行期間,數(shù)據(jù)處理系統(tǒng)通常在連續(xù)的存儲器區(qū)段中動態(tài)地存儲變量和返回地址。所存儲的返回地址與程序流程的控制有關(guān)。被用于存儲變量和返回地址的連續(xù)的存儲器區(qū)段被稱為程序棧,因為在程序執(zhí)行期間,該程序動態(tài)地在其中堆疊信息。
[0003]變量和返回地址被在后進(jìn)先出方案中混合存儲。被存儲在堆棧上的每一個變量和每一個返回地址有其自己的預(yù)定的存儲器大小。將一些東西寫到超過這個預(yù)定的存儲器大小的變量的嘗試可能導(dǎo)致相鄰的存儲器位置的重寫,其被保留給不同的變量或返回地址。重寫可能以意想不到的方式改變了堆棧的內(nèi)容。具體地,重寫可能改變被存儲在堆棧上的返回地址。這可能導(dǎo)致嚴(yán)重的錯誤、改變程序流程并且可以被用于獲得程序的控制,例如,用于執(zhí)行任意的程序代碼。重寫在堆棧上所存儲的返回地址被稱為“摧毀堆棧攻擊”。
[0004]美國專利5,949,973示出了一種包括將整個堆棧重置到隨機(jī)存儲器位置的方法。原始堆棧區(qū)隨后被擦除。美國專利6,941,473示出了一種在返回地址之前插入特殊的保護(hù)變量以保護(hù)返回地址的方法。保護(hù)變量被檢查以證明所保護(hù)的返回地址沒有被修改。美國專利7,581,089示出了一種用于保護(hù)在基于兩個堆棧的創(chuàng)建的數(shù)據(jù)處理系統(tǒng)上的返回地址的方法。第一堆棧是正常的堆棧并且第二堆棧是陰影。該陰影有包含在子程序調(diào)用上的返回地址的副本的陰影框架。在從子程序返回之前,來自堆棧的返回地址和來自陰影的返回地址的副本進(jìn)行比較,并且如果它們不匹配,則在陰影中搜索匹配的返回地址。
【發(fā)明內(nèi)容】
[0005]如所附權(quán)利要求中所描述的,本發(fā)明提供了一種數(shù)據(jù)處理系統(tǒng)以及一種用于操作數(shù)據(jù)處理系統(tǒng)的方法。
[0006]本發(fā)明的特定實施例在從屬權(quán)利要求中被陳述。
[0007]根據(jù)下文中描述的實施例,本發(fā)明的這些或其它方面將會很明顯并且被闡述。
【專利附圖】
【附圖說明】
[0008]根據(jù)附圖,僅僅通過舉例的方式,本發(fā)明的進(jìn)一步細(xì)節(jié)、方面和實施例將被描述。在附圖中,類似的符號被用于表示相同或功能相似的元件。為了簡便以及清晰,附圖中的元件不一定按比例繪制。
[0009]圖1示意性地示出了數(shù)據(jù)處理系統(tǒng)的一個實施例的例子。
[0010]圖2示意性地示出了第二存儲器的一個實施例的例子。
[0011]圖3示意性地示出了用于程序的分支的例子。
[0012]圖4示出了易受摧毀堆棧攻擊的程序的例子。
[0013]圖5示出了易受在兩個不同時間的摧毀堆棧攻擊的程序的程序棧的例子。
[0014]圖6示出了示例流程圖以解釋數(shù)據(jù)處理系統(tǒng)的一個實施例的基本功能的示例交互。
【具體實施方式】
[0015]因為本發(fā)明所說明的實施例可以在大多數(shù)情況下通過使用本領(lǐng)域所屬技術(shù)人員已知電子組件和電路被實施,細(xì)節(jié)不會在比上述所說明的認(rèn)為有必要的程度大的任何程度上進(jìn)行解釋。對本發(fā)明基本概念的理解以及認(rèn)識是為了不混淆或偏離本發(fā)明所教之內(nèi)容。
[0016]盡管下文所使用的術(shù)語的定義不應(yīng)被解釋為限制,所使用的術(shù)語被理解為包括至少以下術(shù)語。
[0017]在本說明書的上下文中,術(shù)語“數(shù)據(jù)處理系統(tǒng)”可以被用于可以被布置為執(zhí)行程序的多個電子元件。
[0018]術(shù)語“程序”可以被用于可以由數(shù)據(jù)處理系統(tǒng)執(zhí)行的邏輯指令的序列。
[0019]術(shù)語“處理單元”可以描述用于執(zhí)行邏輯操作的序列的可編程或不可編程器件。處理單元可以是數(shù)據(jù)處理系統(tǒng)的一部分。
[0020]術(shù)語“存儲器”可以被用于可以通過公共存儲控制器訪問的多個相同的存儲單元。存儲控制器可以是數(shù)據(jù)處理系統(tǒng)的一部分。
[0021]術(shù)語“地址空間”可以被用于一組地址碼,其中每一個地址碼可以被用于訪問存儲器的特定的存儲單元。特定的存儲單元的地址碼可以例如是整數(shù)。一組連續(xù)的整數(shù)可能定義連續(xù)的地址空間。
[0022]術(shù)語“偏移”可以被用于可以被添加到用于獲得改變的地址碼的地址碼的數(shù)字或代碼。地址碼可以與特定的存儲單元有關(guān)。改變的地址碼可以與可以通過改變的地址碼訪問的不同的存儲單元有關(guān)。偏移可以例如是整數(shù)。將偏移添加到原始地址碼可以在地址空間中產(chǎn)生可以是有效的地址碼的新整數(shù)。
[0023]術(shù)語“跳轉(zhuǎn)指令”可以被用于在程序內(nèi)的邏輯指令,其可以例如導(dǎo)致非序列的程序流程。非序列的程序流程可以例如在函數(shù)或子程序被調(diào)用時發(fā)生。跳轉(zhuǎn)指令可以改變程序指針,其表示將隨后被執(zhí)行的邏輯指令。
[0024]術(shù)語“返回指令”可以例如被用于邏輯指令,其可以例如在用于返回邏輯指令的函數(shù)或子程序的末端被執(zhí)行,該邏輯指令在先前的跳轉(zhuǎn)指令之后。返回指令可以改變程序指針。
[0025]術(shù)語“程序?!笨梢员挥糜诒粍討B(tài)地分配到程序的存儲器區(qū)段。程序??梢岳绫挥糜诖鎯ψ兞亢头祷氐刂?,其可以在運行時由程序產(chǎn)生。
[0026]術(shù)語“異常消息”可以被用于在數(shù)據(jù)處理系統(tǒng)內(nèi)的信息或邏輯信號,當(dāng)異常在程序的執(zhí)行期間發(fā)生時,其可以被產(chǎn)生。異常可以例如是事件,其在執(zhí)行可能擾亂程序的指令的正常、預(yù)期的流程的程序期間發(fā)生。
[0027]術(shù)語“日志文件”可以被用于數(shù)據(jù)文件,其中程序可以存儲事件,例如訪問或數(shù)據(jù)操作,因為它們發(fā)生以作為審計跟蹤、診斷器件或安全措施。
[0028]術(shù)語“寫訪問”可以被用于對存儲器的訪問。寫訪問可以改變在存儲器中存儲的信息。在機(jī)器碼中,即,可以直接由數(shù)據(jù)處理系統(tǒng)執(zhí)行的類屬指令,寫訪問可以由應(yīng)被寫到存儲器的多個類似的寫指令、信息和限定寫訪問的起始點的起始地址碼定義。所述多個類似的寫指令可以例如被組織為環(huán)路,并且應(yīng)被寫到存儲器的信息可以例如是具有多個字符的字符串。第一寫指令可以使用起始地址碼并且可以將字符串的第一字符寫入存儲器。第二寫指令可以使用具有其的偏移的起始地址碼并且可以將字符串的第二字符寫入存儲器,
坐坐寸寸O
[0029]參照圖1,圖1示意性地示出了數(shù)據(jù)處理系統(tǒng)10的一個實施例的例子。數(shù)據(jù)處理系統(tǒng)10的基本功能的交互的例子將結(jié)合圖6隨后被解釋。數(shù)據(jù)處理系統(tǒng)10可以包括處理單元12、第一存儲器14和第二存儲器16。第一存儲器14可以例如具有第一地址空間。第二存儲器16可以例如具有第二地址空間。數(shù)據(jù)處理系統(tǒng)10可以被布置為當(dāng)執(zhí)行對第一存儲器14的寫訪問時硬件保護(hù)第二存儲器16。處理單元12可以被布置為訪問第一存儲器14和第二存儲器16。例如,處理單元12可以包括至少一個存儲控制器。
[0030]硬件保護(hù)第二存儲器14可以以多種不同方式被實現(xiàn)。通常,硬件保護(hù)第二存儲器16可以描述當(dāng)執(zhí)行對第一存儲器14的寫訪問時,可以通過操作和/或溢出對第一存儲器14的寫訪問的起始地址,例如通過將偏移添加到第一地址空間的地址,不獲得和/或訪問和/或?qū)懭氲诙刂房臻g的地址。這可以例如通過使用訪問第一存儲器14和第二存儲器16的兩個不同的指令來實現(xiàn),其中兩個指令僅在其變元即地址碼中沒有區(qū)別。在寫指令被執(zhí)行之前,檢查符合允許的地址界的地址碼可能是不必要的。差異可以通過在機(jī)器碼中使用用于第一存儲器14和第二存儲器16的不同的地址碼結(jié)構(gòu)或通過在機(jī)器碼中使用用于第一存儲器14和第二存儲器16的完全不同的寫指令來實現(xiàn)。通常,數(shù)據(jù)處理系統(tǒng)10可以被布置為使得具有到第一存儲器14的任意長度的寫入例如字符串的數(shù)據(jù)的寫訪問可以永遠(yuǎn)不到達(dá)第二存儲器16。
[0031]硬件保護(hù)第二存儲器16可以例如通過將第一存儲器14與第二存儲器16物理分離和/或通過兩個不同的存儲控制器訪問第一存儲器14和第二存儲器16來實現(xiàn)。
[0032]訪問第一存儲器14和第二存儲器16可以例如通過控制總線34、地址總線36和數(shù)據(jù)總線38來實現(xiàn)??刂瓶偩€34可以例如控制用于到第一存儲器14和到第二存儲器16的讀/寫訪問的通用I/O處理。地址總線36可以例如提供地址碼,其與到第一存儲器14和到第二存儲器16的讀/寫訪問有關(guān)。數(shù)據(jù)總線38可以例如控制數(shù)據(jù),其可以寫入第一存儲器14和第二存儲器16或從第一存儲器14和第二存儲器16讀取。
[0033]處理單元12可以例如包括內(nèi)核62和硬件邏輯單元32。硬件邏輯單元32可以是單獨單元?;蛘?,處理單元12的其它部分例如處理單元12的內(nèi)核62可以具有所集成的單元32。硬件邏輯單元32可以例如被布置為通過詢問總線40訪問第二存儲器16并且可以被布置為直接通過結(jié)果總線42從第二存儲器16接收數(shù)據(jù)。硬件邏輯單元32可以使用用于搜索第二存儲器16的詢問總線40,如將隨后被解釋的。經(jīng)過詢問總線40的詢問的結(jié)果可以例如經(jīng)過結(jié)果總線42被送回到硬件邏輯單元32。詢問總線40和結(jié)果總線42可以是數(shù)據(jù)處理系統(tǒng)10的可選特性。處理單元12可以被布置為當(dāng)返回地址和返回地址副本不相同時產(chǎn)生異常消息30。硬件邏輯單元32可以產(chǎn)生異常消息30,例如,其可以由處理單元12的內(nèi)核62處理。
[0034]處理單元12可以包括多于一個內(nèi)核。當(dāng)處理單元12包括多個內(nèi)核62時,多個第二存儲器16可以被提供,其中每一個第二存儲器16致力于所述多個內(nèi)核62。第二存儲器16的大小可以依據(jù)返回地址的數(shù)量,其可以同時被存儲,S卩,嵌套的跳轉(zhuǎn)指令的最大數(shù)量。
[0035]數(shù)據(jù)處理系統(tǒng)10可以執(zhí)行程序18。程序18可以包括邏輯指令的序列。邏輯指令可以由處理單元12執(zhí)行。當(dāng)數(shù)據(jù)處理系統(tǒng)10執(zhí)行程序18時,程序指針可以指示邏輯指令,其可以隨后被執(zhí)行,如將隨后被解釋的。程序18可以包括至少一個跳轉(zhuǎn)指令和至少一個返回指令。
[0036]程序18可以例如包括代碼段68、堆段66和程序棧24。處理單元12可以被布置為在第一存儲器14中存儲程序棧24。處理單元12可以被布置為在第一存儲器14中存儲程序18的其它部分,即,代碼段68和堆段66。代碼段68可以例如包括邏輯操作的序列。堆段66可以例如包括變量,其在程序18的初始化期間即當(dāng)程序18開始時被分配。程序棧24可以例如包括可以在程序棧24上被動態(tài)地存儲的變量和返回地址。
[0037]在程序初始化期間,第一存儲器14的連續(xù)的存儲器區(qū)段可以被分配給程序18。連續(xù)的存儲器區(qū)段可以通過一組連續(xù)的地址碼進(jìn)行訪問。代碼段68、堆段66和程序棧24可以在這個連續(xù)的存儲器區(qū)段中被配置。例如,代碼段68可以具有最低的地址碼。堆段66可以直接相鄰于代碼段68。堆段66可以具有高于用于代碼段68的地址碼的地址碼。堆段66可以在程序18的初始化期間從低地址碼“生長”到高地址碼。程序棧24可以具有最高的地址碼。程序棧24可以在運行期間從高地址碼“生長”到低地址碼,即,朝著堆段66。
[0038]空的存儲器區(qū)段70可以位于堆段66和程序棧24之間。空的存儲器區(qū)段70可以例如是在初始化期間被分配給程序18的存儲器??盏拇鎯ζ鲄^(qū)段70可以在程序棧24生長的運行時被部分分配給程序棧24。當(dāng)程序棧24收縮時,空的存儲器區(qū)段70可以生長。
[0039]處理單元12可以被布置為執(zhí)行當(dāng)至少一個跳轉(zhuǎn)指令時在程序棧24上存儲返回地址并且在第二存儲器16中存儲返回地址副本。處理單元12可以被布置為在后進(jìn)先出方案(LIFO)中存儲返回地址副本。在LIFO方案中存儲返回地址副本可以在第二存儲器16中提供一種用于布置不同的返回地址的泛型方法。當(dāng)返回指令被完成時,返回地址和返回地址副本可能成為過剩的。返回地址可以從程序棧24被刪除以節(jié)省存儲器,例如,當(dāng)調(diào)用的子程序結(jié)束時。以同樣的方式,返回地址副本可以從第二存儲器16被刪除以節(jié)省存儲器。當(dāng)返回指令被完成時,處理單元12可以被布置為刪除返回地址副本。
[0040]處理單元12可以被布置為當(dāng)執(zhí)行至少一個返回指令時將返回地址與返回地址副本進(jìn)行比較。硬件邏輯單元32可以執(zhí)行在返回地址和返回地址副本之間的比較。如之前所提到的,當(dāng)返回地址和返回地址副本不相同時,處理單元12可以產(chǎn)生異常消息30。處理單元12可以被布置為當(dāng)處理單元12產(chǎn)生異常消息30時停止執(zhí)行程序18。
[0041]在比較的結(jié)果完成之前,處理單元12繼續(xù)執(zhí)行程序18可以是可能的。以這種方式,由于比較在程序18的執(zhí)行中的延遲可以被避免。處理單元12可以被布置為當(dāng)處理單元12產(chǎn)生異常消息30時繼續(xù)基于返回地址副本執(zhí)行程序18。為此,處理單元12可以例如被布置為用當(dāng)處理單元12產(chǎn)生異常消息30時返回地址副本替代返回地址。處理單元12可以被布置為當(dāng)處理單元12產(chǎn)生異常消息30時產(chǎn)生日志文件。該日志文件可以例如包括內(nèi)核轉(zhuǎn)儲。
[0042]現(xiàn)參照圖2,圖2示意性地示出了第二存儲器16的一個實施例的例子。圖2示意性地指示第二存儲器16的輸入和輸出值的例子。輸入值可以例如經(jīng)過控制總線34、地址總線36、數(shù)據(jù)總線38和詢問總線40被送到第二存儲器16。這些輸入值可以例如是數(shù)據(jù)54、數(shù)據(jù)地址碼56、時鐘信號58和與讀/寫訪問控制60有關(guān)的各種值。第二存儲器16的輸出值可以例如通過結(jié)果總線42被傳輸。應(yīng)理解,正常的讀訪問通過數(shù)據(jù)總線38和地址總線36可以是可能的。從第二存儲器16刪除特定的數(shù)據(jù)值可以例如通過重寫具有“零”的特定的數(shù)據(jù)值來實現(xiàn)。
[0043]第二存儲器16可以例如是內(nèi)容可尋址存儲器(CAM)或隨機(jī)存取存儲器(RAM)。CAM可以被設(shè)計為使得其可以同時搜索用于特定的提供的數(shù)據(jù)值的其整個內(nèi)容,S卩,在其中所存儲的數(shù)據(jù)值。當(dāng)提供的數(shù)據(jù)值被發(fā)現(xiàn)時,CAM可能返回一系列一個或多個地址碼,其中特定的提供的數(shù)據(jù)值可以被發(fā)現(xiàn)。CAM可能返回所返回的地址碼或任何其它關(guān)聯(lián)的數(shù)據(jù)值的內(nèi)容。對于CAM,讀指令是用于匹配的數(shù)據(jù)值的搜索指令。CAM可以提供用于特定的數(shù)據(jù)值的最快的可能搜索,如將隨后被解釋的。
[0044]輸出值可以例如是命中值50和命中地址碼52。命中值50可以指示特定的返回地址碼在CAM內(nèi)作為返回地址副本被存儲。命中值50可以是邏輯值。命中地址碼52可以例如是在與命中值50有關(guān)的CAM內(nèi)的地址碼。命中地址碼52可以例如是詢問的結(jié)果,其通過詢問總線40先前被送到第二存儲器16。詢問可以例如是地址碼。CAM可以自動地搜索提供的地址碼。當(dāng)?shù)诙鎯ζ?6不是CAM,而是另一種類型的存儲器時,在第二存儲器16中用于特定的地址碼的搜索可能需要附加的外部邏輯單元,其可以結(jié)合圖1由所提到的硬件邏輯單元32提供。
[0045]現(xiàn)參照圖3,圖3示意性地示出了用于程序18的分支的例子。程序18可能包括了主段46和子程序段48。主段46可以包括邏輯操作的序列。邏輯操作的序列可以連續(xù)地被布置。例如,跳轉(zhuǎn)指令20可以位于地址碼X,并且主段46的后續(xù)邏輯指令可以位于地址碼X+1。程序指針64可以指示邏輯指令將隨后被執(zhí)行。程序指針64的值可以例如是地址碼。對于沒有支路、環(huán)路等的正常的程序流程,程序指針64可以隨后通過主段46的邏輯指令運行。當(dāng)程序指針64到達(dá)在地址碼X的跳轉(zhuǎn)指令20時,程序指針64的值可以成為返回地址碼26。返回地址碼26可以結(jié)合返回指令22被存儲。
[0046]跳轉(zhuǎn)指令20可以將程序指針64從值X+1改變到新值Y,例如,以執(zhí)行具有在以地址碼Y開始的子程序段48中所存儲的邏輯指令的序列的函數(shù)f。程序指針64可以按順序通過函數(shù)f的邏輯指令的序列運行到關(guān)聯(lián)于返回地址碼26的返回指令22。
[0047]返回指令22可以標(biāo)記函數(shù)f的邏輯指令的序列的末端。返回指令22可以將程序指針64改變到返回地址碼26,S卩,到新的值X+1。程序指針64可以返回主段46的邏輯指令的序列,并且程序流程可能在跳轉(zhuǎn)指令20之后的地址碼X+1的主段46中繼續(xù)。主段46的邏輯操作的序列和子程序段48的邏輯操作的序列可以結(jié)合圖1位于所提到的代碼段68內(nèi)。跳轉(zhuǎn)指令20的變元和返回指令22的變元可以例如結(jié)合圖1存儲在所提到的程序棧24上。數(shù)據(jù)處理系統(tǒng)可以保護(hù)可以被存儲在程序棧上的返回地址26免于由溢出改變,如將隨后被解釋的。
[0048]現(xiàn)參照圖4,圖4示出了易受摧毀堆棧攻擊的程序的例子。程序18可以例如在程序語言C中由列表描述。列表的語法可以為本領(lǐng)域所屬技術(shù)人員所熟知。程序18可以包括主段48和子程序段48。主段46可以在線6中包括函數(shù)調(diào)用,該線6可以包括到子程序段48的跳轉(zhuǎn)指令。子程序段48可以包括另外的函數(shù)調(diào)用。C庫函數(shù)“strcpy”可以在子程序段48中的線17被調(diào)用。C庫函數(shù)“strcpy”可以具有第一變元和第二變元。第一變元和第二變元可以是指針。每一個指針可以指向特定的數(shù)據(jù),例如,第一指針可以指向第一數(shù)據(jù)并且第二指針可以指向第二數(shù)據(jù)。簡單起見,指針和數(shù)據(jù)之間的差異在下面被忽略。第一數(shù)據(jù)和第二數(shù)據(jù)可以各自具有第一數(shù)據(jù)量和第二數(shù)據(jù)量。函數(shù)“strcpy”可以將第二數(shù)據(jù)復(fù)制到第一數(shù)據(jù),而不檢查第二數(shù)據(jù)量是否大于或小于第一數(shù)據(jù)量。當(dāng)?shù)诙?shù)據(jù)大于第一數(shù)據(jù)量時,第二數(shù)據(jù)可以超過第一數(shù)據(jù)被寫入。溢出可能發(fā)生,其可能損壞程序棧,并且可能改變程序流程,如將在下面被解釋的。
[0049]現(xiàn)參照圖5,圖5示出了在兩個不同時間易受溢出或摧毀堆棧攻擊的程序的程序棧的例子。圖5中所示的兩個表格可以與圖4中所示的程序18有關(guān)。從左到右的列是程序棧指針即指向由程序棧占用的最低地址碼的指針、用于程序棧指針的偏移、存儲器地址碼、用于保留數(shù)據(jù)的名稱、保留/分配的存儲器的量、程序段的名稱和存儲器增長和程序棧增長的方向。用于程序棧指針的偏移可以例如是偏移,其可以被添加到用于產(chǎn)生訪問另一個在堆棧上存儲的數(shù)據(jù)的地址碼的程序棧指針。存儲器地址碼可以描述用于訪問在堆棧上所存儲的不同的數(shù)據(jù)的地址碼。存儲器地址碼可以是十六進(jìn)制值。為了更好的理解程序棧,存儲數(shù)據(jù)的名稱可以例如建立到圖4中所示的列表的聯(lián)系。保留存儲器列可以指示在程序棧上所存儲的特定的數(shù)據(jù)的(最大)量。存儲器增長可以指示用于增加地址碼的方向。程序棧增長可以指示在運行時用于程序棧的增長的方向。在圖5的例子中,程序棧可以增長到較低的地址碼。
[0050]當(dāng)程序被初始化并且在程序列表的線6中的函數(shù)調(diào)用還沒被執(zhí)行時,第一或上方的表格可以與第一時間有關(guān)。當(dāng)主段已經(jīng)執(zhí)行函數(shù)調(diào)用時,第二或下方的表格可以與第二時間有關(guān)。當(dāng)程序執(zhí)行函數(shù)調(diào)用時,如下方的表格所示,變量和返回地址可以被存儲在程序棧上。
[0051]摧毀堆棧攻擊的溢出的基本原理將在下面被解釋。函數(shù)“strcpy”可以將數(shù)據(jù)“msg”復(fù)制到數(shù)據(jù)“緩沖”,而不檢查其各自的量。當(dāng)“msg”的量延伸“緩沖”的量時,溢出可能發(fā)生,并且“msg”的部分可以被寫入其它變量,其被存儲在相鄰于“msg”的程序棧上。例如,連續(xù)的地址碼可以被使用,并且程序??梢栽诖鎯ζ髟鲩L的方向中被改變。例如,局部變量“varllocal”可以由緩沖器溢出改變。當(dāng)溢出是足夠大,即,在這個例子中大于4字節(jié)時,返回地址可以被改變。這可以改變程序流程。當(dāng)返回指令在函數(shù)的末端被執(zhí)行時,程序指針可以按預(yù)期不返回到主段。程序流程可以在改變的返回地址繼續(xù)。這可以導(dǎo)致嚴(yán)重的錯誤。在返回指令被執(zhí)行之前,檢查返回地址的完整性可能有助于減少由溢出造成的損壞并且有助于防止摧毀堆棧攻擊。
[0052]現(xiàn)參照圖6,圖6示出了示例流程圖以解釋數(shù)據(jù)處理系統(tǒng)的實施例的基本功能的示例交互。應(yīng)假定,數(shù)據(jù)處理系統(tǒng)執(zhí)行包括多個指令、至少一個跳轉(zhuǎn)指令和至少一個返回指令的程序。起始點可以例如是塊82。在塊82,應(yīng)由數(shù)據(jù)處理系統(tǒng)執(zhí)行的當(dāng)前指令可能改變,例如,通過推進(jìn)程序指針。在塊66,數(shù)據(jù)處理系統(tǒng)可以檢查當(dāng)前指令是否是跳轉(zhuǎn)指令。當(dāng)當(dāng)前指令不是跳轉(zhuǎn)指令時,數(shù)據(jù)處理系統(tǒng)可以繼續(xù)進(jìn)行塊74。在塊74,數(shù)據(jù)處理系統(tǒng)可以檢查當(dāng)前指令是否是返回指令。當(dāng)當(dāng)前指令不是返回指令時,數(shù)據(jù)處理系統(tǒng)可以在塊82執(zhí)行當(dāng)前指令。數(shù)據(jù)處理系統(tǒng)可以繼續(xù)進(jìn)行塊80,例如,通過推進(jìn)程序指針。S卩,數(shù)據(jù)處理系統(tǒng)可以總是在執(zhí)行它之前檢查當(dāng)前指令是否是跳轉(zhuǎn)指令或返回指令。當(dāng)當(dāng)前指令既不是跳轉(zhuǎn)指令也不是返回指令時,數(shù)據(jù)處理系統(tǒng)可以正常執(zhí)行它。
[0053]當(dāng)當(dāng)前指令是跳轉(zhuǎn)指令時,數(shù)據(jù)處理系統(tǒng)可以繼續(xù)進(jìn)行塊68。在塊68,數(shù)據(jù)處理系統(tǒng)可以如結(jié)合圖1所提到的,在第一存儲器中存儲返回地址,即,由所增加的程序指針的值。在塊70,數(shù)據(jù)處理系統(tǒng)可以在第二存儲器中存儲返回地址的副本,S卩,返回地址副本。跳轉(zhuǎn)指令可以隨后在塊72被執(zhí)行。當(dāng)跳轉(zhuǎn)指令被完成時,數(shù)據(jù)處理系統(tǒng)可以繼續(xù)進(jìn)行圖6中所示的塊74或直接繼續(xù)進(jìn)行塊82。
[0054]當(dāng)當(dāng)前指令是返回指令時,數(shù)據(jù)處理系統(tǒng)可以繼續(xù)進(jìn)行塊76。在塊76,數(shù)據(jù)處理系統(tǒng)可以將返回地址與返回地址副本進(jìn)行比較。如結(jié)合圖1所提到的,該比較可以例如由硬件邏輯單元執(zhí)行。附加檢查返回地址和返回地址副本是否相同可能放慢程序執(zhí)行。當(dāng)?shù)诙鎯ζ骺梢岳缡荂AM時,該比較的執(zhí)行可以非???。搜索CAM可能需要大約I或2時鐘周期。當(dāng)?shù)诙鎯ζ魇瞧胀ǖ碾S機(jī)存取存儲器時,搜索可能需要較長時間,并且本領(lǐng)域所屬技術(shù)人員所熟知的不同的搜索策略可以被應(yīng)用。
[0055]當(dāng)返回地址和返回地址副本是相同時,程序可以繼續(xù)塊78。在塊78,數(shù)據(jù)處理單元可能執(zhí)行返回指令。當(dāng)返回指令被完成時,數(shù)據(jù)處理系統(tǒng)可以繼續(xù)進(jìn)行塊82。
[0056]當(dāng)返回地址和返回地址副本不同時,數(shù)據(jù)處理系統(tǒng)可以執(zhí)行圖6中未明確顯示的不同的動作。例如,數(shù)據(jù)處理系統(tǒng)可以產(chǎn)生到信號的異常消息,其中返回地址被改變。改變的返回地址可以是用于在執(zhí)行的程序中的嚴(yán)重的錯誤或用于通過一種摧毀堆棧方法的黑客攻擊的信號。異常消息可以例如由硬件邏輯單元產(chǎn)生。直接使用第二存儲器的輸出信號作為異常消息,例如,結(jié)合圖2所描述的命中信號可以是可能的。異常消息可以例如在處理單元的內(nèi)核中被評估。當(dāng)異常消息被產(chǎn)生時,數(shù)據(jù)處理系統(tǒng)可以停止執(zhí)行程序。
[0057]數(shù)據(jù)處理系統(tǒng)可以在比較的結(jié)果是可用的之前繼續(xù)進(jìn)行程序的執(zhí)行。這可以在圖6中導(dǎo)致塊76和78的并行執(zhí)行。數(shù)據(jù)處理系統(tǒng)可以通過使用來自第一存儲器的未驗證的返回地址立即執(zhí)行返回指令。同時,數(shù)據(jù)處理系統(tǒng)可以搜索第二存儲器以檢查返回地址和返回地址副本是否是相同的。搜索可以由硬件邏輯單元執(zhí)行,該硬件邏輯單元可以由返回指令的執(zhí)行觸發(fā)。當(dāng)硬件邏輯單元檢測到返回地址被改變時,程序執(zhí)行可以基于產(chǎn)生的異常消息被停止,該異常消息可以作為陷阱。這可能僅通過搜索所需要的時間延遲嚴(yán)重的錯誤的檢測。返回指令立即被執(zhí)行,并且當(dāng)返回地址沒有被改變時,程序執(zhí)行不被延遲。塊76和78的并行執(zhí)行可以允許返回地址的更復(fù)雜的保護(hù)。例如,對可以被比較,其中每一個對可以包括程序棧地址碼和相應(yīng)的返回地址。
[0058]當(dāng)異常消息被產(chǎn)生時,數(shù)據(jù)處理系統(tǒng)可以繼續(xù)基于返回地址副本執(zhí)行程序。返回地址副本或被存儲在第二存儲器中,并且可以通過將偏移添加到用于第一存儲器的地址碼不產(chǎn)生第二存儲器的地址碼。這可以確保返回地址副本可以在程序棧上不被由溢出改變。這可以可能將返回地址副本復(fù)制回到第一存儲器以恢復(fù)原始的返回地址。返回指令可以基于所恢復(fù)的返回地址被正常執(zhí)行。當(dāng)程序執(zhí)行不管異常消息繼續(xù)執(zhí)行時,被處理的數(shù)據(jù)可以被損壞,并且用于處理損壞的數(shù)據(jù)的附加動作可以被應(yīng)用。
[0059]本發(fā)明可以在計算機(jī)程序中被實現(xiàn)。該程序在計算機(jī)系統(tǒng)上運行,至少包括用于當(dāng)在可編程的器件上,例如計算機(jī)系統(tǒng)或啟動可編程的器件以執(zhí)行根據(jù)本發(fā)明的器件或系統(tǒng)的功能,運行時,執(zhí)行一種根據(jù)本發(fā)明的方法的步驟的代碼部分。
[0060]計算機(jī)程序是一系列指令例如特定應(yīng)用程序和/或操作系統(tǒng)。計算機(jī)程序可能例如包括以下中的一個或多個:子程序、函數(shù)、程序、對象方法、對象實現(xiàn)、可執(zhí)行的應(yīng)用程序、小程序、小服務(wù)程序、源代碼、對象代碼、共享庫/動態(tài)裝載庫和/或設(shè)計在計算機(jī)系統(tǒng)上的執(zhí)行的其它指令序列。
[0061]計算機(jī)程序可以在計算機(jī)可讀存儲介質(zhì)上被內(nèi)部地存儲或通過計算機(jī)可讀傳輸介質(zhì)傳輸?shù)接嬎銠C(jī)系統(tǒng)。全部或一些計算機(jī)程序可以被永久地、可移除地提供在計算機(jī)可讀介質(zhì)或遠(yuǎn)程地耦合于信息過程系統(tǒng)。計算機(jī)可讀介質(zhì)可能包括,例如但不限于以下的任何數(shù)量:磁存儲介質(zhì)包括磁盤和磁帶存儲介質(zhì);光學(xué)存儲介質(zhì)例如光盤介質(zhì)(例如,CD-ROM、CD-R等等)以及數(shù)字視盤存儲介質(zhì);非易失性存儲器存儲介質(zhì)包括半導(dǎo)體存儲單元例如FLASH存儲、EEPR0M、EPR0M、ROM ;鐵磁數(shù)字存儲;MRAM ;易失性存儲介質(zhì)包括寄存器、緩沖或緩存、主存儲器、等等;以及數(shù)字傳輸介質(zhì)包括計算機(jī)網(wǎng)絡(luò)、點對點通信器件、以及載波傳輸介質(zhì),只舉幾例。
[0062]計算機(jī)過程通常包括執(zhí)行(運行)程序或程序的部分,現(xiàn)有的程序值和狀態(tài)信息,以及操作系統(tǒng)用于管理過程的執(zhí)行的資源。操作系統(tǒng)(OS)是管理一臺計算機(jī)的資源共享以及提供給程序員用于訪問這些資源的界面的軟件。操作系統(tǒng)過程系統(tǒng)數(shù)據(jù)和用戶輸入,以及通過配置和管理任務(wù)以及內(nèi)部系統(tǒng)資源作為系統(tǒng)對用戶和程序員的一項服務(wù)響應(yīng)。
[0063]計算機(jī)系統(tǒng)可能,例如,包括至少一個處理單元、關(guān)聯(lián)存儲器和大量的輸入/輸出(I/O)器件。當(dāng)執(zhí)行計算機(jī)程序時,計算機(jī)系統(tǒng)根據(jù)計算機(jī)程序過程信息并且通過I/O器件生產(chǎn)生成的輸出信息。
[0064]在前面的說明中,參照本發(fā)明實施例的特定例子已對本發(fā)明進(jìn)行了描述。然而,很明顯各種修改和變化可以在不脫離附屬權(quán)利要求中所陳述的本發(fā)明的范圍的情況下被做出。
[0065]本發(fā)明所描述的每一個信號可以被設(shè)計為正邏輯或負(fù)邏輯。在負(fù)邏輯信號的情況下,所述邏輯真狀態(tài)相當(dāng)于邏輯電平O的地方所述信號是低活性。在正邏輯信號的情況下,所述邏輯真狀態(tài)相當(dāng)于邏輯電平I的地方所述信號是高活性。注意,本發(fā)明說所描述的任何信號可以被設(shè)計為負(fù)邏輯信號或正邏輯信號。因此,在替代實施例中,那些被描述為正邏輯信號的信號可以被實施為負(fù)邏輯信號,以及那些被描述為負(fù)邏輯信號的信號可以被實施為正邏輯信號。
[0066]此外,當(dāng)將信號、狀態(tài)位、或類似的裝置分別變?yōu)槠溥壿嬚婊蜻壿嫾贍顟B(tài)時,術(shù)語“明確肯定”或“設(shè)置”以及“否定”(或“非明確肯定”或“清除”)在本發(fā)明中被使用。如果邏輯真狀態(tài)是邏輯電平“ I ”,邏輯假狀態(tài)是邏輯電平“ O ”。如果邏輯真狀態(tài)是邏輯電平“ O ”,邏輯假狀態(tài)是邏輯電平“I”。
[0067]本領(lǐng)域所屬技術(shù)人員將認(rèn)識到邏輯塊之間的界限僅僅是說明性的并且替代實施例可能合并邏輯塊或電路元件或在各種邏輯塊或電路元件上強(qiáng)加替代的分解功能。因此,應(yīng)了解本發(fā)明描述的架構(gòu)僅僅是示范的,并且事實上實現(xiàn)相同功能的很多其它架構(gòu)可以被實現(xiàn)。例如,內(nèi)核和硬件邏輯單元可以作為單一的集成電路或或者作為兩個或多個可以通過適當(dāng)?shù)倪B接被連接的單獨的電路被實現(xiàn)。
[0068]為實現(xiàn)相同功能的任何元件的布置是有效地“關(guān)聯(lián)”以便所需的功能得以實現(xiàn)。因此,為實現(xiàn)特定功能,本發(fā)明中結(jié)合在一起的任何兩個元件可以被看作彼此“相關(guān)聯(lián)”以便所需的功能得以實現(xiàn),不論架構(gòu)還是中間元件。同樣地,例如此關(guān)聯(lián)的任何兩個元件還可以被認(rèn)為是彼此被“可操作連接”或“可操作耦合”以實現(xiàn)所需的功能。
[0069]此外,本領(lǐng)域所屬技術(shù)人員將認(rèn)識到上述描述的操作功能之間的界限只是說明性的。多個操作的功能可以組合成單一操作,單一操作可以分布在附加操作中并且操作可以至少部分地在重疊的時間內(nèi)被執(zhí)行。而且,替代實施例可能包括特定操作的多個例子,并且操作的順序在各種其它實施例中會改變。
[0070]又如,在實施例中,說明的例子可以被作為位于單一集成電路上的電路或在相同器件內(nèi)的電路被實現(xiàn)。例如,處理單元可能包含了至少一個用于訪問第一存儲器和第二存儲器的存儲控制器。處理單元和存儲控制器的內(nèi)核可以位于單一集成電路上。或者,例子可以被實現(xiàn)為以一種適當(dāng)?shù)姆绞奖舜嘶ヂ?lián)的任何數(shù)量的單獨集成電路或單獨器件。例如,至少一個存儲控制器、處理單元的內(nèi)核和硬件邏輯單元可以作為單獨集成電路被實現(xiàn)。
[0071]又如,例子或其中的一部分可能作為物理電路的軟或代碼表征被實現(xiàn),或作為能夠轉(zhuǎn)化成物理電路的邏輯表征,例如在任何合適類型的硬件描述語言中被實現(xiàn)。
[0072]此外,本發(fā)明不限定在非程序化硬件中被實現(xiàn)的物理器件或單元,但也可以應(yīng)用在可編程器件或單元中。這些器件或單元通過操作能夠執(zhí)行所需的器件功能。該執(zhí)行是根據(jù)合適的程序代碼,例如,主機(jī)、微型計算機(jī)、服務(wù)器、工作站、個人電腦、筆記本、個人數(shù)字助理、電子游戲、汽車和其它嵌入式系統(tǒng)、手機(jī)和其它無線器件,在本申請中通常表示“計算機(jī)系統(tǒng)”。
[0073]然而,其它修改、變化和替代也是可能的。說明書和附圖相應(yīng)地被認(rèn)為是從說明性的而不是嚴(yán)格意義上來講的。
[0074]在權(quán)利要求中,放置在括號之間的任何參照符號不得被解釋為限定權(quán)利要求。單詞“包括”不排除其它元件或隨后在權(quán)利要求中列出的那些步驟的存在。此外,本發(fā)明所用的“a”或“an”被定義為一個或多個。并且,在權(quán)利要求中所用詞語例如“至少一個”以及“一個或多個”不應(yīng)該被解釋以暗示通過不定冠詞“a”或“an”引入的其它權(quán)利要求元件限定任何其它特定權(quán)利要求。所述特定權(quán)利要求包括這些所介紹的對發(fā)明的權(quán)利元件,所述權(quán)利元件不僅僅包括這種元件。即使當(dāng)同一權(quán)利要求中包括介紹性短語“一個或多個”或“至少一個”以及不定冠詞,例如“a”或“an”。使用定冠詞也是例如此。除非另有說明,使用術(shù)語例如“第一”以及“第二”是用于任意區(qū)分這些術(shù)語描述的元件的。因此,這些術(shù)語不一定表示時間或這些元件的其它優(yōu)先次序。某些措施在相互不同權(quán)利要求中被列舉的事實并不表示這些措施的組合不能被用于獲取優(yōu)勢。
【權(quán)利要求】
1.一種數(shù)據(jù)處理系統(tǒng)(10),包括: -處理單元(12):被布置為執(zhí)行具有至少一個跳轉(zhuǎn)指令(20)和至少一個返回指令(22)的程序(18), -第一存儲器(14),以及程序棧(24), -第二存儲器(16), 其中,所述數(shù)據(jù)處理系統(tǒng)(10)被布置為當(dāng)執(zhí)行對所述第一存儲器(14)的寫訪問時硬件保護(hù)所述第二存儲器(16), 其中所述處理單元(12) 其中所述處理單元(12)被布置為:當(dāng)執(zhí)行所述至少一個跳轉(zhuǎn)指令(20)時,在所述程序棧(24)上存儲返回地址(26)并且在所述第二存儲器(16)中存儲返回地址副本,以及當(dāng)執(zhí)行所述至少一個返回指令(22)時,將所述返回地址(26)與所述返回地址副本進(jìn)行比較。
2.根據(jù)權(quán)利要求1所述的數(shù)據(jù)處理系統(tǒng),其中所述第二存儲器(16)是內(nèi)容可尋址存儲器 CAM。
3.根據(jù)權(quán)利要求1或權(quán)利要求2所述的數(shù)據(jù)處理系統(tǒng),其中所述處理單元(12)被布置為在后進(jìn)先出方案LIFO中存儲所述返回地址副本。
4.根據(jù)前述權(quán)利要求中的一個所述的數(shù)據(jù)處理單元,其中所述處理單元(12)被布置為當(dāng)完成所述返回指令(22)時刪除所述返回地址副本。
5.根據(jù)前述權(quán)利要求中的一個所述的數(shù)據(jù)處理系統(tǒng),其中所述處理單元(12)被布置為當(dāng)所述返回地址(26)和所述返回地址副本不相同時產(chǎn)生異常消息(30)。
6.根據(jù)權(quán)利要求5所述的數(shù)據(jù)處理系統(tǒng),其中所述處理單元(12)被布置為當(dāng)所述處理單元(12)產(chǎn)生所述異常消息(30)時停止執(zhí)行所述程序(18)。
7.根據(jù)權(quán)利要求5所述的數(shù)據(jù)處理系統(tǒng), 其中所述處理單元(12)被布置為用所述返回地址副本替代所述返回地址(26),以及其中所述處理單元(12)被布置為當(dāng)所述處理單元產(chǎn)生所述異常消息(30)時基于所述返回地址副本繼續(xù)所述程序(18)。
8.根據(jù)權(quán)利要求5至7中的一個所述的數(shù)據(jù)處理系統(tǒng),其中所述處理單元(12)被布置為當(dāng)所述處理單元(12)產(chǎn)生所述異常消息(30)時產(chǎn)生日志文件。
9.根據(jù)前述權(quán)利要求中的一個所述的數(shù)據(jù)處理系統(tǒng),其中所述處理單元(12)包括被布置為執(zhí)行所述返回地址(26)與所述返回地址副本的比較的硬件邏輯單元(32)。
10.根據(jù)權(quán)利要求9所述的數(shù)據(jù)處理單元,其中所述硬件邏輯單元(32)被布置為當(dāng)所述處理單元(12)執(zhí)行所述返回指令(22)時執(zhí)行所述比較,并且其中在完成所述比較的結(jié)果之前,所述處理單元(12)繼續(xù)執(zhí)行所述程序(18)。
11.一種用于操作數(shù)據(jù)處理系統(tǒng)的方法,所述系統(tǒng)包括 -處理單元(12), -第一存儲器(14),以及 -第二存儲器(16), 當(dāng)執(zhí)行對所述第一硬件保護(hù)存儲器(14)的寫訪問時,所述方法包括所述第二存儲器(16), 由所述處理單元執(zhí)行具有至少一個跳轉(zhuǎn)指令(20)和至少一個返回指令(22)的程序(18), 由所述處理單元在所述第一存儲器(14)中存儲程序棧(24), 當(dāng)執(zhí)行所述至少一個跳轉(zhuǎn)指令(20)時,由所述處理單元在所述程序棧(24)上存儲返回地址(26)并且返回地址副本被存儲在所述第二存儲器(16)中,以及 當(dāng)執(zhí)行所述至少一個返回指令(22)時,將所述返回地址(26)與所述返回地址副本進(jìn)行比較。
12.根據(jù)權(quán)利要求11所述的方法,其中所述處理單元(12)在后進(jìn)先出方案LIFO中存儲所述返回地址副本。
13.根據(jù)權(quán)利要求11或12所述的方法,其中當(dāng)完成所述返回指令(22)時,所述處理單元(12)刪除所述返回地址副本。
14.根據(jù)權(quán)利要求11至13中的一個所述的方法,其中當(dāng)所述返回地址(26)和所述返回地址副本不同時,所述處理單元(12)產(chǎn)生異常消息(30)。
15.根據(jù)權(quán)利要求14所述的方法,其中當(dāng)所述處理單元(12)產(chǎn)生所述異常消息(30)時,所述處理單元停止執(zhí)行所述程序(18)。
16.根據(jù)權(quán)利要求14所述的方法, 其中所述處理單元(12)用所述返回地址副本替代所述返回地址(26),以及 其中當(dāng)所述處理單元(12)產(chǎn)生所述異常消息(30)時,所述處理單元(12)基于所述返回地址副本繼續(xù)所述程序(18)。
17.根據(jù)權(quán)利要求14至16中的一個所述的方法,其中當(dāng)所述處理單元(12)產(chǎn)生所述異常消息(30)時,所述處理單元產(chǎn)生日志文件。
18.根據(jù)前述權(quán)利要求中的一個所述的方法,其中所述處理單元(12)包括當(dāng)所述處理單元(12)執(zhí)行所述返回指令(22)時執(zhí)行所述比較的硬件邏輯單元(32),以及其中在完成所述比較的結(jié)果之前,所述處理單元(12)繼續(xù)執(zhí)行所述程序(18)。
19.一種計算機(jī)程序產(chǎn)品,包括當(dāng)由可編程裝置執(zhí)行時執(zhí)行根據(jù)權(quán)利要求11至18中的一個所述的方法的代碼部分。
【文檔編號】G06F12/16GK104246727SQ201280072608
【公開日】2014年12月24日 申請日期:2012年4月23日 優(yōu)先權(quán)日:2012年4月23日
【發(fā)明者】丹尼爾·約內(nèi)爾·科斯廷 申請人:飛思卡爾半導(dǎo)體公司