軟件實施錯誤,例如遺漏或不正確輸入驗證,可導致越界緩沖區(qū)存取和存儲器損壞。這些實施錯誤可導致軟件在正常條件下變得不穩(wěn)定或最終失效。然而,當輸入被意圖攻擊計算機系統的惡意方操控時,攻擊者可利用這些存儲器損壞和溢出錯誤來改變軟件代碼的預期行為,并執(zhí)行由攻擊者確定的代碼或功能性。
攻擊者通常通過蓋寫存儲器中的數據結構(例如返回地址、函數指針或虛表指針)取得對執(zhí)行的控制。在大型和傳統的代碼庫中尋找和修理全部可利用的存儲器損壞錯誤并不總是可能的。因此,許多計算機系統含有被稱作“利用減輕機制”的一般防御特征,其有效地對抗攻擊者用來利用這些錯誤取得對目標計算機系統的控制和/或破壞目標計算機系統的眾所周知的技術。
通常包含于計算機系統中的利用減輕機制的一些實例包含:數據執(zhí)行防止(DEP)、堆棧保護(SP)和地址空間布局隨機化(ASLR)。在DEP技術中,全部代碼區(qū)被標記為只讀,并且全部可寫入區(qū)是不可執(zhí)行的。通常,代碼區(qū)的只讀特性和可寫入區(qū)的不可執(zhí)行特性是通過處理器的存儲器管理單元(MMU)強制執(zhí)行。此技術可防止攻擊者將其自己的代碼放入數據區(qū)中并將執(zhí)行流引導到所述代碼。在SP方法中,編譯程序實施用于檢測堆棧上的緩沖區(qū)溢出的功能。由于就在本地陣列后的堆棧上經常存在返回地址或所保存的鏈接寄存器,所以基于堆棧的緩沖區(qū)溢出會很容易被利用。攻擊者可致使本地陣列溢出并蓋寫返回地址/鏈接寄存器,且重新引導軟件的執(zhí)行流。許多常規(guī)堆棧保護實施方案將保護值插入到函數序言中的堆棧上,并且在從所述函數返回之前,檢查所述值的修改。如果已發(fā)生緩沖區(qū)溢出,那么保護值連同返回地址將已經被蓋寫,因為保護值位于緩沖區(qū)與返回地址之間的堆棧中。保護值必須是隨機和/或不可預測的值,以確保SP方法的安全。在ASLR方法中,應用程序的存儲器布局可在每次執(zhí)行時隨機化。舉例來說,可隨機確定用于代碼、靜態(tài)數據、堆棧和堆的基地址。此方法使得利用難以進行,因為攻擊者需要預測他們需要瞄準/操控以進行成功攻擊的代碼/數據/指針的位置。
技術實現要素:
根據本發(fā)明的用于強制執(zhí)行處理器中的軟件程序的流控制的實例方法包含:分析所述軟件程序的程序代碼,以識別所述程序代碼中的代碼指針;基于所述代碼指針產生驗證標記;以及用所述驗證標記來修改所述程序代碼中的代碼指針,以產生帶標記的代碼指針。
此類方法的實施方案可包含以下特征中的一或多者。用所述驗證標記來修改程序代碼中的代碼指針以產生帶標記的代碼指針進一步包含通過將掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針。通過將掩碼應用于所述驗證標記和所述代碼指針來產生帶標記的代碼指針進一步包含:使用所述掩碼從所述驗證標記選擇第一組位;以及用所述第一組位來代替所述代碼指針的對應于所述第一組位的第二組位,以產生帶標記的代碼指針。識別所述程序代碼中的多個,且識別所述程序代碼中的所述多個代碼指針共用的標記位以確定掩碼。驗證所述帶標記的代碼指針,響應于所述驗證標記已更改而執(zhí)行錯誤處置,且響應于驗證標記尚未更改而執(zhí)行與所述代碼指針相關聯的地址處的程序指令。驗證所述帶標記的代碼指針包含使用所述掩碼從所述帶標記的代碼指針確定經恢復的代碼指針值。使用所述掩碼從所述帶標記的代碼指針提取嵌入的驗證標記值。至少部分地基于所述經恢復的代碼指針和上下文值來產生經恢復的驗證標記。使用所述掩碼從所述經恢復的驗證標記提取帶掩碼的標記值。將所述帶掩碼的標記值與所述嵌入的驗證標記值進行比較,以確定所述帶標記的代碼指針是否已更改。
根據本發(fā)明的用于強制執(zhí)行處理器中的軟件程序的流控制的實例設備包含:用于分析所述軟件程序的程序代碼來識別所述程序代碼中的代碼指針的裝置;用于基于所述代碼指針來產生驗證的裝置;以及用于用所述驗證標記來修改所述程序代碼中的所述代碼指針以產生帶標記的代碼指針的裝置。
此設備的實施方案可包含以下特征中的一或多者。所述用于用所述驗證標記來修改程序代碼中的代碼指針以產生帶標記的代碼指針的裝置包含用于通過將掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針的裝置。所述用于通過將掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針的裝置進一步包含:用于使用所述掩碼從所述驗證標記選擇第一組位的裝置;以及用于用所述第一組位來代替所述代碼指針的對應于所述第一組位的第二組位以產生所述帶標記的代碼指針的裝置。用于識別程序代碼中的多個代碼指針的裝置;以及用于識別所述程序代碼中的所述多個代碼指針共用的標記位以確定所述掩碼的裝置。用于驗證所述帶標記的代碼指針的裝置;用于響應于所述驗證標記已更改而執(zhí)行錯誤處置的裝置;以及用于響應于所述驗證標記尚未更改而執(zhí)行與所述代碼指針相關聯的地址處的程序指令的裝置。用于使用所述掩碼從所述帶標記的代碼指針確定經恢復的代碼指針值的裝置。
根據本發(fā)明的用于強制執(zhí)行處理器中的軟件程序的流控制的實例設備包含處理器,其經配置以:分析所述軟件程序的程序代碼,以識別所述程序代碼中的代碼指針;基于所述代碼指針產生驗證標記;以及用所述驗證標記來修改所述程序代碼中的代碼指針,以產生帶標記的代碼指針。
此設備的實施方案可包含以下特征中的一或多者。經配置以用所述驗證標記來修改所述程序代碼中的代碼指針以產生所述帶標記的代碼指針的所述處理器進一步經配置以通過將掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針。經配置以通過將掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針的所述處理器進一步經配置以:使用所述掩碼從所述驗證標記選擇第一組位;且用所述第一組位來代替所述代碼指針的對應于所述第一組位的第二組位,以產生所述帶標記的代碼指針。所述處理器進一步經配置以識別所述程序代碼中的多個代碼指針,且識別所述程序代碼中的所述多個代碼指針共用的標記位以確定所述掩碼。所述處理器進一步經配置以驗證所述帶標記的代碼指針;響應于所述驗證標記已更改而執(zhí)行錯誤處置;以及響應于所述驗證標記尚未更改而執(zhí)行與所述代碼指針相關聯的地址處的程序指令。經配置以驗證所述帶標記的代碼指針的所述處理器進一步經配置以使用所述掩碼從所述帶標記的代碼指針確定經恢復的代碼指針值。所述處理器進一步經配置以使用所述掩碼從所述帶標記的代碼指針提取嵌入的驗證標記值。
根據本發(fā)明的一種在其上儲存有用于強制執(zhí)行處理器中的軟件程序的流控制的計算機可讀指令的非暫時性計算機可讀媒體包含經配置以致使計算機進行以下操作的指令:分析所述軟件程序的程序代碼以識別所述程序代碼中的代碼指針;基于所述代碼指針產生驗證標記;以及用所述驗證標記來修改所述程序代碼中的代碼指針,以產生帶標記的代碼指針。
經配置以致使所述計算機用所述驗證標記來修改所述程序代碼中的代碼指針以產生帶標記的代碼指針的所述指令進一步包括:經配置以致使所述計算機通過將掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針。經配置以致使所述計算機通過將所述掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針的所述指令進一步包括經配置以致使所述計算機進行以下操作的指令:使用所述掩碼從所述驗證標記選擇第一組位;以及用所述第一組位來代替所述代碼指針的對應于所述第一組位的第二組位,以產生帶標記的代碼指針。經配置以致使所述計算機進行以下操作的指令:識別所述程序代碼中的多個代碼指針;且識別所述程序代碼中的所述多個代碼指針共用的標記位以確定掩碼。經配置以致使所述計算機進行以下操作的指令:驗證所述帶標記的代碼指針;響應于所述驗證標記已更改而執(zhí)行錯誤處置;且響應于所述驗證標記尚未更改而執(zhí)行與所述代碼指針相關聯的地址處的程序指令。經配置以致使所述計算機驗證所述帶標記的代碼指針的所述指令進一步包括:經配置以致使所述計算機使用所述掩碼從所述帶標記的代碼指針確定經恢復的代碼指針值的指令。經配置以致使所述計算機使用所述掩碼從所述帶標記的代碼指針提取嵌入的驗證標記值的指令。
附圖說明
圖1是其中可實施本文所論述的代碼指針驗證技術的實例計算機系統的功能框圖。
圖2是用于代碼指針驗證的實例過程的流程圖。
圖3是用于根據圖3中說明的代碼指針驗證過程來驗證已受保護的代碼指針的實例過程的流程圖。
圖4是用于產生驗證標記的實例過程的流程圖。
圖5是用于用驗證標記來修改代碼指針以產生帶標記的代碼指針的實例過程的流程圖。
圖6是用于根據圖3中說明的代碼指針驗證過程來驗證已受保護的代碼指針的實例過程的流程圖。
圖7是用于產生掩碼的實例過程的流程圖。
圖8是說明用于為圖4中說明的代碼指針加標記的過程的實例的圖。
圖9是說明用于驗證圖5中說明的帶標記的代碼指針的過程的實例的圖。
具體實施方式
提供用于在硬件中實施代碼指針驗證以防止惡意或不良寫入的譯碼修改將由計算機系統的處理器執(zhí)行的軟件代碼中的代碼指針的技術。本文所揭示的技術可用以為軟件代碼中的代碼指針加標記。所述標記可用以在處理器執(zhí)行到與所述代碼指針相關聯的地址的跳轉或分支指令之前,將代碼指針驗證為到可執(zhí)行碼的有效指針。如果帶標記的代碼指針的驗證失敗,那么所述處理器可經配置以執(zhí)行可用以停止執(zhí)行所述程序代碼的錯誤處置程序,因而阻止可由已經修改或損壞的代碼指針指向的任何惡意代碼的執(zhí)行。
可以使得攻擊者難以偽造有效標記的方式來為代碼指針加標記??蓜?chuàng)建表示代碼中可通過軟件代碼的邏輯流中的間接跳轉或分支到達的僅有位置的驗證標記。在一些實施方案中,所述標記可為使用僅處理器知曉的私用密鑰來加密的密碼學驗證標記,從而使得更改所述標記更難。
本文所揭示的技術可幫助防止已通過存儲器損壞錯誤蓋寫的代碼指針無意中被用作間接跳轉或調用的目標。
實例硬件
圖1是可用以實施本文所揭示的各種技術的計算機系統100的框圖。計算機系統100可用以至少部分地實施圖2到9中所說明的過程。
計算機系統100包括通用處理器110、無線接口125、網絡接口165和非暫時性存儲器160,其通過總線115彼此連接。無線接口125可包含無線接收器、發(fā)射器、收發(fā)器和/或其它元件,其使計算機系統100能夠使用與一或多個無線廣域網(WWAN)系統、無線局域網(WLAN)和/或可用以發(fā)送和/或接收數據的其它類型的無線通信協議相關聯的無線通信協議來發(fā)送和/或接收數據。無線接口125通過線132連接到天線134以用于將通信發(fā)送到經配置以使用無線通信協議通信的裝置,或從所述裝置接收通信。除圖1中所說明的收發(fā)器之外或代替于所述收發(fā)器,計算機系統100可包含一或多個收發(fā)器,其經配置以使用其它無線協議來接收和/或發(fā)送通信。
網絡接口165可經配置以將計算機系統100連接到一或多個有線網絡連接。網絡接口165可經配置以允許計算機系統100經由一或多個有線數據連接發(fā)射和接收數據。
處理器110可為智能裝置,例如個人計算機中央處理單元(CPU)(例如公司或所制作的那些中央處理單元)、微控制器、專用集成電路(ASIC)等。存儲器160是可包含隨機存取存儲器(RAM)、只讀存儲器(ROM)或其組合的非暫時性存儲裝置。存儲器160可存儲含有用于控制處理器110以執(zhí)行本文中所描述功能的指令的處理器可讀、處理器可執(zhí)行軟件代碼(盡管所述描述可解讀所述軟件執(zhí)行所述功能)。所述軟件可通過經由網絡連接下載而加載到存儲器160上,從磁盤上載等。此外,軟件可能不可直接執(zhí)行,例如需要在執(zhí)行之前編譯。
存儲器160中的軟件經配置以使處理器110能夠執(zhí)行各種動作,包含實施用于保護本文所論述的代碼指針驗證技術的各種技術。
處理器110可包含一或多個寄存器,其可用以存儲用于本文所揭示的代碼指針驗證技術的配置數據。舉例來說,處理器110包含掩碼寄存器110-A、值寄存器110-B、旗標寄存器110-C和上下文寄存器110-C。掩碼寄存器110-A可用以存儲用以為代碼指針加標記且驗證帶標記的代碼指針的當前掩碼的掩碼位。圖8和9中說明此類掩碼數據(掩碼810)的實例,圖7中說明用于產生此類掩碼的實例過程。所述值寄存器110-B可用以存儲當帶標記的代碼指針去標記以驗證所述指針且恢復所述代碼指針的原始值時使用的當前值的值。圖8和9中說明此類值數據(值805)的實例,圖7中說明用于產生所述值數據的實例過程。旗標寄存器110-C可經配置以含有可用以啟用和/或停用本文所揭示的代碼指針驗證和/或堆棧指針保護技術的旗標。上下文寄存器110-C可用以含有與處理器110正執(zhí)行的程序代碼相關聯且用于產生與程序代碼的代碼指針相關聯的驗證標記的當前上下文值。圖8和9中說明此類背景數據的實例(上下文值825)。其它過程,例如圖2到6中說明的那些過程,可存取和/或修改存儲在寄存器110-A、110-B、110-C和110-D中的值。其它實施方案中所包含的寄存器的數目可變化。
處理器110可提供:用于分析所述軟件程序的程序代碼以識別所述程序代碼中的代碼指針的裝置;用于基于所述代碼指針產生驗證標記的裝置;以及用于用所述驗證標記來修改所述程序代碼中的代碼指針以產生帶標記的代碼指針的裝置。處理器110還可提供用于通過將掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針的裝置。處理器110還可提供以下各項來提供用于通過將掩碼應用于所述驗證標記和所述代碼指針來產生所述帶標記的代碼指針的裝置:用于使用所述掩碼從所述驗證標記選擇第一組位的裝置;以及用于用所述第一組位來代替所述代碼指針的對應于所述第一組位的第二組位以產生所述帶標記的代碼指針的裝置。處理器110還可提供:用于識別所述程序代碼中的多個代碼指針的裝置;以及用于識別所述程序代碼中的所述多個代碼指針共用的標記位以確定所述掩碼的裝置。處理器110還可提供:用于驗證所述帶標記的代碼指針的裝置;用于響應于驗證標記已更改而執(zhí)行錯誤處置的裝置;以及用于響應于所述驗證標記尚未更改而執(zhí)行與所述代碼指針相關聯的地址處的程序指令的裝置。處理器110還可提供用于使用所述掩碼從所述帶標記的代碼指針確定經恢復的代碼指針值的裝置。
實例實施方案
圖2是可用以實施本文所揭示的代碼指針驗證技術的用于強制執(zhí)行處理器中的軟件程序的流控制的過程的流程圖。圖2中所說明的過程可使用圖1中所說明的計算機系統100來實施。圖1中所說明的實例計算機系統100提供其中可實施圖2中所說明的過程的一個計算機系統的一個實例,并且圖2中所說明的過程可通過具有與圖1中所說明的實例不同的架構的計算機系統的處理器實施。
可分析軟件程序的程序代碼,以識別所述程序代碼中的代碼指針(階段205)。待分析的程序代碼可為源代碼或可為二進制代碼。所述代碼指針可表示到可從程序代碼執(zhí)行的流的跳轉點或分支點到達的程序代碼的指令的地址。惡意方可嘗試通過用與和代碼指針最初與之相關聯的一個指令不同的指令相關聯的地址修改所述代碼指針,來獲得對所述程序代碼的流的控制。圖1中說明的過程開始將所述程序代碼中的代碼指針識別為用于減輕例如上文所論述的那些的存儲器損壞利用的技術。
圖1中說明的實例過程包含識別對其強制執(zhí)行流控制的程序代碼中的代碼指針。雖然圖1中所說明的實例論述識別一個代碼指針,圖1中所說明的所述過程可適于識別包含于所述程序代碼中的多于一個代碼指針。處理器110可經配置以在處理器110執(zhí)行所述程序代碼之前,識別所述程序代碼中的代碼指針或代碼指針。舉例來說,處理器110可經配置以在處理器110加載程序代碼時且在執(zhí)行動態(tài)或靜態(tài)鏈接時,識別所述程序代碼中的代碼指針。
可為所述代碼指針產生驗證標記(階段210)。可使用將使得惡意方難以在不檢測的情況下修改指向不同地址的代碼指針的過程來產生驗證標記。在一些實施方案中,可使用處理器110所維持的私用密鑰來加密所述代碼指針的至少一部分,且可使用代碼指針的經加密部分來產生所述代碼指針的驗證標記。圖5和7中說明用于產生代碼指針的驗證標記的實例過程。
可用驗證標記來修改程序代碼中的代碼指針,以產生帶標記的代碼指針(階段215)??捎迷陔A段210中產生的驗證標記來全部或部分地代替所述代碼指針。取決于計算機系統100的配置,可能無法將額外數據附加到代碼指針,而不對計算機系統100進行顯著的架構改變。因此,本文所揭示的技術用驗證標記來修改所述代碼指針,且在執(zhí)行與帶標記的代碼指針相關聯的地址處的指令之前,檢驗所述帶標記的代碼指針尚未經修改。此方法不需要對計算機系統100的架構的顯著改變,因為所述帶標記的代碼指針適合分配給不帶標記的代碼指針的存儲器空間內。此外,修改代碼指針本身可使得惡意代碼較難以將程序流再引導到有效地址。所述惡意代碼將需要能夠產生用于所要的目標地址的有效驗證標記,且修改代碼指針以產生到所述地址的有效帶標記代碼指針,以便將所述程序執(zhí)行的流再引導到所述地址。
圖3是用于驗證已受保護的代碼指針的實例過程的流程圖。圖3中說明的過程可用以驗證已使用圖2中所說明的過程來修改的代碼指針。此外,可修改圖2中所說明的過程以包含圖3中說明的過程的步驟。圖3中所說明的過程可使用圖1中所說明的計算機系統100來實施。圖1中所說明的實例計算機系統100提供其中可實施圖3中所說明的過程的一個計算機系統的一個實例,并且圖3中所說明的過程可通過具有與圖1中所說明的實例不同的架構的計算機系統的處理器實施。
可驗證帶標記的代碼指針(階段310)。在包含帶標記的代碼指針的程序代碼的執(zhí)行期間的某一時刻處,處理器可碰到帶標記的代碼指針并驗證所述帶標記的代碼指針,以確定所述帶標記的代碼指針是否已更改。舉例來說,所述帶標記的代碼指針可能已被惡意或不良寫入的代碼更改。舉例來說,帶標記的代碼指針可能已被利用允許攻擊者修改與代碼指針相關聯的存儲器地址的值的存儲器損壞或存儲器溢出錯誤的惡意活動修改。在一些實施方案中,處理器110可經配置以通過重新產生與代碼指針相關聯的驗證標記,并將重新產生的驗證標記與從帶標記的代碼指針提取的驗證標記進行比較以確定所述兩個標記是否匹配,來確定所述帶標記的代碼指針已更改。如果所述標記匹配,那么所述帶標記的代碼指針尚未更改,且如果所述標記不匹配,那么所述帶標記的代碼指針已更改。圖6中說明用于驗證帶標記的代碼指針的實例過程。圖6中所說明的過程可用以使用圖3中說明的修改技術來驗證已受保護的代碼指針。
現在返回到圖3,可響應于驗證標記已經更改而執(zhí)行錯誤處置(階段315)。處理器110可經配置以執(zhí)行可用以停止其中帶標記的代碼指針已更改的程序代碼的執(zhí)行的各種類型的錯誤處置程序。舉例來說,處理器110可經配置以設定指示帶標記的代碼指針已更改的旗標。處理器110可經配置以在所述程序代碼中執(zhí)行辨別所述旗標已設定且經配置以響應錯誤條件的指令。舉例來說,所述程序代碼可包含以受控方式終止所述程序代碼的執(zhí)行,并清理存儲器中與正執(zhí)行的程序代碼相關聯的任何數據的指令。所述程序代碼還可包含警告上面正執(zhí)行所述程序代碼的計算裝置的用戶錯誤已發(fā)生且所述程序代碼將要關閉的指令。所述程序代碼中還可包含其它指令,其致使處理器110將信息寫入到提供關于所出現的錯誤的信息的記錄。所述程序代碼還可包含可致使處理器110將所述記錄發(fā)送到遠程服務器的指令,所述遠程服務器例如為與創(chuàng)建或分配了所述程序代碼的內容提供商相關聯的內容提供商服務器。處理器110還可經配置以響應于錯誤旗標被設定而不是錯誤處置路由被包含于處理器110正執(zhí)行的程序代碼中而執(zhí)行上文所論述錯誤處置。處理器110還可經配置以響應于確定帶標記的代碼指針已經修改或更改而不從帶標記的代碼指針恢復原始代碼指針。因此,帶標記的代碼指針將不引用有效地址,且可引起異常。處理器110可經配置以類似于對處理器110正執(zhí)行的程序代碼中的無效地址的任何參看來處置此異常。舉例來說,處理器110可經配置以響應于識別到無效地址而執(zhí)行標準錯誤處置例程,例如緩慢地停止所述程序代碼的執(zhí)行,將錯誤信息寫入到記錄,將記錄信息發(fā)送到內容創(chuàng)建者或提供商,通知上面正執(zhí)行程序代碼的計算裝置的用戶所述程序代碼因為錯誤必須關閉,和/或其它步驟。這些錯誤處理方法可防止所述程序代碼的流被惡意代碼或不良寫入的代碼再引導。
可響應于驗證標記尚未更改而執(zhí)行與所述代碼指針相關聯的地址處的程序指令(階段320)。處理器110可經配置以響應于正驗證帶標記的代碼指針而執(zhí)行與所述帶標記的代碼指針相關聯的地址處的程序指令。如果帶標記的代碼指針被成功地驗證,那么所述代碼指針不大可能已經被惡意代碼或存儲器利用更改,且程序執(zhí)行的流可以位于與所述代碼指針相關聯的存儲器地址處的指令繼續(xù)。
圖4是用于產生驗證標記的實例過程的流程圖。圖4中說明的過程可用以實施圖2中所說明的過程的階段210。圖4中說明的過程可使用圖1中說明的計算機系統100來實施。圖1中說明的實例計算機系統100提供其中可實施圖4中說明的過程的一個計算機系統的一個實例,且圖4中說明的過程可由具有與圖1中說明的實例不同的架構的計算機系統的處理器實施。將參考圖8的圖來論述圖4中說明的過程,其提供用于產生代碼指針的驗證標記且用于修改所述代碼指針以產生帶標記的代碼指針的過程的實例。
可存取與處理器110相關聯的私用密鑰(階段405)。所述私用密鑰可用于產生可用以修改代碼指針的驗證標記。所述密鑰應保持機密,且存儲在處理器110可存取但處理器110正執(zhí)行的進程無法存取的大體上不可存取的存儲器位置中,以便使所述密鑰保持安全,免受希望在計算機系統100上執(zhí)行惡意代碼的那些人破壞。在一些實施方案中,可存在與計算機系統100的處理器110相關聯的多于一個密鑰。舉例來說,許多ARM處理器和HEXAGON處理器具有與之相關聯的多個執(zhí)行(權限)等級,例如:監(jiān)視、核心和用戶執(zhí)行模式。這些權限等級中的每一者可含有一或多個執(zhí)行環(huán)境。舉例來說,每一用戶模式進程在執(zhí)行環(huán)境內在“用戶”權限等級處操作,且這些進程由操作系統(OS)核心管理。在一些實施方案中,客戶OS可在計算機系統100上實施。客戶OS可在執(zhí)行環(huán)境內在“核心”權限等級處操作,且由管理程序或虛擬機監(jiān)視器(VMM)管理。在具有多個權限等級的環(huán)境中,可為與計算機系統100的處理器110相關聯的每一權限等級定義一組保護參數。這些保護參數可包含用于為代碼指針加標記且用于檢驗帶標記的代碼指針的密鑰、用于為代碼指針加標記的掩碼和值、用以啟用和/或停用代碼指針檢驗的處理器旗標,和/或其它安全性特征,例如基于硬件的堆棧保護。與執(zhí)行上下文相關聯的參數從在相同或較低權限等級操作的其它執(zhí)行上下文隱藏。處理器110可經配置以包含用于存儲與每一權限等級相關聯的保護參數的寄存器。處理器110還可經配置以暴露指令來讀取和設定保護參數,使得在特定權限等級執(zhí)行的代碼可讀取和設定用于下一較低權限等級的配置寄存器。在一些實施方案中,處理器110經配置以使得準許監(jiān)視器或管理程序管理與其當前權限等級相關聯的密鑰以及與下一最低權限等級(如果存在)相關聯的那些密鑰。處理器110可經配置以使得較高權限等級負責在創(chuàng)建和/或切換下一較低權限等級的處理上下文時產生和/或改變密鑰。在階段405中,與適當的權限等級相關聯的密鑰與執(zhí)行環(huán)境相關聯。在不支持多個執(zhí)行環(huán)境和/或權限等級的情況下,或在不是針對每一權限等級提供不同安全性的情況下,可從處理器110的寄存器存取與所述處理器相關聯的密鑰。
可存取與程序代碼相關聯的上下文信息(階段410)。所述上下文信息可與特定執(zhí)行環(huán)境相關聯,且可包括與所述特定執(zhí)行環(huán)境相關聯的唯一且機密的值。在一些實施方案中,可能不使用上下文信息。然而,上下文信息提供額外安全性等級。舉例來說,如果攻擊者能夠通過利用程序代碼的信息泄露脆弱性來從存儲器讀取帶標記的代碼指針,那么攻擊者仍可潛在地控制所述程序代碼的流,來調用與所述帶標記的代碼指針相關聯的驗證入口點中的任一者。攻擊者將被限制于使用包含于所述利用中的帶標記的代碼指針中的地址,但所述帶標記的代碼指針可彼此取代來更改程序流。但,上下文的添加進一步限制了攻擊者通過上下文來對代碼指針進行分組的能力。引入上下文作為驗證功能的額外自變量,且僅具有相同上下文的指針可彼此取代。因此,包含所述上下文的本文所揭示的技術可用以強制執(zhí)行程序代碼的控制流完整性(CFI),其條件是在加載時,用恰當的上下文為代碼指針加標記。
處理器110可經配置以使得在相同執(zhí)行等級操作的執(zhí)行環(huán)境無法存取與在相同或較高等級操作的其它執(zhí)行環(huán)境相關聯的上下文信息。處理器110可經配置以使得在較高權限等級操作的執(zhí)行環(huán)境可能夠存取、修改和/或產生與在較低權限等級操作的執(zhí)行環(huán)境相關聯的上下文信息。在一些實施方案中,處理器110可經配置以使得在較高權限等級操作的執(zhí)行環(huán)境可能夠存取、修改和/或產生與僅在低于當前權限等級的一個等級操作的執(zhí)行環(huán)境相關聯的上下文信息。
可將加密算法應用于所述代碼指針,以產生驗證標記(階段415)。所述加密算法可為消息驗證碼(MAC)。圖8中說明的實例實施方案使用MAC算法830來產生驗證標記835。對MAC算法830的輸入是在階段405中獲得的密鑰820、在階段410中獲得的上下文信息825,以及將加標記的代碼指針815??墒褂肕AC算法830和密鑰820來對上下文信息825和代碼指針815進行加密。上下文信息815可包括可在產生驗證標記以提供額外安全性層時使用的唯一值。嘗試對代碼指針做出未經授權的修改以試圖取得對程序代碼的執(zhí)行流的控制的惡意方將不知道與其中正執(zhí)行程序代碼的執(zhí)行環(huán)境相關聯的上下文信息,且將不容易能夠復制驗證標記835。舉例來說,如果惡意方曾能夠利用允許存取帶標記的代碼指針的存儲器錯誤,那么帶標記的代碼指針可僅被與相同上下文相關聯的其它帶標記的代碼指針取代。
圖5是用于用驗證標記來修改代碼指針以產生帶標記的代碼指針的實例過程的流程圖。圖5中說明的過程可用以實施圖2中所說明的過程的階段215。圖5中所說明的過程可使用圖1中所說明的計算機系統100來實施。圖1中所說明的實例計算機系統100提供其中可實施圖5中所說明的過程的一個計算機系統的一個實例,并且圖5中所說明的過程可通過具有與圖1中所說明的實例不同的架構的計算機系統的處理器實施。將參考圖8的圖來論述圖5中說明的過程,其提供用于產生代碼指針的驗證標記且用于修改所述代碼指針以產生帶標記的代碼指針的過程的實例。
可使用掩碼來選擇來自所述驗證標記的與所述代碼指針相關聯的位(階段505)。在圖8中示出的實例中,可將掩碼810應用于代碼指針815和驗證標記835,以產生帶標記的代碼指針840。圖7中說明的過程說明可用于產生掩碼810的一種技術。此外,如上文所論述,所述掩碼可與特定執(zhí)行環(huán)境和/或與處理器110所實施的特定權限等級相關聯。在圖8中所說明的實例中,所述掩碼經配置以選擇19個位:16個上部位和3個最低有效位。所述掩碼用以從代碼指針815選擇對應的位。
可用選自驗證標記的位來代替代碼指針中的位,以產生帶標記的代碼指針(階段510)。在圖8中所說明的實例中,用驗證標記位來代替代碼指針815中對應于選自驗證標記的那些位的位,以產生帶標記的代碼指針840。舉例來說,可使用以下表達式來導出帶標記的代碼指針840的值:
(指針&~掩碼)|(標記&掩碼)
其中“指針”值表示代碼指針815的值,“~掩碼”值表示掩碼810的相反值,“標記”值表示驗證標記835,且“~掩碼”值表示掩碼810的值。
帶標記的代碼指針可存儲在與代碼指針相關聯的存儲器位置中(階段515)??蓪擞浀拇a指針840寫入到存儲器160中的位置或其它存儲器位置,其中最初存儲代碼指針815。處理器110可經配置以在執(zhí)行與帶標記的代碼指針840相關聯的地址處的指令之前,解碼并驗證帶標記的代碼指針840。嘗試修改帶標記的代碼指針840的惡意方在不知道用以產生驗證標記835的算法、用以選擇應用來自驗證標記835的位代替代碼指針815的哪些位的掩蔽值810(在本文中也被稱作掩碼810),和/或用以產生驗證標記835的上下文信息825和密鑰820的情況下,將不能夠產生所述代碼指針的有效值。
或者,可修改圖5中說明的用于產生帶標記的代碼指針的過程,使得可如上文在階段505中所論述那樣選擇來自驗證標記835的位,但可修改階段510,使得來自代碼指針的位是選自使用掩碼810的相反值的代碼指針。選自驗證標記835的位和選自代碼指針815的位可接著組合以創(chuàng)建帶標記的代碼指針840。
圖6是用于根據圖4中說明的代碼指針驗證過程來驗證已受保護的帶標記的代碼指針的實例過程的流程圖。圖6中說明的過程可用以實施圖3中所說明的過程的階段310。圖6中所說明的過程可使用圖1中所說明的計算機系統100來實施。圖1中說明的實例計算機系統100提供其中可實施圖6中說明的過程的一個計算機系統的一個實例,且圖6中所說明的過程可由具有與圖1中所說明的實例不同的架構的計算機系統的處理器實施。將參考圖8和9的圖來論述圖6中所說明的過程,其提供用于從帶標記的代碼指針恢復驗證標記且用于確定所述帶標記的代碼指針是否已更改的過程的實例。
可使用掩碼來確定從帶標記的代碼指針恢復的代碼指針值(階段605)。可使用用于圖5中說明的過程的階段505中的掩碼810從帶標記的代碼指針840確定經恢復的代碼指針905,以產生用以修改代碼指針并創(chuàng)建帶標記的代碼指針840的驗證標記835。如上文所論述,所述掩碼可與處理器110相關聯,且處理器110可具有對用于不同執(zhí)行環(huán)境和/或權限等級的不同掩碼的存取權。處理器110可經配置以在處理器110已實施多個執(zhí)行環(huán)境和/或權限等級的情況下,為與正執(zhí)行的程序代碼相關聯的執(zhí)行環(huán)境和/或權限等級選擇適當的掩碼810。使用所述掩碼來從帶標記的代碼指針840選擇用來自驗證標記835的位代替的位。帶標記的代碼指針840的選定位由值805代替,所述值是這些位的原始值,以產生經恢復的代碼指針905。用于確定值805且用于產生掩碼位的過程在圖7中說明,且將在下文詳細論述。
舉例來說,可使用以下表達式來導出經恢復的代碼指針905的值:
(值&掩碼)|(帶標記的代碼指針&~掩碼)
其中“值”表示值805所表示的共用位集合,“掩碼”值表示掩碼810的值,“帶標記的代碼指針”值表示帶標記的代碼指針840,且“~掩碼”值表示掩碼810的相反值。
可至少部分地基于經恢復的代碼指針、上下文值和密鑰來產生經恢復的驗證標記(階段610)。在圖9中說明的實例中,通過將MAC算法830應用于經恢復的代碼指針905來產生經恢復的驗證標記915。MAC算法830接收密鑰820、經恢復的代碼指針905和上下文值825作為輸入。用于產生經恢復的驗證標記915的過程類似于圖4和8中說明的其中產生帶標記的代碼指針840的過程。除最初用以產生帶標記的代碼指針840的密鑰820和上下文信息825之外,還提供經恢復的代碼指針905,作為MAC邏輯830的輸入。MAC邏輯830輸出經恢復的驗證標記915。
可使用所述掩碼從帶標記的代碼指針提取嵌入的驗證標記值(階段615)??墒褂糜靡詮膸擞浀拇a指針840提取經恢復的代碼指針905的掩碼810從代碼指針提取嵌入的驗證標記910。
舉例來說,可使用以下表達式來導出嵌入的驗證標記910的值:
經恢復的代碼指針&掩碼
其中“經恢復的代碼指針”表示經恢復的代碼指針905的值,且“掩碼”值表示掩碼810的值。
可從經恢復的驗證標記915提取帶掩碼的標記值(階段620)。如在圖8和9的實例中可看出,選自經恢復的代碼指針905以創(chuàng)建嵌入的驗證標記910的所述位集合并不包含最初包含驗證標記835的所有的位。然而,在將掩碼810應用于經恢復的驗證標記915之后,可將經恢復的驗證標記915與嵌入的驗證標記910進行比較??蓪⒀诖a810應用于經恢復的驗證標記915,以產生帶掩碼的標記920。此過程類似于上文所論述的用于從帶標記的代碼指針840確定嵌入的驗證標記910的過程。
舉例來說,可使用以下表達式導出帶掩碼的標記920的值:
經恢復的標記&掩碼
其中“經恢復的標記”表示經恢復的代碼指針905的值,且“掩碼”值表示掩碼810的值。
將經恢復的驗證標記與嵌入的驗證標記進行比較(階段625)。階段625也由圖9的框925表示。接著可將帶掩碼的標記920與嵌入的驗證標記910進行比較以產生結果930。如果帶掩碼的標記920與嵌入的驗證標記910進行比較,那么帶標記的代碼指針840已成功地驗證,且結果930可包含驗證成功的指示。帶標記的代碼指針840的值不大可能已經更改,因為產生帶標記的代碼指針840并將其放入存儲器中。如果帶掩碼的標記920并不與嵌入的驗證標記910匹配,那么帶標記的代碼指針840尚未成功地驗證,且結果930可包含驗證不成功的指示。帶標記的代碼指針840的值已經更改或損壞,因為已產生帶標記的代碼指針840并存儲在存儲器中。處理器110可經配置以在驗證未能阻止惡意程序代碼承擔對處理器110正執(zhí)行的程序代碼的流的控制的情況下,執(zhí)行錯誤處置程序。
圖7是用于產生可結合本文所論述的代碼指針驗證技術使用的掩碼的實例過程的流程圖。圖7中所說明的過程可使用圖1中所說明的計算機系統100來實施。圖1中說明的實例計算機系統100提供其中可實施圖6中說明的過程的一個計算機系統的一個實例,且圖7中所說明的過程可由具有與圖1中所說明的實例不同的架構的計算機系統的處理器實施??稍趫?zhí)行圖2到6、8和9中說明的過程之前,執(zhí)行圖7中說明的過程。舉例來說,圖7中說明的過程可在處理器110正執(zhí)行程序代碼的靜態(tài)或動態(tài)鏈接時執(zhí)行。處理器110還可經配置以在執(zhí)行圖2到6、8和9中說明的過程之前的其它時間,執(zhí)行圖7中說明的過程。
可將程序代碼中所識別的多個代碼指針進行比較(階段705)。處理器110可經配置以將程序代碼中的多個代碼指針進行比較,以確定與所述代碼指針相關聯的地址中的共用位集合。可用驗證標記值來代替一組程序代碼中的代碼指針共用的位,而不損害所述代碼指針,且不需要用于存儲所述驗證標記的額外存儲空間。此方法可幫助可需要對處理器110的架構做出改變以支持本文所揭示的代碼指針驗證技術的次數最小化。
可識別與代碼指針相關聯的地址中的共用位集合(階段710)。所述共用位集合可用作圖8和9中說明的實例中所說明的值805的基礎,且在圖6中說明的過程中用于驗證帶標記的代碼指針840。在圖8和9中示出的實例中,代碼指針具有共用的16個上部位和3個最低有效位。處理器110可經配置以將從與代碼指針相關聯的地址中的共用位集合導出的值805存儲在處理器110可存取的寄存器或其它存儲器中,之后當處理器110需要驗證與所述程序代碼相關聯的代碼指針時,可存取所述寄存器或其它存儲器。處理器110可經配置以將值805放置在從其它執(zhí)行上下文中正執(zhí)行的程序代碼和/或通過相同和/或較低權限等級處正執(zhí)行的程序代碼不可存取的寄存器或其它存儲器位置中。
可程序代碼供使用的地址空間可為有限的,且代碼指針可尋址的存儲器的量通常比代碼指針可尋址的存儲器的量大得多。在一些系統中,例如一些64位系統,可由代碼指針表示的可能可尋址的范圍進一步受限。處理器110還可經配置以使得靜態(tài)和動態(tài)鏈接器經配置以使存儲器中的程序代碼段對準,使得代碼在運行時封裝在一起。這可導致代碼指針具有較多的共用位,從而增加可用以將驗證標記信息存儲在帶標記的代碼指針中的位的數目。
可基于與代碼指針相關聯的地址中所識別的共用位來產生掩碼(階段715)。舉例來說,基于從將程序代碼中的代碼指針進行比較以識別來自所述代碼指針的共用位而導出的值805來產生圖8和9中說明的實例中的掩碼810。圖8和9中未說明比較步驟,且在這些圖中所說明的加標記和驗證過程之前將已經執(zhí)行。可將掩碼810中的位設定成二進制值1,其中代碼指針中的每一者中的對應位共享相同的值,且可將掩碼810中的位設定成二進制值0,其中所述代碼指針中的每一者中的對應位并不全部共享相同的值。處理器110可經配置以將掩碼810存儲在從其它執(zhí)行上下文中正執(zhí)行的程序代碼和/或通過相同和/或較低權限等級處正執(zhí)行的程序代碼不可存取的寄存器或其它存儲器位置中。
取決于應用,可通過各種裝置來實施本文中所描述的方法。舉例來說,這些方法可在硬件、固件、軟件或其任何組合中實施。對于硬件實施方案,處理單元可實施于一或多個專用集成電路(ASIC)、數字信號處理器(DSP)、數字信號處理裝置(DSPD)、可編程邏輯裝置(PLD)、現場可編程門陣列(FPGA)、處理器、控制器、微控制器、微處理器、電子裝置、經設計以執(zhí)行本文中所描述功能的其它電子單元,或其組合內。
對于固件和/或軟件實施方案,可用執(zhí)行本文中所描述的功能的模塊(例如,程序、函數等等)來實施所述方法。在實施本文所描述的方法時,可使用有形地體現指令的任何機器可讀媒體。舉例來說,軟件代碼可存儲在存儲器中,并且由處理器單元執(zhí)行。存儲器可在處理器單元內或處理器單元外部實施。如本文中所使用,術語“存儲器”是指任何類型的長期、短期、易失性、非易失性或其它存儲器,且并不限于任何特定類型的存儲器或特定數目的存儲器或特定類型的媒體。有形媒體包含機器可讀媒體的一或多個物理物品,例如隨機存取存儲器、磁性存儲裝置、光學存儲媒體等等。
如果以固件和/或軟件實施,那么可將所述功能作為一或多個指令或代碼存儲在計算機可讀媒體上。實例包含編碼有數據結構的計算機可讀媒體和編碼有計算機程序的計算機可讀媒體。計算機可讀媒體包含物理計算機存儲媒體。存儲媒體可為可由計算機存取的任何可用的媒體。作為實例而非限制,此種計算機可讀媒體可包括RAM、ROM、EEPROM、CD-ROM或其它光盤存儲器,磁盤存儲器或其它磁性存儲裝置,或任何其它可用于存儲呈指令或數據結構形式的所要程序代碼且可由計算機接入的媒體;如本文中所使用,磁盤和光盤包含壓縮光盤(CD)、激光光盤、光學光盤、數字多功能光盤(DVD),軟性磁盤和藍光光盤,其中磁盤通常以磁性方式再現數據,而光盤用激光以光學方式再現數據。以上各項的組合也應包含在計算機可讀媒體的范圍內。此些媒體還提供可為機器可讀的非暫時性媒體的實例,且其中計算機為可從此些非暫時性媒體讀取的機器的實例。
在不脫離本發(fā)明或權利要求的精神或范圍的情況下,本文中所論述的一般原理可應用于其它實施方案。