專利名稱:處理器擴(kuò)展和軟件驗(yàn)證的制作方法
技術(shù)領(lǐng)域:
本發(fā)明的領(lǐng)域總地涉及計(jì)算機(jī)系統(tǒng),更具體地但非排他地,本發(fā)明涉及支持和非可信(untrusted)代碼一起運(yùn)行的可信(trusted)(例如,類型安全)語言環(huán)境的處理器擴(kuò)展和軟件驗(yàn)證。
背景技術(shù):
今天的大多數(shù)軟件是用“不安全的”語言寫的,例如C或C++,使用指向特定處理器指令集體系結(jié)構(gòu)的編譯器將所述軟件編譯為本機(jī)機(jī)器碼。這些語言是不安全的,因?yàn)樗鼈兙哂型ㄟ^內(nèi)置功能(即,指針間接尋址和操縱)、擴(kuò)展或者內(nèi)部匯編來進(jìn)行直接的、未經(jīng)檢查的存儲器操縱或訪問的規(guī)定。例如,用于特定的不安全應(yīng)用模塊的存儲器操作可能會實(shí)際上改變在被分配給另一個應(yīng)用模塊的一部分存儲器地址空間中的存儲器。這可能導(dǎo)致由其他應(yīng)用產(chǎn)生的文檔的損壞,或者系統(tǒng)崩潰,以及其他不期望的后果。因此,上述語言所生成的本機(jī)碼是不值得相信的。
今天的模塊化代碼環(huán)境進(jìn)一步加劇了代碼安全性問題。隨著操作系統(tǒng)和軟件程序?qū)で筇峁└迂S富的特性,它們正變得更加模塊化。它們越來越是從通常由不同的團(tuán)隊(duì)獨(dú)立開發(fā)出來的組件中搭建而成的。這產(chǎn)生了從具有不同可信度級別的組件中搭建而成的程序包。例如,雖然操作系統(tǒng)(OS)的內(nèi)核可以包含可信碼,但是它與由第三方供應(yīng)商編寫的設(shè)備驅(qū)動程序相接口。一般而言,OS供應(yīng)商無法驗(yàn)證第三方供應(yīng)商的可信度。這造成了操作系統(tǒng)中信任邊界的劃界(delineation)。此外,運(yùn)行在操作系統(tǒng)上的應(yīng)用也可以具有這樣一種信任邊界的劃界。
更具體地,很多大的應(yīng)用都使用動態(tài)鏈接庫(DLL),這些庫通常是由獨(dú)立的軟件供應(yīng)商開發(fā)的。例如,瀏覽器通常使用一定量的插件,這些插件是由完全獨(dú)立的供應(yīng)商開發(fā)出來的。在如今的很多程序環(huán)境中使用的大量第三方模塊通常使得要確定環(huán)境是否完全安全變得不切實(shí)際,甚至不可能。
用于解決代碼安全性問題的一種技術(shù)就是使用類型安全(type-safe)語言。例如,Java和C#就是類型安全語言,它們不允許直接的存儲器操縱。相反,這些語言運(yùn)行在平臺相關(guān)的虛擬機(jī)(例如,Java虛擬機(jī)或者說JVM)上,虛擬機(jī)管理著與處理器和/或操作系統(tǒng)之間的所有存儲器接口。虛擬機(jī)提供了平臺無關(guān)的編程語言和平臺專用的處理器指令集體系結(jié)構(gòu)之間的抽象級。實(shí)際上,諸如JAVA的平臺無關(guān)語言不支持直接的存儲器操縱或訪問。
雖然Java和C#不允許直接存儲器操縱,但是它們經(jīng)常需要與這樣做的代碼或模塊相接口。例如,經(jīng)常需要訪問平臺無關(guān)語言不支持的低級系統(tǒng)功能(例如,向監(jiān)視器輸出數(shù)據(jù))。因此,Java和C#兩者都提供擴(kuò)展以支持對用不安全語言編寫的模塊或代碼的調(diào)用。由此,這樣一種“混合”程序代碼不再被認(rèn)為是固有安全的。這危及到程序代碼的可信度。
發(fā)明內(nèi)容
為解決以上問題,本發(fā)明公開了支持與非可信代碼一起運(yùn)行的類型安全語言環(huán)境的處理器擴(kuò)展和軟件驗(yàn)證。
根據(jù)本發(fā)明的一個方面,提供了一種方法,包括將分配給應(yīng)用的代碼空間劃分成可信區(qū)和非可信區(qū);為位于所述可信區(qū)和非可信區(qū)中的指令定義被允許的操作;確定當(dāng)前指令是位于所述可信區(qū)中還是位于所述非可信區(qū)中;以及基于所述當(dāng)前指令所在的區(qū)以及為這一區(qū)中的指令所定義的允許操作,確定所述當(dāng)前指令所定義的操作是否被允許執(zhí)行。
根據(jù)本發(fā)明的另一方面,提供了一種方法,包括將分配給應(yīng)用的代碼空間劃分成可信區(qū)和非可信區(qū);將分配給所述應(yīng)用的數(shù)據(jù)空間劃分成可信區(qū)和非可信區(qū);基于請求存儲器訪問的代碼在所述代碼空間中的位置以及與所述存儲器訪問相關(guān)的數(shù)據(jù)在所述數(shù)據(jù)空間中的位置,定義可允許的存儲器訪問操作;確定發(fā)出存儲器訪問請求的代碼的位置以及被請求訪問的數(shù)據(jù)的位置;以及基于請求所述存儲器訪問的代碼的位置以及被請求訪問的數(shù)據(jù)的位置,如可允許的存儲器訪問操作所定義的那樣,確定所述存儲器訪問請求是否將被允許。
根據(jù)本發(fā)明的又一方面,提供了一種處理器,包括指令指針;以下之一,代碼空間SRR寄存器,該寄存器存儲代碼空間的可信區(qū)偏移或者指向所述代碼空間的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述代碼空間中在可信區(qū)和非可信區(qū)之間的邊界;或者,兩個代碼空間安全區(qū)寄存器(SRR)寄存器,所述兩個寄存器存儲的數(shù)據(jù)指定了與所述代碼空間的所述可信區(qū)相對應(yīng)的地址范圍;實(shí)行代碼序列真值表的機(jī)制,其中所述代碼序列真值表定義了與存儲在所述代碼空間的所述可信區(qū)和所述非可信區(qū)中的指令相對應(yīng)的可允許和不允許的指令序列;以及響應(yīng)于檢測到不允許的指令序列而投出安全陷阱的機(jī)制。
根據(jù)本發(fā)明的另外一方面,還提供了一種處理器,包括代碼段寄存器;數(shù)據(jù)段寄存器;指令指針;代碼段安全區(qū)寄存器,也被稱為代碼段SRR寄存器,該寄存器存儲代碼段的可信區(qū)偏移或指向所述代碼段的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述代碼段中在可信區(qū)和非可信區(qū)之間的邊界;數(shù)據(jù)段SRR寄存器,該寄存器存儲數(shù)據(jù)段的可信區(qū)偏移或指向所述數(shù)據(jù)段的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述數(shù)據(jù)段中在可信區(qū)和非可信區(qū)之間的邊界;實(shí)行存儲器訪問真值表的機(jī)制,其中所述存儲器訪問真值表對應(yīng)于請求所述存儲器訪問的代碼在所述代碼段中的位置以及被請求進(jìn)行存儲器訪問的數(shù)據(jù)在所述數(shù)據(jù)段中的位置,定義了可允許的和不允許的存儲器訪問操作;以及響應(yīng)于檢測到不允許的存儲器訪問操作而投出安全陷阱的機(jī)制。
根據(jù)本發(fā)明的又一方面,提供了一種系統(tǒng),包括主板,該主板至少包括一個可安裝存儲器的套接口;以及耦合到所述主板的處理器,所述處理器包括指令指針;以下之一,代碼空間SRR寄存器,該寄存器存儲代碼空間的可信區(qū)偏移或者指向所述代碼空間的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述代碼空間中在可信區(qū)和非可信區(qū)之間的邊界;或者,兩個代碼空間SRR寄存器,所述兩個寄存器存儲的數(shù)據(jù)指定了與所述代碼空間的所述可信區(qū)相對應(yīng)的地址范圍;實(shí)行代碼序列真值表的機(jī)制,其中所述代碼序列真值表定義了與存儲在所述代碼空間的所述可信區(qū)和所述非可信區(qū)中的指令相對應(yīng)的可允許和不允許的指令序列;以及響應(yīng)于檢測到不允許的指令序列而投出安全陷阱的機(jī)制。
結(jié)合附圖,參考以下詳細(xì)的描述,本發(fā)明的以上方面以及相關(guān)優(yōu)點(diǎn)將變得更加容易明白,同時將更好地得到理解,其中除非特別指出,否則在不同的圖中,相同的標(biāo)號代表相同的部分圖1是根據(jù)本發(fā)明一種實(shí)施方案的存儲器分區(qū)方案的示意圖,該方案將代碼空間和數(shù)據(jù)空間劃分成可信區(qū)和非可信區(qū);圖2a是根據(jù)本發(fā)明一種實(shí)施方案的存儲器訪問真值表的圖,該表與圖1中的存儲器分區(qū)方案一同實(shí)施;圖2b是根據(jù)本發(fā)明一種實(shí)施方案的代碼序列真值表的圖,該表與圖1中的存儲器分區(qū)方案一同實(shí)施;圖3a是根據(jù)本發(fā)明一種實(shí)施方案的處理器體系結(jié)構(gòu)的示意圖,該體系結(jié)構(gòu)經(jīng)由一組范圍寄存器和安全區(qū)寄存器(SRR)寄存器而支持圖1的存儲器分區(qū)方案的各方面;圖3b是根據(jù)本發(fā)明一種實(shí)施方案的處理器體系結(jié)構(gòu)的示意圖,該體系結(jié)構(gòu)經(jīng)由一組SRR寄存器而支持圖1的存儲器分區(qū)方案的各方面;圖3c是根據(jù)本發(fā)明一種實(shí)施方案的處理器體系結(jié)構(gòu)的示意圖,該體系結(jié)構(gòu)經(jīng)由一組段寄存器和SRR寄存器而支持圖1的存儲器分區(qū)方案的各方面;圖4a的示意圖進(jìn)一步圖示了圖3a的體系結(jié)構(gòu)的細(xì)節(jié),其中范圍寄存器被用來使用線性編址定義代碼空間和數(shù)據(jù)空間的基地址和偏移地址,SRR寄存器被用來定義在代碼和數(shù)據(jù)空間的可信區(qū)和非可信區(qū)之間的邊界的位置;圖4b的示意圖進(jìn)一步圖示了圖3b的體系結(jié)構(gòu)的細(xì)節(jié),其中SRR寄存器被用來使用線性編址定義代碼空間和數(shù)據(jù)空間的可信區(qū)的起始地址和結(jié)束地址;圖4c的示意圖進(jìn)一步圖示了圖3c的體系結(jié)構(gòu)的細(xì)節(jié),其中段寄存器被用來使用分段編址定義代碼段和數(shù)據(jù)段的基地址和偏移地址,SRR寄存器被用來定義在代碼段和數(shù)據(jù)段的可信區(qū)和非可信區(qū)之間的邊界的位置;
圖5是圖示了圖1的存儲器分區(qū)方案的示例性實(shí)現(xiàn)方式的示意圖;圖6a是圖示了根據(jù)本發(fā)明的一種實(shí)施方案,在非可信存儲器訪問過程中基于所述存儲器分區(qū)方案所執(zhí)行的操作和邏輯的流程圖;圖6b是進(jìn)一步圖示了圖6a中的非可信存儲器訪問過程的細(xì)節(jié);圖7是擴(kuò)展Java框架的示意圖,該框架進(jìn)一步包括被用于應(yīng)用安全策略的動態(tài)驗(yàn)證器,所述安全策略確定某些存儲器和代碼訪問是否被允許;圖8是根據(jù)本發(fā)明一種實(shí)施方案的、可允許的存儲器訪問的示意圖,所述可允許的存儲器訪問包括安全指令訪問非可信存儲器;圖9是根據(jù)本發(fā)明一種實(shí)施方案的、可允許的存儲器訪問的示意圖,所述可允許的存儲器訪問包括安全指令訪問可信存儲器;圖10是根據(jù)本發(fā)明一種實(shí)施方案的、可允許的存儲器訪問的示意圖,所述可允許的存儲器訪問包括不安全的指令訪問非可信存儲器;圖11a是圖示了根據(jù)本發(fā)明的一種實(shí)施方案,在非可信代碼序列過程中基于所述存儲器分區(qū)方案而執(zhí)行的操作和邏輯的流程圖;圖11b是進(jìn)一步圖示了圖11a中的非可信代碼序列過程的細(xì)節(jié)的示意圖;圖12是根據(jù)本發(fā)明的一種實(shí)施方案,進(jìn)一步包括非可信區(qū)的信任粒度(granularity)的存儲器分區(qū)方案的示意圖;以及圖13是其上可以實(shí)現(xiàn)本發(fā)明的各個實(shí)施方案的示例性計(jì)算機(jī)系統(tǒng)的示意圖。
具體實(shí)施例方式
這里描述的是用于支持與非可信代碼一起運(yùn)行的類型安全語言環(huán)境的方法、裝置和系統(tǒng)的實(shí)施方案。在以下描述中,闡述了很多具體的細(xì)節(jié),以提供對本發(fā)明的實(shí)施方案的完整理解。但是本領(lǐng)域的技術(shù)人員將會認(rèn)識到,沒有這些具體細(xì)節(jié)中的一個或多個細(xì)節(jié),或者利用其他方法、組件、材料等也可以實(shí)現(xiàn)本發(fā)明。此外,沒有詳細(xì)示出或描述公知的結(jié)構(gòu)、材料或操作,以免模糊了本發(fā)明的各個方面。
在這篇說明書中提及“一種實(shí)施方案”或者“實(shí)施方案”是指與該實(shí)施方案相關(guān)描述的具體特征、結(jié)構(gòu)或特性被包括在本發(fā)明的至少一種實(shí)施方案中。因此,短語“在一種實(shí)施方案中”或者“在實(shí)施方案中”在這篇說明書中不同地方的出現(xiàn)不一定都是指同一實(shí)施方案。此外,可以在一種或多種實(shí)施方案中,以任何適當(dāng)?shù)姆绞綄⒕唧w的特征、結(jié)構(gòu)或特性組合起來。
根據(jù)這里描述的實(shí)施方案的各個方面,公開了用于支持實(shí)現(xiàn)非安全代碼擴(kuò)展的類型安全語言環(huán)境的技術(shù)。如在此所使用,在這些環(huán)境中實(shí)現(xiàn)的軟件被稱為NUT(非一致可信)軟件,它指的是從具有不同級別可信度的組件中創(chuàng)建的軟件包。
NUT軟件的潛在有害行為在受管理的運(yùn)行時間環(huán)境中變得愈發(fā)顯著,所述受管理的運(yùn)行時間環(huán)境例如是Java和CLI(公共語言基礎(chǔ)結(jié)構(gòu),被用在微軟公司的.NET編程框架中)。這些環(huán)境主要是基于類型安全編程語言,例如Java和C#。類型安全性要求運(yùn)行時間系統(tǒng)至少提供以下保證存儲器安全性這意味著應(yīng)用代碼只可以進(jìn)行“合法的”存儲器訪問。這暗示了它不能訪問未分配的存儲器區(qū)域,并且不能讀取已被初始化的變量。這還意味著它不能用不兼容類型的值來更新變量,例如將一個浮點(diǎn)值寫入整數(shù)變量;以及控制流安全性這意味著應(yīng)用代碼不能跳到任意的存儲器位置,而只能跳到定義明確的入口點(diǎn)。這還意味著返回地址無法被仿造。
為了保證這些性質(zhì),類型安全語言必須禁止在諸如C和C++的不安全語言中可能存在的某些操作。這方面的例子包括指針?biāo)阈g(shù)運(yùn)算、取得變量的地址、比特“彈撥”(bit fiddling)等等。另一方面,這些操作經(jīng)常為低級系統(tǒng)功能所需要。因此,這些語言提供了一種機(jī)制(在Java中,這被稱為本機(jī)方法接口),該機(jī)制讓類型安全程序調(diào)用代碼用不安全(例如,非類型安全的)語言來編寫。用不安全語言編寫的代碼通常被稱為本機(jī)碼(native code)(但這不應(yīng)該與本機(jī)機(jī)器碼(native machine code)混淆,其中不安全語言最終被編譯為本機(jī)機(jī)器碼)。
即使并非全部,也是在絕大多數(shù)情況下,用類型安全語言編寫的企業(yè)級應(yīng)用使用本機(jī)碼來訪問系統(tǒng)功能。繼而,這用可信組件和非可信組件的混合創(chuàng)建了一個軟件包。雖然類型安全的部分被機(jī)械地驗(yàn)證并保證是安全的,但是本機(jī)碼卻得不到這樣的保證。
任何應(yīng)用僅與其最弱的鏈接一樣安全。結(jié)果,NUT軟件通常都通過它的非可信組件而受到損害。舉例來說,類型安全的Java應(yīng)用可以很容易地被損壞的本機(jī)碼暗中破壞;編程語言的內(nèi)置安全性在這里沒有用。
根據(jù)一種實(shí)施方案,通過實(shí)施存儲器分區(qū)方案來解決代碼安全性,其中可信的類型安全代碼以及該代碼所操作的數(shù)據(jù)與非可信的非類型安全代碼相互隔離。在一種實(shí)施方案中,存儲器分區(qū)方案將代碼和數(shù)據(jù)劃分到獨(dú)立的地址空間中,然后將這些地址空間再劃分為可信區(qū)和非可信區(qū)。例如,圖1示出了根據(jù)本發(fā)明一種實(shí)施方案的存儲器分區(qū)方案,其中代碼空間100和數(shù)據(jù)空間102中的每一個都被劃分為可信區(qū)和非可信區(qū)??偟貋碚f,代碼空間100和數(shù)據(jù)空間102中的每一個占據(jù)了處理核(例如微處理器)可訪問的存儲器地址空間中的獨(dú)立地址范圍。在一種實(shí)施方案中,存儲器地址空間是平坦(即,線性)地址空間,可以使用虛擬地址方案、物理地址方案或者以上兩者的組合來對該空間進(jìn)行編址。在另一種實(shí)施方案中,存儲器地址空間采用分段地址方案。
在代碼空間100和數(shù)據(jù)空間102的每一個中,非可信區(qū)占據(jù)著空間地址范圍中從(相應(yīng)空間的)基地址到可信區(qū)偏移(地址)之間的部分,而可信區(qū)占據(jù)著地址空間中從可信區(qū)偏移到所述空間的上限地址的部分。因此,可信區(qū)偏移代表了可信區(qū)和非可信區(qū)之間的邊界。占據(jù)代碼空間100的非可信區(qū)的指令被視為不安全的,因而非可信的,而占據(jù)代碼空間的可信區(qū)的指令被視為安全的,因而可信的。類似地,占據(jù)數(shù)據(jù)空間102的非可信區(qū)的數(shù)據(jù)被視為非可信的,而占據(jù)數(shù)據(jù)空間的可信區(qū)的數(shù)據(jù)被視為可信的。
下面描述的技術(shù)適用于兩類處理操作1)存儲器(即,數(shù)據(jù))訪問;和2)代碼排序。在圖2a中示出了根據(jù)一種實(shí)施方案的存儲器訪問真值表200。所述真值表包含兩列代碼列和數(shù)據(jù)列。代碼列表示被執(zhí)行來引起存儲器訪問的代碼的類型(即,可信的或非可信的)。數(shù)據(jù)列表示占據(jù)存儲器地址空間中正被訪問部分的數(shù)據(jù)的類型。
如存儲器訪問真值表200所示,可信代碼(即存儲在代碼空間100的可信區(qū)中的指令)被允許直接訪問數(shù)據(jù)空間102中存儲的任何數(shù)據(jù)。另外,盡管非可信代碼被允許直接訪問數(shù)據(jù)空間102中存儲的非可信區(qū)的數(shù)據(jù),它不能直接訪問在數(shù)據(jù)空間102的可信區(qū)中的數(shù)據(jù)??商娲?,首先應(yīng)用安全策略來確定是否允許該存儲器訪問。
圖2b中所示的代碼序列真值表202具有相似的邏輯。在這個實(shí)例中,第二列(N)標(biāo)識出當(dāng)前(即,第N條)指令的信任類型,而第一列(N-1)標(biāo)識出在當(dāng)前指令之前的指令的信任類型。真值表邏輯如下。在可信指令之后的任何類型的指令被允許直接執(zhí)行。類似地,在另一條非可信指令之后的非可信指令被允許直接執(zhí)行。然而,在非可信指令之后的可信指令在不首先應(yīng)用安全策略的情況下,不被允許執(zhí)行。根據(jù)安全策略的結(jié)果,指令序列可能被允許,也可能不被允許繼續(xù)前進(jìn)。
剩余的描述和附圖都和在圖1、2a和2b中圖示的數(shù)據(jù)訪問和代碼執(zhí)行方案的更具體實(shí)現(xiàn)方式相關(guān)。總地來說,對于使得數(shù)據(jù)和代碼能夠占據(jù)各自地址空間的處理器而言,都可以實(shí)現(xiàn)所述方案。出于圖示說明的目的,以下實(shí)施例定義了專用名稱寄存器的使用,這些寄存器可被用在一個或多個具體的處理器中。然而將會理解,這不是限制性的,因?yàn)檫@里所描述的原理和技術(shù)可應(yīng)用于采用不同寄存器配置的處理器。
圖3a中示出了用于示例性處理器300的基本執(zhí)行體系結(jié)構(gòu)(有關(guān)存儲器訪問和通用指令執(zhí)行)的一部分。所述體系結(jié)構(gòu)提供了各種基本程序執(zhí)行寄存器,以供在通常的系統(tǒng)和應(yīng)用編程中使用。這些寄存器被分組為一組通用寄存器302、一組范圍寄存器304、一組安全區(qū)寄存器(SRR)寄存器306、程序狀態(tài)和控制寄存器(EFLAGS)308和EIP(指令指針)寄存器310。通用寄存器302可用于存儲操作數(shù)和指針。范圍寄存器304用于映射存儲器地址空間312中的代碼和數(shù)據(jù)空間,下面將更詳細(xì)地解釋。在EFLAGS寄存器308中的位被用來報告有關(guān)正在被執(zhí)行的程序的狀態(tài),并且實(shí)現(xiàn)對處理器的有限(應(yīng)用程序級的)控制。EIP寄存器310包含指向?qū)⒁獔?zhí)行的下一指令的指針。在一種實(shí)施方案中,所述體系結(jié)構(gòu)還包括存儲器執(zhí)行單元(MEU)314。
處理器在其總線上尋址的存儲器被稱為物理存儲器。物理存儲器被配置為物理地址空間(這里也被稱為存儲器地址空間),該空間具有總地跨越在等于0的基地址和上限地址空間之間的地址范圍,所述上限地址空間取決于(當(dāng)采用物理編址方案時)被用來訪問物理存儲器的位的數(shù)量。例如,32位編址的物理地址空間的范圍從0一直到232-1的最大值(4Gbytes)。類似地,64位編址的物理地址空間的范圍從0一直到264-1的最大值。
在一些情況下,操作系統(tǒng)(OS)或者執(zhí)行程序?qū)⑹褂锰幚砥鞯拇鎯ζ鞴芾頇C(jī)構(gòu)來訪問存儲器。在一些實(shí)施方案中,這些機(jī)構(gòu)提供諸如分段和分頁的特性,這使得存儲器可被有效并可靠地管理。在其他情況下,從OS中提取出基本的物理編址方案,其中使用虛擬地址方案來引用所有的存儲器地址。至少部分地由MEU312來執(zhí)行用于支持這些類型功能的存儲器翻譯操作。當(dāng)采用處理器300的存儲器管理機(jī)構(gòu)時,程序并不直接對物理存儲器進(jìn)行尋址。相反,它們使用一種或多種存儲器模型來訪問存儲器,例如平坦、分段或?qū)嶋H地址模式。
在平坦存儲器模型中,如地址空間312所示,存儲器對于程序而言看起來像單個連續(xù)的地址空間,被稱為線性地址空間。代碼、數(shù)據(jù)和過程堆棧全都包含在這個地址空間中。線性地址空間是字節(jié)可尋址的,地址從0一直持續(xù)到上限(例如,對于32位而言是232-1,對于64位而言是264-1)。用于線性地址空間中任何字節(jié)的地址都被稱為線性地址。
圖3b的實(shí)施方案圖示了圖3a中配置的一種改變。在這個實(shí)施方案中,處理器300B包括一組SRR寄存器307,其中包括被用來定義代碼空間和數(shù)據(jù)空間的地址范圍的各對起始和結(jié)束SRR寄存器。
除了使用平坦存儲器模型外,各實(shí)施方案還可以使用分段存儲器模型來實(shí)現(xiàn)。例如,圖3c中的處理器300c具有被配置為支持分段存儲器的體系結(jié)構(gòu)。該體系結(jié)構(gòu)與圖3a中的上述結(jié)構(gòu)類似,除了用段寄存器305替換范圍寄存器304以外。
根據(jù)各實(shí)施方案進(jìn)一步的各個方面,現(xiàn)在公開用于為使用線性存儲器地址模型和分段存儲器模型兩者的NUT軟件安全地管理執(zhí)行和存儲器訪問的技術(shù)??偟貋碚f,所述實(shí)施方案采用的寄存器機(jī)構(gòu)圖示了可被用來存儲與所述實(shí)施方案的操作有關(guān)的信息的示例性寄存器。將會理解的是,這里所描述的特定寄存器的功能也可以用其他類型的寄存器來完成。此外,現(xiàn)有的及未來的處理器體系結(jié)構(gòu)可被用來支持這里所描述的對安全的執(zhí)行和存儲器訪問操作的管理。
圖4a中所描繪的體系結(jié)構(gòu)400A示出了圖3a的范圍寄存器304和SRR寄存器306如何被用來映射代碼和數(shù)據(jù)空間中的可信區(qū)和非可信區(qū)的進(jìn)一步細(xì)節(jié)。(為清楚起見,圖4a-c的實(shí)施方案僅示出了范圍寄存器或者段寄存器和/或SRR寄存器。將會理解的是,這些體系結(jié)構(gòu)的實(shí)施方案在適當(dāng)?shù)牡胤竭M(jìn)一步包括圖3a和3b中所示出的組件。)范圍寄存器304包括代碼空間(CS)基址寄存器402、CS偏移寄存器404、數(shù)據(jù)空間(DS)基址寄存器406和DS偏移寄存器408。正如它們的名字所暗示的那樣,CS基址寄存器402存儲代碼空間410的基地址,而CS偏移寄存器404存儲代碼空間410的范圍偏移量(即,大小)。類似地,基址寄存器406存儲數(shù)據(jù)空間412的基地址,而DS偏移寄存器408存儲數(shù)據(jù)空間412的范圍偏移量(即,大小)。
在圖3a和4a的實(shí)施方案中,SRR寄存器306被用于存儲在代碼和數(shù)據(jù)空間中將可信區(qū)與非可信區(qū)分割開的邊界的位置。這些包括CS-SRR寄存器414和DS-SRR寄存器416。CS-SRR寄存器414被用來為對應(yīng)于代碼空間410的地址空間定義可信區(qū)偏移418。類似地,DS-SRR寄存器416被用來為對應(yīng)于數(shù)據(jù)空間412的地址空間定義可信區(qū)偏移420??傊?,CS-SRR寄存器414和DS-SRR寄存器416的位寬度可以根據(jù)具體的分區(qū)方案以及所期望的地址粒度而變。在一種實(shí)施方案中,CS-SRR寄存器414和DS-SRR寄存器416是16位寄存器。此外,存儲在CS-SRR寄存器414和DS-SRR寄存器416每一個當(dāng)中的值可以包括線性偏移、倍乘偏移、或者指向線性偏移或倍乘偏移的存儲位置的指針。
圖4b中所描繪的體系結(jié)構(gòu)400B示出了圖3b的SRR寄存器307被用于映射代碼和數(shù)據(jù)空間中的可信區(qū)的進(jìn)一步細(xì)節(jié)。SRR寄存器包括可信代碼空間(TCS)起始SRR寄存器430和TCS結(jié)束SRR寄存器432,其中TCS起始SRR寄存器430被用來定位代碼空間410的可信區(qū)的起始處,而TCS結(jié)束SRR寄存器432被用來定位可信代碼空間區(qū)的結(jié)束處。類似地,可信數(shù)據(jù)空間(TDS)起始SRR寄存器434被用來定位數(shù)據(jù)空間412的可信區(qū)的起始處,而TDS結(jié)束SRR寄存器436被用來定位可信數(shù)據(jù)空間區(qū)的結(jié)束處。
圖4c中示出的體系結(jié)構(gòu)400C圖示了圖3c的分段存儲器實(shí)施方案的進(jìn)一步細(xì)節(jié)。這個實(shí)施方案大致類似于圖4a的實(shí)施方案,除了用段寄存器305取代了范圍寄存器304之外。在圖示的實(shí)施方案中,段寄存器對應(yīng)于IA-32體系結(jié)構(gòu)處理器的段寄存器,并且包括代碼段(CS)、數(shù)據(jù)段(DS)、堆棧段(SS)和其他段寄存器ES、FS和GS。然而,這僅僅是示例性的,也可以使用其他的段寄存器體系結(jié)構(gòu)。
使用分段存儲器模型,存儲器對于程序而言看起來像一組被稱為段的獨(dú)立地址空間。當(dāng)使用這種模型時,代碼、數(shù)據(jù)和堆棧一般都包含在單獨(dú)的段中。為了尋址某個段中的一個字節(jié),程序發(fā)出邏輯地址,該地址由段選擇子(selector)和偏移組成。(邏輯地址通常被稱為遠(yuǎn)指針。)段選擇子標(biāo)識出所要訪問的段,而偏移則標(biāo)識出在所述段的地址空間中的一個字節(jié)。在一些實(shí)施方案中,段可以被定義為具有不同的大小和類型。
內(nèi)在地,為一個系統(tǒng)定義的所有段都被映射到處理器的線性地址空間中。為了訪問一個存儲器位置,處理器因而要將每一個邏輯地址翻譯成線性地址。這個翻譯過程對于應(yīng)用程序而言是透明的。
當(dāng)使用分段存儲器模型時,一般用不同的段選擇子來加載每個段寄存器,使得每個段寄存器指向線性地址空間中的不同段。為了訪問未被段寄存器之一指向的段,程序必須首先將用于所要訪問的段的段選擇子加載到段寄存器中。
IA-32段寄存器(CD、DS、SS、ES、FS和GS)保存16位的段選擇子。段選擇子是標(biāo)識出存儲器中某個段的特殊指針。為了訪問存儲器的特定段,用于該段的段選擇子必須存在于適當(dāng)?shù)亩渭拇嫫髦小.?dāng)編寫應(yīng)用代碼時,程序員一般用匯編命令和符號來創(chuàng)建段選擇子。匯編器和其他工具然后創(chuàng)建與這些命令和符號相關(guān)聯(lián)的實(shí)際段選擇子值。
每一個段寄存器都與三類存儲之一相關(guān)聯(lián)代碼、數(shù)據(jù)或堆棧。例如,CS寄存器包含用于代碼段的段選擇子,在該寄存器中存儲正在執(zhí)行的指令。處理器使用由CS寄存器中的段選擇子和EIP寄存器中的內(nèi)容組成的邏輯地址,從代碼段中取回指令。EIP寄存器包含著所要執(zhí)行的下一指令的代碼段內(nèi)的偏移。
在圖3c和4c的實(shí)施方案的技術(shù)中,代碼空間由代碼段450來定義,所述代碼段450具有基地址和由距離基地址的偏移量所指定的上限。類似地,數(shù)據(jù)空間由數(shù)據(jù)段452來定義,所述數(shù)據(jù)段452具有基地址和由距離基地址的偏移量所指定的上限。代碼段(CS)寄存器454被用來定位代碼段450。更具體地,CS寄存器454中的值包含著指向以下數(shù)據(jù)結(jié)構(gòu)的指針(全局描述符表(GDT)條目——未示出),所述數(shù)據(jù)結(jié)構(gòu)包含代碼段450的基地址并且定義了所述代碼段的上限(大小)。類似地,數(shù)據(jù)段(DS)寄存器456中的值包含了指向GDT條目的指針,所述GDT條目包含數(shù)據(jù)段452的基地址和大小。
和圖3a和4a的實(shí)施方案一樣,CS-SRR寄存器414通過定義距離代碼段450的基地址的可信區(qū)偏移418,被用來定位代碼空間的可信區(qū)和非可信區(qū)之間的邊界。類似地,DS-SRR寄存器416被用來定義距離數(shù)據(jù)段452的基地址的可信區(qū)偏移420。
在一種實(shí)施方案中,具有給定信任級的代碼被允許直接訪問具有相同信任級的數(shù)據(jù)。另外,具有更高信任級的代碼被允許直接訪問具有較低信任級的數(shù)據(jù)。然而,在一種實(shí)施方案中,不允許具有較低信任級的代碼直接訪問具有較高信任級的數(shù)據(jù)。相反,執(zhí)行線程被引導(dǎo)來調(diào)用安全策略組件,該組件被用來確定是否允許存儲器訪問或代碼序列操作繼續(xù)。
對于以下實(shí)施例,將使用在圖5中示出的代碼和存儲器使用情形。在這種配置下,存儲器被分配為代碼空間500和數(shù)據(jù)空間502。代碼空間包括可信區(qū)504和非可信區(qū)506。類似地,數(shù)據(jù)空間包括可信區(qū)508和非可信區(qū)510。
正如其名稱所暗示的那樣,可信代碼(即指令)被加載到代碼空間的可信區(qū)中。在一種實(shí)施方案中,可信代碼將包括由類型安全語言(例如,但不限于Java或C#)生成的代碼。例如,應(yīng)用代碼512可以包括Java小應(yīng)用程序或應(yīng)用程序。同時,非可信代碼被加載到代碼空間的非可信區(qū)中。典型地,非可信代碼將包括用不安全語言編寫的代碼,例如但不限于C、C++和匯編語言。另外,非可信代碼可以包括由第三方編寫的代碼,例如動態(tài)鏈接庫。如圖5所示,在這個實(shí)施例中的非可信代碼包括用于兩個DLL的代碼,包括DLL-1代碼514和DLL-2代碼516,還有本機(jī)碼模塊518。
當(dāng)啟動應(yīng)用的一個實(shí)例時,操作系統(tǒng)將為該實(shí)例分配代碼和數(shù)據(jù)空間。在未分段存儲器的情況下,代碼空間和數(shù)據(jù)空間將包括用于系統(tǒng)存儲器的線性地址空間的若干部分。在存儲器分段的情況下,操作系統(tǒng)將為所述實(shí)例分配代碼和數(shù)據(jù)段。因此,代碼空間500將對應(yīng)于被分配給所述應(yīng)用的代碼空間(線性編址)或代碼段(分段編址),而數(shù)據(jù)空間502將對應(yīng)于被分配給所述應(yīng)用的數(shù)據(jù)空間(線性編址)或數(shù)據(jù)段(分段編址)。在傳統(tǒng)的方案下,使用全局描述符表(GDT)中由CS寄存器值(即,CS段選擇子)標(biāo)識的條目來指定代碼段的大小以及該代碼段的基地址。因而從基地址加上所述大小的結(jié)果導(dǎo)出對應(yīng)于代碼段上限的邏輯地址。在這里所教導(dǎo)的存儲器分區(qū)技術(shù)的一種實(shí)施方案下,用于代碼空間的可信區(qū)偏移的值也由操作系統(tǒng)來分配,并被存儲在CS-SRR寄存器414中,而用于數(shù)據(jù)空間的可信區(qū)偏移的值也被分配并存儲在DS-SRR寄存器416中。在一種實(shí)施方案中,應(yīng)用框架(例如JVM)提供了一種用于定義代碼段的哪些部分由可信區(qū)和非可信區(qū)來占據(jù)的手段。
對于未分段存儲器的實(shí)現(xiàn)方式而言,代碼空間和數(shù)據(jù)空間包括物理存儲器地址空間的線性部分。由此,在圖3a和4a的體系結(jié)構(gòu)下,定義了代碼空間和地址空間的起始和結(jié)束地址的數(shù)據(jù)被加載到范圍寄存器304中。例如,代碼空間的基地址被加載到CS基址寄存器402中,而代碼空間的范圍偏移被加載到CS偏移寄存器404中。然后用代碼空間的可信區(qū)偏移來加載CS-SRR寄存器414,同時用數(shù)據(jù)空間的可信區(qū)偏移來加載DS-SRR寄存器416。
在圖3b和4b的體系結(jié)構(gòu)下,定義了代碼和數(shù)據(jù)空間的可信區(qū)的起始和結(jié)束地址的數(shù)據(jù)被加載到SRR寄存器307中。例如,用于代碼空間的起始地址被加載到TCS起始SRR寄存器530中,而用于代碼空間的結(jié)束地址被加載到TCS結(jié)束SRR寄存器532中。
按照和代碼空間存儲器的分配相似的方式,由可信代碼進(jìn)行操作的數(shù)據(jù)被存儲在數(shù)據(jù)空間的可信區(qū)中,如應(yīng)用數(shù)據(jù)520所示。類似地,由非可信代碼進(jìn)行操作的數(shù)據(jù)被存儲在數(shù)據(jù)空間的非可信區(qū)中,如DLL-1數(shù)據(jù)522、DLL-2數(shù)據(jù)524和本機(jī)碼模塊數(shù)據(jù)526所示。
在各種實(shí)施方案下,存儲在SRR寄存器中的可信區(qū)偏移值被用來確定正在被執(zhí)行的指令何時被定位在可信區(qū)或非可信區(qū)中。類似地,在這些寄存器中的信息被用來確定對應(yīng)于一個數(shù)據(jù)事務(wù)的存儲器訪問請求是否包括訪問數(shù)據(jù)空間的可信區(qū)或者非可信區(qū)。在一種實(shí)施方案中,響應(yīng)于檢測到非可信存儲器訪問事件或代碼序列,投出一個SAP(安全訪問保護(hù))陷阱。在一種實(shí)施方案中,基于圖2a和2b所示的真值表邏輯來確定是否投出SAP陷阱。
在圖6a中示出了根據(jù)一種實(shí)施方案與響應(yīng)于非可信存儲器訪問事件而執(zhí)行的操作相對應(yīng)的流程圖。在圖6b中示出了根據(jù)一種實(shí)施方案圖示了如何實(shí)現(xiàn)所述流程圖的操作和邏輯的示意圖。
過程開始于框600,其中非可信代碼正在執(zhí)行。例如,假設(shè)包括一部分本機(jī)碼模塊518的指令正在執(zhí)行。在這里所使用的術(shù)語中,占據(jù)代碼空間的非可信區(qū)的代碼被稱為“不安全”指令。類似地,占據(jù)代碼空間的可信區(qū)的代碼被稱為“安全”指令。當(dāng)非可信代碼正在執(zhí)行時,用指向不安全指令的指針來加載EIP寄存器310,所述不安全指令例如是圖6b中所示的不安全指令601。(為方便起見,指令在這里仿佛被載入EIP寄存器一樣被引用。將會理解的是,EIP寄存器實(shí)際上包含指向代碼段中將要執(zhí)行的下一指令的指針。)指令執(zhí)行什么類型的操作都無關(guān)緊要,它是否安全的定義完全取決于它被存儲在哪個區(qū)中。
在框602中,指向要訪問可信區(qū)中的存儲器的不安全指令603的指針被加載到EIP寄存器310中。例如,假設(shè)在本機(jī)碼模塊518中的指令對應(yīng)于具有被映射到應(yīng)用數(shù)據(jù)520的地址的存儲器訪問,所述應(yīng)用數(shù)據(jù)520占據(jù)著數(shù)據(jù)空間502的可信區(qū)508。在一種實(shí)施方案中,當(dāng)每個指令指針被加載到EIP寄存器中時,執(zhí)行檢查以確定所述指令是否對應(yīng)于存儲在代碼空間的可信區(qū)或非可信區(qū)中的代碼。在一種實(shí)施方案中,這是通過比較所述指令的分段地址的偏移(即,基段地址+偏移)與存儲在CS-SRR寄存器中的可信區(qū)偏移值而進(jìn)行的。如果偏移大于CS-SRR寄存器值,則指令是可信的。如果不是,則指令是非可信的。
在對應(yīng)于圖3b和4b的另一種實(shí)施方案中,進(jìn)行檢查以確定不安全指令是否位于代碼空間500的可信區(qū)504內(nèi)。將所述指令的地址與代碼空間的可信區(qū)的起始地址和結(jié)束地址做比較,以確定它是否落入被分配給可信代碼空間區(qū)的地址范圍內(nèi)。
在一種實(shí)施方案中,對應(yīng)于代碼和存儲器使用情況的處理狀態(tài)信息被保存在EFLAGs寄存器308中。在傳統(tǒng)的IA-32體系結(jié)構(gòu)中,這個寄存器的第1、3、5、15位以及第22-31位被保留。由此,這些保留位中的任何位都可以實(shí)現(xiàn)在擴(kuò)展IA-32體系結(jié)構(gòu)中,而不會影響正常的IA-32操作。在一種實(shí)施方案中,第30位被用來存儲指令信任信息,而第29位被用來存儲存儲器訪問信任信息。
如圖6b所示,當(dāng)指向不安全指令603的指針被載入時,對CS-SRR寄存器414進(jìn)行檢查,以確定下一指令被認(rèn)為是安全的還是不安全的。作為響應(yīng),EFLAGs寄存器308中的第30位被置位(不安全的)或者被清零(安全的)。
如圖6b接下來的處理所示,圖3a-c的體系結(jié)構(gòu)的各種實(shí)施方案采用流水線式的體系結(jié)構(gòu)。這所要做的是允許多個流水線式操作被并行實(shí)現(xiàn)。一種這樣的操作和存儲器訪問有關(guān)。當(dāng)處理存儲器訪問指令時,該存儲器的邏輯地址被提供給MEU314,MEU314將邏輯地址翻譯成它的物理地址,從而可以由處理器從地址空間312對它進(jìn)行訪問。作為這一過程的一部分,在一種實(shí)施方案中,針對存儲在DS-SRR寄存器416中的用于數(shù)據(jù)空間的可信區(qū)偏移值來檢查對應(yīng)于數(shù)據(jù)訪問請求的存儲器地址605。如果所述地址對應(yīng)于被映射到數(shù)據(jù)空間的非可信區(qū)地址,則EFLAGs寄存器308的第29位被置位;否則要是所述地址對應(yīng)于數(shù)據(jù)空間的可信區(qū),則使得第29位被清零。根據(jù)圖3b和4b的實(shí)施方案,將用于數(shù)據(jù)訪問請求的地址與用于數(shù)據(jù)空間中的可信區(qū)的起始地址和結(jié)束地址進(jìn)行比較,以確定所請求的數(shù)據(jù)是否存在于數(shù)據(jù)空間的可信區(qū)中。
在一種實(shí)施方案中,第30和29位[1,0]值的組合將產(chǎn)生SAP陷阱。在一種實(shí)施方案中,通過觀測第30和29位值的組合來報知所述陷阱。在另一種實(shí)施方案中,通過置位EFLAGS寄存器308的虛擬中斷未決(VIP)標(biāo)志(第20位)而報知所述陷阱。在以上任何一種情形中,目的都是生成虛擬中斷。在圖6a的框604中示出了投出SAP陷阱的操作。
總地來說,現(xiàn)今的處理器支持兩種類型的中斷物理中斷和虛擬中斷。物理中斷對應(yīng)于由(經(jīng)由適當(dāng)?shù)目偩€)耦合到處理器的硬件設(shè)備生成的中斷。這使得硬件設(shè)備能夠請求處理器的服務(wù)。虛擬中斷對應(yīng)于由軟件生成的中斷,即響應(yīng)于代碼指令的執(zhí)行而生成的中斷。
在一種實(shí)施方案中,處理器體系結(jié)構(gòu)支持虛擬中斷處理程序的注冊,并且將對應(yīng)的指令重定向信息存儲在虛擬中斷向量表607中。虛擬中斷向量表中的每個條目都將一種虛擬中斷事件類型映射到對應(yīng)中斷處理程序的首指令。在當(dāng)前的實(shí)施例下,中斷事件類型是SAP陷阱,并且中斷處理程序被稱為“動態(tài)驗(yàn)證器”。因此,響應(yīng)于框604中的SAP陷阱,通過將動態(tài)驗(yàn)證器的起始地址加載到EIP寄存器310中,執(zhí)行線程在框606中被重新定向到動態(tài)驗(yàn)證器。
總地來說,動態(tài)驗(yàn)證器應(yīng)當(dāng)是一個可信模塊。因此,它應(yīng)當(dāng)由可信組件來注冊。在一種實(shí)施方案中,動態(tài)驗(yàn)證器由應(yīng)用的可信部分來注冊。這可以通過將動態(tài)驗(yàn)證器的首指令的地址存儲在距離可信數(shù)據(jù)空間的起始處一個已知的偏移處而完成。當(dāng)生成SAP陷阱時,處理器將執(zhí)行重新定向到動態(tài)驗(yàn)證器,而不必改變特權(quán)級別。在另一種實(shí)施方案中,動態(tài)驗(yàn)證器由操作系統(tǒng)使用類似于中斷描述符表(IDT)的機(jī)制來注冊。當(dāng)執(zhí)行被重定向到動態(tài)驗(yàn)證器時,處理器可以改變特權(quán)級別。
在又一種實(shí)施方案中,動態(tài)驗(yàn)證器是虛擬機(jī)的一部分,并與加載虛擬機(jī)一起被注冊。例如,圖7示出了與基于Java的實(shí)施方案相對應(yīng)的處理框架。該框架包括被劃分為可信Java應(yīng)用700和非可信本機(jī)碼702的代碼。Java應(yīng)用和本機(jī)碼的執(zhí)行由Java虛擬機(jī)(JVM)704來管理,而JVM704又運(yùn)行在處理器上。正如本領(lǐng)域所公知的那樣,虛擬機(jī)是通過幾個組件來實(shí)現(xiàn)的,例如即時(JIT)編譯器706和垃圾收集器708。其他標(biāo)準(zhǔn)JVM組件由框710繪出。JVM704還包括動態(tài)驗(yàn)證器712。在一個方面中,動態(tài)驗(yàn)證器包括Java中SecurityManager(安全管理器)級用硬件實(shí)現(xiàn)的擴(kuò)展。
返回圖6a的流程圖,在框610中,將非可信代碼原先試圖訪問的變量的地址提供給動態(tài)驗(yàn)證器。動態(tài)驗(yàn)證器然后基于它所施行的預(yù)定義的安全策略來決定所述訪問是否應(yīng)被允許。如判決框612所示,如果訪問是合法的,則根據(jù)框614,執(zhí)行從SAP出錯指令處繼續(xù)前進(jìn),允許存儲器被訪問。如果所述訪問被安全策略確定為非法的,則在框616中發(fā)出一個存儲器訪問例外。然后,在框618中通過使用適當(dāng)?shù)睦馓幚沓绦騺硖幚磉@個例外。
在圖8、9和10中示出了可允許的存儲器訪問過程的實(shí)施例。例如,圖8圖示了可信代碼被允許訪問存儲在數(shù)據(jù)空間的非可信區(qū)中的數(shù)據(jù)的場景。該過程從執(zhí)行與存儲在代碼空間的可信部分中的應(yīng)用或模塊(例如應(yīng)用代碼512)相對應(yīng)的安全指令開始。這是通過安全指令800來描繪的。將被加載到EIP寄存器310中的下一指令是與對存儲在數(shù)據(jù)空間502的非可信區(qū)510中的數(shù)據(jù)的存儲器訪問相對應(yīng)的安全指令802。作為響應(yīng),CS-SRR寄存器414檢查指示出所述指令是安全的,并且EFLAGs寄存器308的第30位被清零。接下來,根據(jù)由MEU314執(zhí)行的存儲器地址操作804,DS-SRR寄存器416檢查指示出所述存儲器訪問是針對數(shù)據(jù)空間的非可信區(qū)中的地址。由此,EFLAGs寄存器308的第29位被置位。根據(jù)圖2a的真值表,在寄存器30和29中的
值對應(yīng)于可允許的操作。因此,VIP位20被清零,不投出SAP陷阱,并且所述存儲器訪問操作被允許進(jìn)行。
在圖9中所示的場景中,可信代碼被允許訪問存儲在數(shù)據(jù)空間的可信區(qū)中的數(shù)據(jù)。該過程從執(zhí)行與存儲在代碼空間的可信部分中的應(yīng)用或模塊相對應(yīng)的安全指令(如安全指令900所示)開始。將被加載到EIP寄存器310中的下一指令是與對存儲在數(shù)據(jù)空間502的可信區(qū)508中的數(shù)據(jù)的存儲器訪問相對應(yīng)的安全指令902。作為響應(yīng),CS-SRR寄存器414檢查指示出所述指令是安全的,并且EFLAGs寄存器308的第30位被清零。接下來,根據(jù)由MEU314執(zhí)行的存儲器地址操作904,DS-SRR寄存器416檢查指示出所述存儲器訪問是針對數(shù)據(jù)空間的可信區(qū)中的地址。由此,EFLAGs寄存器308的第29位也被清零。根據(jù)圖2a的真值表,在寄存器30和29中的
值對應(yīng)于可允許的操作。因此,不投出SAP陷阱,并且所述存儲器訪問操作被允許進(jìn)行。
在圖10中所示的場景中,非可信代碼被允許訪問存儲在數(shù)據(jù)空間的非可信區(qū)中的數(shù)據(jù)。該過程從執(zhí)行與存儲在代碼空間的非可信部分中的模塊(例如,本機(jī)碼或DLL)相對應(yīng)的不安全指令(如不安全指令1000所示)開始。將被加載到EIP寄存器310中的下一指令是與對存儲在數(shù)據(jù)空間502的非可信區(qū)510中的數(shù)據(jù)的存儲器訪問相對應(yīng)的不安全指令1002。作為響應(yīng),CS-SRR寄存器414檢查指示出所述指令是不安全的,并且EFLAGs寄存器308的第30位被置位。接下來,根據(jù)由MEU314執(zhí)行的存儲器地址操作1004,DS-SRR寄存器416檢查指示出所述存儲器訪問是針對數(shù)據(jù)空間的非可信區(qū)中的地址。由此,EFLAGs寄存器308的第29位也被置位。根據(jù)圖2a的真值表,在寄存器30和29中的[1,1]值對應(yīng)于可允許的操作。因此,不投出SAP陷阱,并且所述存儲器訪問操作被允許進(jìn)行。
如上所述,某些代碼序列也可能導(dǎo)致SAP陷阱。例如,在一種實(shí)施方案中,如果不先應(yīng)用安全策略,則從非可信代碼到可信代碼的序列不允許進(jìn)行。在圖11a和11b中分別示出了對應(yīng)于這一代碼序列的流程圖和示意圖。
該過程從框1100開始,其中執(zhí)行包括不安全指令1101的非可信代碼。在框1100之后,將不安全指令1103加載到EIP寄存器310中,所述不安全指令1103使得執(zhí)行線程被定向到可信區(qū)中的代碼。例如,這一狀況可能由調(diào)用或跳到可信區(qū)中的指令而產(chǎn)生,或者可能只是由在非可信本機(jī)碼過程或子例程結(jié)束時發(fā)出的返回指令而產(chǎn)生的。如前所述,CS-SRR寄存器414檢查的結(jié)果由EFLAGs寄存器308的第30位值來指示。除了對當(dāng)前指令的CS-SRR寄存器414檢查值外,對緊鄰當(dāng)前指令之前的指令的CS-SRR寄存器檢查值也被存儲在EFLAGs寄存器308中。在一種實(shí)施方案中,這個值被存儲在EFLAGs寄存器的第31位中。
就在指向不安全指令1103的指針一旦被加載到EIP寄存器310后,這產(chǎn)生了對應(yīng)于時間實(shí)例的EFLAGs寄存器配置1105。在這種EFLAGs寄存器配置中,對應(yīng)于兩條不安全指令的執(zhí)行序列,第31和30位都被置位。根據(jù)圖2b的代碼序列真值表,如果第31和30位的值是[1,1],則操作被允許,并且對應(yīng)于EFLAGs寄存器308的第20位的VIP標(biāo)志被清零。這一操作被允許進(jìn)行。
繼執(zhí)行序列之后,定向到可信區(qū)中的指令將會使得用于下一指令的指針被加載到EIP寄存器310中,該指針將指向代碼空間的可信區(qū)中的地址。這一指令被描繪為安全指令1107。再次,一旦將這一指令指針加載到EIP寄存器310中,則執(zhí)行CS-SRR寄存器檢查。在這個實(shí)例中,所述指令處于可信區(qū)中,因此第30位被清零。就在更新第30位的值之前,第30位的前一值被左移一位,移到第31位。如上所述,這代表前一指令的代碼信任類型。這導(dǎo)致了EFLAGs寄存器配置1109。
在這種配置下,第31和30位的值是[1,0]。如圖2b的代碼序列真值表所定義的,這代表了需要安全策略評估的非可信序列。因此,VIP位20被置位,以告知處理器一個未決的SAP陷阱,如圖11a的流程圖的框1104中所示。響應(yīng)于SAP陷阱,按照大體上類似于上面針對非可信存儲器訪問所討論的方式來執(zhí)行操作。
首先,在框1106中,執(zhí)行線程被重新定向到動態(tài)驗(yàn)證器712。在框1108中,動態(tài)驗(yàn)證器應(yīng)用其針對代碼序列的安全策略。在一種實(shí)施方案中,識別出使執(zhí)行線程被定向到可信區(qū)中的指令。例如,由非可信DLL或本機(jī)碼模塊發(fā)起的動作可能會試圖調(diào)用或跳到可信區(qū)中的指令。這一般會產(chǎn)生有問題的結(jié)果,因此這一類型的訪問可能會在安全策略的一種實(shí)施方案下被拒絕。同時,所述定向可能僅僅會針對從包括本機(jī)碼或DLL的調(diào)用子例程或過程的返回而發(fā)生。在這種條件下,期望定向回代碼空間的可信區(qū),并且所述定向代表了正常的代碼序列。在一種實(shí)施方案下,這一類型的代碼序列是合法的。
如果所述序列被視為合法的,如判決框1110所示,則指令序列被允許前進(jìn),從出錯指令處繼續(xù)。如果所述序列是非法的,則在框1114中發(fā)出代碼訪問例外,并且在框1116中由適當(dāng)?shù)睦馓幚沓绦騺硖幚硭隼狻?br>
除了將代碼空間和數(shù)據(jù)空間劃分成可信區(qū)和非可信區(qū)的存儲器分區(qū)方案之外,通過進(jìn)一步將非可信區(qū)劃分為具有不同信任級的子區(qū),可以實(shí)現(xiàn)額外的信任粒度。例如,圖12示出了代碼空間1200的存儲器分區(qū)方案,其包括可信區(qū)1202和非可信區(qū)1204。按照上述實(shí)施方案中所使用的類似方式,用可信區(qū)偏移來定義這些區(qū)之間的邊界。然而,非可信區(qū)被進(jìn)一步劃分成具有不同信任級的三個子區(qū)第1級、第2級和第3級。在圖示的實(shí)施方案中,第1級和非可信區(qū)1204中最可信的代碼有關(guān),而第2級代碼不那么可信,第3級代碼最不可信。
在一種實(shí)施方案中,從處理器的角度看,支持圖12的實(shí)施方案的操作與上面討論的那些實(shí)施方案是一樣的——它不知道非可信區(qū)的進(jìn)一步劃分。相反,分區(qū)是由軟件完成的,或者更具體地說,是由動態(tài)驗(yàn)證器完成的。當(dāng)執(zhí)行線程被交給動態(tài)驗(yàn)證器時,它通過執(zhí)行地址定位檢查來確認(rèn)出錯指令被指派給哪一個信任級。在一種實(shí)施方案中,動態(tài)驗(yàn)證器(和/或應(yīng)用或操作系統(tǒng))保存一份非可信區(qū)查找表,該表定義了非可信區(qū)中由相應(yīng)的級占據(jù)的每一子區(qū)的偏移。舉例來說,在對代碼空間1200的配置下,所述查找表將保存第1級和第2級偏移。
在這種方案下,動態(tài)驗(yàn)證器可以對駐留在不同信任級處的代碼施行不同的訪問策略。由于動態(tài)驗(yàn)證器是軟件實(shí)體,所以所述方案是非常靈活的??梢杂绍浖O(shè)計(jì)者來選定信任級的粒度,使得信任區(qū)的連續(xù)性能夠得到支持。此外,可以對數(shù)據(jù)空間施行類似的分區(qū)方案。如前所述,這種進(jìn)一步的分區(qū)對于處理器操作是透明的,它是由動態(tài)驗(yàn)證器來處理的。
圖13圖示了實(shí)現(xiàn)本發(fā)明上述實(shí)施方案的示例性計(jì)算機(jī)系統(tǒng)1300的實(shí)施方案。計(jì)算機(jī)系統(tǒng)1300一般代表了各種類型的計(jì)算機(jī)設(shè)備,包括個人計(jì)算機(jī)、膝上型計(jì)算機(jī)、工作站、服務(wù)器等。為簡化起見,這里只討論計(jì)算機(jī)系統(tǒng)的基本組件。計(jì)算機(jī)系統(tǒng)1300包括機(jī)箱1302,其中容納著各種組件,包括軟件驅(qū)動器1304、硬盤1306、電源(未示出)和主板1308。硬盤1306可以包括單個單元或者多個單元,并且可選地可以存在于計(jì)算機(jī)系統(tǒng)1300之外。主板1308包括經(jīng)由適當(dāng)?shù)目偩€和/或芯片組元件與一個或多個處理器1312相互通信耦合的存儲器1310。存儲器1310可以包括但不限于動態(tài)隨機(jī)訪問存儲器(DRAM)、靜態(tài)隨機(jī)訪問存儲器(SRAM)、同步動態(tài)隨機(jī)訪問存儲器(SDRAM)、Rambus動態(tài)隨機(jī)訪問存儲器(RDRAM)等。處理器1312可以是傳統(tǒng)的微處理器,包括但不限于CISC(復(fù)雜指令集計(jì)算機(jī))處理器或RISC(精簡指令集計(jì)算機(jī))處理器,所述CISC處理器例如是Intel公司的x86、Pentium或者Itanium系列微處理器,Motorola系列微處理器,所述RISC處理器例如是SUN SPARC處理器等??傊?,處理器1312將具有與這里所描述的擴(kuò)展處理器體系結(jié)構(gòu)之一相對應(yīng)的結(jié)構(gòu)。
監(jiān)視器1314被包括進(jìn)來,用于顯示由計(jì)算機(jī)系統(tǒng)1300運(yùn)行的軟件程序和程序模塊所生成的圖形和文本。鼠標(biāo)1316(或者其他指示設(shè)備(pointing device))可被連接到串行端口、USB(通用串行總線)端口或者通信地耦合到處理器1312的類似總線端口。鍵盤1318以類似于鼠標(biāo)1316的方式被通信地耦合到主板1308,以供用戶輸入文本和命令。在一種實(shí)施方案中,計(jì)算機(jī)系統(tǒng)1300還包括網(wǎng)絡(luò)接口卡(NIC)1320或內(nèi)置NIC接口(未示出),用于將計(jì)算機(jī)系統(tǒng)1300連接到計(jì)算機(jī)網(wǎng)絡(luò)1330,例如局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)或因特網(wǎng)。
計(jì)算機(jī)系統(tǒng)1300還可以可選地包括壓縮盤-只讀存儲器(CD-ROM)驅(qū)動器1328,可以將CD-ROM盤插入其中,使得可執(zhí)行文件,例如操作系統(tǒng)以及Java或C#組件,還有該盤上的數(shù)據(jù)可被讀取或轉(zhuǎn)移到存儲器1310和/或硬盤1306中。在計(jì)算機(jī)系統(tǒng)1300中還可以包括其他大容量存儲器存儲設(shè)備。
在另一種實(shí)施方案中,計(jì)算機(jī)系統(tǒng)1300是手持或掌上型計(jì)算機(jī),它們有時被稱為個人數(shù)字助手(PDA)。手持計(jì)算機(jī)可能不包括硬盤或其他大容量存儲設(shè)備,并且可執(zhí)行程序從有線或無線網(wǎng)絡(luò)連接被載入到存儲器1310中,以供處理器1312來執(zhí)行。典型的計(jì)算機(jī)系統(tǒng)1300通常將包括至少一個處理器1312、存儲器1310以及將存儲器1310耦合到處理器1312的總線(未示出)。
將可以理解的是,在一種實(shí)施方案中,計(jì)算機(jī)系統(tǒng)1300由包括文件管理系統(tǒng)的操作系統(tǒng)軟件來控制,所述文件管理系統(tǒng)例如是盤操作系統(tǒng),它是操作系統(tǒng)軟件的一部分。例如,本發(fā)明的一種實(shí)施方案對于計(jì)算機(jī)系統(tǒng)1300采用Microsoft Windows操作系統(tǒng)。在另一種實(shí)施方案中,根據(jù)本發(fā)明的教導(dǎo)也可以使用其他的操作系統(tǒng),例如但不限于AppleMacintosh操作系統(tǒng)、基于Linux的操作系統(tǒng)、Microsoft Windows CE操作系統(tǒng)、基于Unix的操作系統(tǒng)、3Com Palm操作系統(tǒng)等等。
因此,本發(fā)明的實(shí)施方案可被用作或者支持在某種形式的處理核(例如處理器1312)上執(zhí)行的固件和軟件代碼,或者在機(jī)器可讀介質(zhì)之上或之內(nèi)實(shí)施或?qū)崿F(xiàn)的固件和軟件代碼。機(jī)器可讀介質(zhì)包括提供(即,存儲和/或傳輸)機(jī)器(例如計(jì)算機(jī)、網(wǎng)絡(luò)設(shè)備、個人數(shù)字助手、制造工具、具有一組一個或多個處理器的任何設(shè)備,等等)可讀形式的信息的任何機(jī)制。除了可記錄的介質(zhì),例如基于盤的介質(zhì)之外,機(jī)器可讀介質(zhì)可以包括傳播信號,例如電、光、聲或其他形式的傳播信號(例如,載波、紅外線、數(shù)字信號等)。
對本發(fā)明圖示實(shí)施方案的以上描述,包括在說明書摘要中描述的內(nèi)容在內(nèi),都不想是窮盡性的或者將本發(fā)明限制到所公開的精確形式。雖然這里出于圖示說明的目的描述了本發(fā)明的特定實(shí)施方案和實(shí)施例,但是相關(guān)領(lǐng)域的技術(shù)人員將會認(rèn)識到,各種等同修改都可能位于本發(fā)明的范圍之內(nèi)。
按照上面的詳細(xì)描述,可以對本發(fā)明實(shí)行這些修改。在所附權(quán)利要求中使用的術(shù)語不應(yīng)被解釋為將本發(fā)明限制到在說明書和權(quán)利要求書中所公開的具體實(shí)施方案。相反,本發(fā)明的范圍將完全由所附權(quán)利要求來確定,將根據(jù)已有的權(quán)利要求的解釋原則來解釋這些權(quán)利要求。
權(quán)利要求
1.一種方法,包括將分配給應(yīng)用的代碼空間劃分成可信區(qū)和非可信區(qū);為位于所述可信區(qū)和非可信區(qū)中的指令定義被允許的操作;確定當(dāng)前指令是位于所述可信區(qū)中還是位于所述非可信區(qū)中;以及基于所述當(dāng)前指令所在的區(qū)以及為這一區(qū)中的指令所定義的允許操作,確定所述當(dāng)前指令所定義的操作是否被允許執(zhí)行。
2.如權(quán)利要求1所述的方法,其中確定所述當(dāng)前指令是位于所述可信區(qū)中還是位于所述非可信區(qū)中的操作包括以下操作存儲可信區(qū)偏移,該偏移定義了劃分所述代碼空間的所述可信區(qū)和所述非可信區(qū)的邊界的位置,所述可信區(qū)偏移包括距離所述代碼空間的起始地址的偏移;獲得所述當(dāng)前指令的地址,該地址指定了所述當(dāng)前指令所在的、距離所述代碼空間的起始地址的偏移;以及將所述當(dāng)前指令的地址的偏移與所述可信區(qū)偏移進(jìn)行比較,以確定所述當(dāng)前指令所在的區(qū)。
3.如權(quán)利要求2所述的方法,進(jìn)一步包括將所述可信區(qū)偏移或者指向所述可信區(qū)偏移的指針之一存儲在處理器寄存器中;響應(yīng)于用于所述當(dāng)前指令的指針被加載到所述處理器的指令指針寄存器中,將所述當(dāng)前指令的地址的偏移與所述可信區(qū)偏移進(jìn)行比較。
4.如權(quán)利要求1所述的方法,其中確定所述當(dāng)前指令是位于所述可信區(qū)中還是位于所述非可信區(qū)中的操作包括以下操作存儲所述可信區(qū)的起始地址和結(jié)束地址;獲得所述當(dāng)前指令的地址;以及確定所述地址是否落入所述可信區(qū)的所述起始地址和所述結(jié)束地址之內(nèi)。
5.如權(quán)利要求1所述的方法,其中確定所述當(dāng)前指令是位于所述可信區(qū)中還是位于所述非可信區(qū)中的操作包括以下操作存儲所述可信區(qū)的起始地址和大??;獲得所述當(dāng)前指令的地址;以及確定所述地址是否落入由所述可信區(qū)的所述起始地址和所述大小所指定的地址范圍之內(nèi)。
6.如權(quán)利要求1所述的方法,進(jìn)一步包括響應(yīng)于檢測到不允許的操作,投出安全陷阱;以及對所述操作應(yīng)用安全策略,以確定所述操作是否被允許繼續(xù)進(jìn)行。
7.如權(quán)利要求6所述的方法,進(jìn)一步包括響應(yīng)于被投出的安全陷阱,將執(zhí)行線程重新定向到動態(tài)驗(yàn)證器,所述動態(tài)驗(yàn)證器包括基于軟件的組件,該組件具有應(yīng)用所述安全策略的邏輯。
8.如權(quán)利要求7所述的方法,進(jìn)一步包括執(zhí)行例外處理過程,以從與不被所述安全策略允許的操作相對應(yīng)的指令錯誤中恢復(fù)。
9.如權(quán)利要求7所述的方法,其中所述動態(tài)驗(yàn)證器是虛擬機(jī)框架中的組件。
10.如權(quán)利要求9所述的方法,進(jìn)一步包括執(zhí)行基于虛擬機(jī)的例外處理過程,以從與不被所述安全策略允許的操作相對應(yīng)的指令錯誤中恢復(fù)。
11.如權(quán)利要求6所述的方法,進(jìn)一步包括執(zhí)行用于代碼訪問序列的基于硬件的代碼序列真值表,其中不允許的代碼訪問序列引起安全陷阱被投出。
12.如權(quán)利要求11所述的方法,其中所述代碼序列真值表指定響應(yīng)于包括后面跟隨著安全指令的不安全指令的代碼序列,投出安全陷阱。
13.如權(quán)利要求12所述的方法,其中所述安全策略可允許到位于所述可信區(qū)中的調(diào)用程序的返回指令繼續(xù)進(jìn)行,但是不會允許從不安全指令訪問位于所述可信區(qū)中的代碼的調(diào)用或跳轉(zhuǎn)繼續(xù)進(jìn)行。
14.如權(quán)利要求1所述的方法,進(jìn)一步包括將類型安全代碼加載到所述代碼空間的所述可信區(qū)中;將非類型安全代碼加載到所述代碼空間的所述非可信區(qū)中;以及初始化為所述可信區(qū)和所述非可信區(qū)劃界的機(jī)制。
15.如權(quán)利要求14所述的方法,其中所述類型安全代碼包括與用類型安全語言編寫的應(yīng)用相對應(yīng)的代碼,并且所述非類型安全代碼包括可由用類型安全語言編寫的應(yīng)用來調(diào)用的本機(jī)碼。
16.如權(quán)利要求14所述的方法,其中所述非類型安全代碼包括動態(tài)鏈接庫。
17.如權(quán)利要求1所述的方法,進(jìn)一步包括將所述非可信區(qū)劃分成具有不同信任級的多個子區(qū)。
18.一種方法,包括將分配給應(yīng)用的代碼空間劃分成可信區(qū)和非可信區(qū);將分配給所述應(yīng)用的數(shù)據(jù)空間劃分成可信區(qū)和非可信區(qū);基于請求存儲器訪問的代碼在所述代碼空間中的位置以及與所述存儲器訪問相關(guān)的數(shù)據(jù)在所述數(shù)據(jù)空間中的位置,定義可允許的存儲器訪問操作;確定發(fā)出存儲器訪問請求的代碼的位置以及被請求訪問的數(shù)據(jù)的位置;以及基于請求所述存儲器訪問的代碼的位置以及被請求訪問的數(shù)據(jù)的位置,如可允許的存儲器訪問操作所定義的那樣,確定所述存儲器訪問請求是否將被允許。
19.如權(quán)利要求18所述的方法,其中確定發(fā)出所述存儲器訪問請求的代碼的位置的操作包括以下操作存儲所述代碼空間的可信區(qū)偏移,該偏移定義了劃分所述代碼空間的所述可信區(qū)和所述非可信區(qū)的邊界的偏移位置;獲得對應(yīng)于所述存儲器訪問請求的當(dāng)前指令的地址,該地址指定了所述當(dāng)前指令所在的、距離被指派給所述代碼空間的起始地址的偏移;以及將所述當(dāng)前指令的地址的偏移與所述代碼空間的所述可信區(qū)偏移進(jìn)行比較,以確定在所述代碼空間中所述當(dāng)前指令所在的區(qū)。
20.如權(quán)利要求19所述的方法,進(jìn)一步包括將所述代碼空間的所述可信區(qū)偏移或者指向所述代碼空間的所述可信區(qū)偏移的指針之一存儲在處理器寄存器中;以及響應(yīng)于用于所述當(dāng)前指令的指針被加載到所述處理器的指令指針寄存器中,將所述當(dāng)前指令的地址的偏移與所述代碼空間的所述可信區(qū)偏移進(jìn)行比較。
21.如權(quán)利要求18所述的方法,其中確定發(fā)出所述存儲器訪問請求的代碼的位置的操作包括以下操作存儲所述可信區(qū)的起始地址和結(jié)束地址;獲得所述當(dāng)前指令的地址;以及確定所述地址是否落入所述可信區(qū)的所述起始地址和所述結(jié)束地址之內(nèi)。
22.如權(quán)利要求18所述的方法,其中確定發(fā)出所述存儲器訪問請求的代碼的位置的操作包括以下操作存儲所述可信區(qū)的起始地址和大小;獲得所述當(dāng)前指令的地址;以及確定所述地址是否落入由所述可信區(qū)的所述起始地址和所述大小所指定的地址范圍之內(nèi)。
23.如權(quán)利要求18所述的方法,其中確定被請求訪問的數(shù)據(jù)的位置的操作包括以下操作存儲數(shù)據(jù)空間的可信區(qū)偏移,該偏移定義了劃分所述數(shù)據(jù)空間的所述可信區(qū)和所述非可信區(qū)的邊界的偏移位置;獲得對應(yīng)于所述存儲器請求的數(shù)據(jù)所在的地址,該地址指定了所述數(shù)據(jù)所在的、距離被指派給所述數(shù)據(jù)空間的起始地址的偏移;以及將對應(yīng)于所述存儲器請求的數(shù)據(jù)所在的地址的偏移與所述數(shù)據(jù)空間的所述可信區(qū)偏移進(jìn)行比較,以確定在所述數(shù)據(jù)空間中所述數(shù)據(jù)所在的區(qū)。
24.如權(quán)利要求18所述的方法,進(jìn)一步包括響應(yīng)于檢測到不允許的存儲器訪問操作,投出安全陷阱;以及對所述存儲器訪問操作應(yīng)用安全策略,以確定所述存儲器訪問操作是否被允許進(jìn)行。
25.如權(quán)利要求24所述的方法,進(jìn)一步包括響應(yīng)于被投出的安全陷阱,將執(zhí)行線程重新定向到動態(tài)驗(yàn)證器,所述動態(tài)驗(yàn)證器包括基于軟件的組件,該組件具有應(yīng)用所述安全策略的邏輯。
26.如權(quán)利要求24所述的方法,進(jìn)一步包括執(zhí)行例外處理過程,以從與不被所述安全策略允許的存儲器訪問操作相對應(yīng)的指令錯誤中恢復(fù)。
27.如權(quán)利要求24所述的方法,進(jìn)一步包括執(zhí)行基于硬件的存儲器訪問真值表,其中不允許的存儲器訪問操作引起安全陷阱被投出。
28.如權(quán)利要求27所述的方法,其中所述存儲器訪問真值表指定來自所述代碼空間的所述非可信區(qū)中的代碼的存儲器請求不被允許訪問所述數(shù)據(jù)空間的所述可信區(qū)中的數(shù)據(jù)。
29.如權(quán)利要求24所述的方法,進(jìn)一步包括執(zhí)行虛擬機(jī)例外處理過程,以從與不被所述安全策略允許的存儲器訪問操作相對應(yīng)的指令錯誤中恢復(fù)。
30.如權(quán)利要求18所述的方法,進(jìn)一步包括將類型安全代碼加載到所述代碼空間的所述可信區(qū)中;將非類型安全代碼加載到所述代碼空間的所述非可信區(qū)中;在所述數(shù)據(jù)空間的所述可信區(qū)中分配對應(yīng)于類型安全代碼的數(shù)據(jù)存儲;在所述數(shù)據(jù)空間的所述非可信區(qū)中分配對應(yīng)于非類型安全代碼的數(shù)據(jù)存儲;以及初始化為所述可信區(qū)和所述非可信區(qū)劃界的機(jī)制。
31.如權(quán)利要求30所述的方法,其中所述類型安全代碼包括與用類型安全語言編寫的應(yīng)用相對應(yīng)的代碼,并且所述非類型安全代碼包括可由用類型安全語言編寫的應(yīng)用來調(diào)用的本機(jī)碼。
32.如權(quán)利要求18所述的方法,進(jìn)一步包括將所述代碼空間的所述非可信區(qū)劃分成具有不同信任級的多個子區(qū);以及將所述數(shù)據(jù)空間的所述非可信區(qū)劃分成具有不同信任級的多個子區(qū)。
33.一種處理器,包括指令指針;以下之一,代碼空間SRR寄存器,該寄存器存儲代碼空間的可信區(qū)偏移或者指向所述代碼空間的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述代碼空間中在可信區(qū)和非可信區(qū)之間的邊界;或者兩個代碼空間SRR寄存器,所述兩個寄存器存儲的數(shù)據(jù)指定了與所述代碼空間的所述可信區(qū)相對應(yīng)的地址范圍;實(shí)行代碼序列真值表的機(jī)制,其中所述代碼序列真值表定義了與存儲在所述代碼空間的所述可信區(qū)和所述非可信區(qū)中的指令相對應(yīng)的可允許和不允許的指令序列;以及響應(yīng)于檢測到不允許的指令序列而投出安全陷阱的機(jī)制。
34.如權(quán)利要求33所述的處理器,其中所述的實(shí)行代碼序列真值表的機(jī)制包括確定當(dāng)前指令是位于所述代碼空間的所述可信區(qū)中還是所述非可信區(qū)中的已編程邏輯;第一寄存器位,該位存儲的數(shù)據(jù)指示出在執(zhí)行線程中緊鄰所述當(dāng)前指令之前的前一指令是被存儲在所述代碼空間的所述可信區(qū)中還是所述非可信區(qū)中;以及定義了代碼序列真值表的已編程邏輯,所述代碼序列真值表基于所述前一指令和所述當(dāng)前指令被存儲在什么區(qū)中來指定代碼序列是否可允許。
35.如權(quán)利要求34所述的處理器,進(jìn)一步包括程序狀態(tài)和控制寄存器,其中所述第一寄存器位包括位于所述程序狀態(tài)和控制寄存器中第一位置處的第一位。
36.如權(quán)利要求35所述的處理器,進(jìn)一步包括存儲以下數(shù)據(jù)的已編程邏輯,通過置位或清零位于所述程序狀態(tài)和控制寄存器中第二位置處的第二位,所述數(shù)據(jù)指示出所述當(dāng)前指令是被存儲在所述代碼空間的可信區(qū)中還是非可信區(qū)中。
37.如權(quán)利要求33所述的處理器,進(jìn)一步包括存儲用于定位所述代碼空間的段選擇子的代碼段寄存器;以及存儲用于定位所述數(shù)據(jù)空間的段選擇子的數(shù)據(jù)段寄存器。
38.一種處理器,包括代碼段寄存器;數(shù)據(jù)段寄存器;指令指針;代碼段安全區(qū)寄存器,也被稱為代碼段SRR寄存器,該寄存器存儲代碼段的可信區(qū)偏移或指向所述代碼段的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述代碼段中在可信區(qū)和非可信區(qū)之間的邊界;數(shù)據(jù)段SRR寄存器,該寄存器存儲數(shù)據(jù)段的可信區(qū)偏移或指向所述數(shù)據(jù)段的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述數(shù)據(jù)段中在可信區(qū)和非可信區(qū)之間的邊界;實(shí)行存儲器訪問真值表的機(jī)制,其中所述存儲器訪問真值表對應(yīng)于請求所述存儲器訪問的代碼在所述代碼段中的位置以及被請求進(jìn)行存儲器訪問的數(shù)據(jù)在所述數(shù)據(jù)段中的位置,定義了可允許的和不允許的存儲器訪問操作;以及響應(yīng)于檢測到不允許的存儲器訪問操作而投出安全陷阱的機(jī)制。
39.如權(quán)利要求38所述的處理器,其中所述的實(shí)行存儲器訪問真值表的機(jī)制包括確定當(dāng)前指令是位于所述代碼段的所述可信區(qū)中還是所述非可信區(qū)中的已編程邏輯;第一寄存器位,該位存儲的數(shù)據(jù)指示出所述當(dāng)前指令是位于所述代碼段的所述可信區(qū)中還是所述非可信區(qū)中;確定與所述存儲器請求相對應(yīng)的數(shù)據(jù)是位于所述數(shù)據(jù)段的所述可信區(qū)中還是所述非可信區(qū)中的已編程邏輯;第二寄存器位,該位存儲的數(shù)據(jù)指示出與所述存儲器請求相對應(yīng)的數(shù)據(jù)是位于所述數(shù)據(jù)段的所述可信區(qū)中還是所述非可信區(qū)中;以及定義了存儲器訪問真值表的已編程邏輯,所述存儲器訪問真值表基于請求存儲器訪問的代碼在所述代碼段中所在的區(qū)以及與所述存儲器訪問相對應(yīng)的數(shù)據(jù)在所述數(shù)據(jù)段中所在的區(qū),指定所述存儲器訪問操作是否可允許。
40.如權(quán)利要求39所述的處理器,進(jìn)一步包括程序狀態(tài)和控制寄存器,其中所述第一寄存器位包括位于所述程序狀態(tài)和控制寄存器中第一位置處的第一位,并且所述第二寄存器位包括位于所述程序狀態(tài)和控制寄存器中第二位置處的第二位。
41.一種系統(tǒng),包括主板,該主板至少包括一個可安裝存儲器的套接口;以及耦合到所述主板的處理器,所述處理器包括指令指針;以下之一,代碼空間SRR寄存器,該寄存器存儲代碼空間的可信區(qū)偏移或者指向所述代碼空間的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述代碼空間中在可信區(qū)和非可信區(qū)之間的邊界;或者兩個代碼空間SRR寄存器,所述兩個寄存器存儲的數(shù)據(jù)指定了與所述代碼空間的所述可信區(qū)相對應(yīng)的地址范圍;實(shí)行代碼序列真值表的機(jī)制,其中所述代碼序列真值表定義了與存儲在所述代碼空間的所述可信區(qū)和所述非可信區(qū)中的指令相對應(yīng)的可允許和不允許的指令序列;以及響應(yīng)于檢測到不允許的指令序列而投出安全陷阱的機(jī)制。
42.如權(quán)利要求41所述的系統(tǒng),其中所述的實(shí)行代碼序列真值表的機(jī)制包括確定當(dāng)前指令是位于所述代碼空間的所述可信區(qū)中還是所述非可信區(qū)中的已編程邏輯;第一寄存器位,該位存儲的數(shù)據(jù)指示出在執(zhí)行線程中緊鄰所述當(dāng)前指令之前的前一指令是被存儲在所述代碼空間的所述非可信區(qū)中還是所述可信區(qū)中;以及定義了代碼序列真值表的已編程邏輯,所述代碼序列真值表基于所述前一指令和所述當(dāng)前指令被存儲在什么區(qū)中來指定代碼序列是否可允許。
43.如權(quán)利要求41所述的系統(tǒng),其中所述處理器進(jìn)一步包括以下之一數(shù)據(jù)空間SRR寄存器,該寄存器存儲數(shù)據(jù)空間的可信區(qū)偏移或指向所述數(shù)據(jù)空間的所述可信區(qū)偏移的指針之一,所述可信區(qū)偏移定義了所述數(shù)據(jù)空間中在可信區(qū)和非可信區(qū)之間的邊界;或者兩個數(shù)據(jù)空間SRR寄存器,所述兩個寄存器存儲的數(shù)據(jù)指定了與所述數(shù)據(jù)空間的所述可信區(qū)相對應(yīng)的地址范圍;實(shí)行存儲器訪問真值表的機(jī)制,其中所述存儲器訪問真值表對應(yīng)于請求所述存儲器訪問的代碼在所述代碼空間中的位置以及被請求進(jìn)行存儲器訪問的數(shù)據(jù)在所述數(shù)據(jù)空間中的位置,定義了可允許的和不允許的存儲器訪問操作;以及響應(yīng)于檢測到不允許的存儲器訪問操作而投出安全陷阱的機(jī)制。
44.如權(quán)利要求43所述的系統(tǒng),其中所述的實(shí)行存儲器訪問真值表的機(jī)制包括確定當(dāng)前指令是位于所述代碼空間的所述可信區(qū)中還是所述非可信區(qū)中的已編程邏輯;第一寄存器位,該位存儲的數(shù)據(jù)指示出所述當(dāng)前指令是位于所述代碼空間的所述可信區(qū)中還是所述非可信區(qū)中;確定與所述存儲器請求相對應(yīng)的數(shù)據(jù)是位于所述數(shù)據(jù)空間的所述可信區(qū)中還是所述非可信區(qū)中的已編程邏輯;第二寄存器位,該位存儲的數(shù)據(jù)指示出與所述存儲器請求相對應(yīng)的數(shù)據(jù)是位于所述數(shù)據(jù)空間的所述可信區(qū)中還是所述非可信區(qū)中;以及定義了存儲器訪問真值表的已編程邏輯,所述存儲器訪問真值表基于請求存儲器訪問的代碼在所述代碼空間中所在的區(qū)以及與所述存儲器訪問相對應(yīng)的數(shù)據(jù)在所述數(shù)據(jù)空間中所在的區(qū),指定所述存儲器訪問操作是否可允許。
全文摘要
公開了支持與非可信代碼一起運(yùn)行的類型安全語言環(huán)境的處理器擴(kuò)展和軟件驗(yàn)證。代碼和數(shù)據(jù)空間被劃分成可信區(qū)和非可信區(qū)。類型安全代碼被載入代碼空間的可信區(qū),非類型安全代碼被載入其非可信區(qū)。數(shù)據(jù)空間的可信區(qū)被分配給類型安全代碼。數(shù)據(jù)空間的非可信區(qū)被分配給非類型安全代碼。采用基于硬件的真值表來定義可允許和不允許的代碼序列和存儲器訪問操作。對于代碼序列,可允許操作是基于包括當(dāng)前指令和前面指令的代碼序列的位置(即,區(qū))。對于存儲器訪問,考慮發(fā)出請求的指令和所請求數(shù)據(jù)的位置。不允許的代碼序列或存儲器訪問操作使得處理器生成安全訪問保護(hù)陷阱。響應(yīng)于該陷阱,基于軟件的動態(tài)驗(yàn)證器應(yīng)用安全策略來確定是否允許操作繼續(xù)進(jìn)行。
文檔編號G06F21/00GK1700136SQ200510070869
公開日2005年11月23日 申請日期2005年5月20日 優(yōu)先權(quán)日2004年5月20日
發(fā)明者布拉廷·薩哈, 韋爾登·沃什伯恩, 詹姆斯·赫爾德 申請人:英特爾公司