在安全域與次安全域之間進行轉(zhuǎn)換時保護安全數(shù)據(jù)和程序代碼免受非安全訪問的數(shù)據(jù)處 ...的制作方法
【技術(shù)領域】
[0001] 本發(fā)明涉及數(shù)據(jù)處理領域,并且特別涉及敏感數(shù)據(jù)和代碼的處理。
【背景技術(shù)】
[0002] 很多數(shù)據(jù)處理系統(tǒng)及架構(gòu)提供了隔離并保護敏感數(shù)據(jù)和代碼部分不被無權(quán)的人 或進程訪問的方法。雖然能夠提供安全是重要的,但是在與該保護相關(guān)聯(lián)的性能和電路面 積中存在開銷。
[0003] 在諸如微控制器之類的小型系統(tǒng)中,將這些開銷保持較低是非常重要的,從而可 能需要在安全等級與性能之間做出折衷。
[0004] 英國劍橋的ARM?用其Trustzone結(jié)構(gòu)提供了保持數(shù)據(jù)和代碼安全的一個方 法,其中存在安全狀態(tài)和非安全狀態(tài)(也被稱為安全和非安全域),并且異常指令被用于在 狀態(tài)之間進行轉(zhuǎn)換,該異常處理器保護安全側(cè)的安全。雖然該方法提供了很高的安全度,但 是需要以軟件異常處理器形式的相當大的軟件干預來改變安全狀態(tài),這既降低了系統(tǒng)的性 能,又增加了為安全軟件開發(fā)外部應用程序接口API所需的工作量,因為所有通話必須通 過異常處理器來代理。類似地,雖然在安全域中發(fā)生但需要在非安全域中處理的異常也需 要通過安全異常處理器來代理,這允許安全狀態(tài)在控制轉(zhuǎn)到非安全異常處理器之前得到保 護。
[0005] US7966466和US2008/0250216公開了一種供選擇的安全系統(tǒng),其中數(shù)據(jù)存儲設備 具有安全側(cè)和非安全側(cè),并且在該數(shù)據(jù)存儲設備中代碼當前正被執(zhí)行的位置確定了處理器 正在其中操作的域,從而確定了允許訪問的數(shù)據(jù)。
[0006] 包含安全狀態(tài)的許多系統(tǒng)架構(gòu)只允許用于在狀態(tài)之間進行轉(zhuǎn)換(通常通過使用 異常)的一種機制,因為這簡化了保護安全狀態(tài)中的數(shù)據(jù)和程序代碼安全的任務。但是,為 了提高速度和效率,也可以提供用于在安全和次安全狀態(tài)之間進行轉(zhuǎn)換的多種機制。例如, 由Microchip科技公司開發(fā)的CodeGuard系統(tǒng)允許異常和直接函數(shù)調(diào)用作為用于在安全性 狀態(tài)之間進行轉(zhuǎn)換的機制。但是,使用用于在狀態(tài)之間進行轉(zhuǎn)換的多種機制增加了對惡意 攻擊的脆弱性,例如,允許次安全狀態(tài)中的軟件試圖通過具有與用于從安全狀態(tài)轉(zhuǎn)換到次 安全狀態(tài)中的原機制不同的類型的返回機制返回安全狀態(tài)(例如,通過使用函數(shù)調(diào)用返回 來從異常返回,或使用異常返回來從函數(shù)調(diào)用返回)。
【發(fā)明內(nèi)容】
[0007] 從第一方面來看,本發(fā)明提供了一種數(shù)據(jù)處理裝置,所述數(shù)據(jù)處理裝置包括:處理 電路,所述處理電路被配置為響應于程序代碼而執(zhí)行數(shù)據(jù)處理操作;數(shù)據(jù)存儲設備,所述數(shù) 據(jù)存儲設備被配置為存儲數(shù)據(jù),所述數(shù)據(jù)存儲設備包括多個區(qū)域,所述區(qū)域包括安全區(qū)域 和次安全區(qū)域,其中所述安全區(qū)域被配置為存儲當在安全域中操作時可被所述處理電路訪 問而當在次安全域中操作時不可被所述處理電路訪問的敏感數(shù)據(jù);所述數(shù)據(jù)存儲設備包括 多個棧,所述棧包括在所述安全區(qū)域中的安全棧;所述處理電路包括棧訪問電路,所述棧訪 問電路被配置為響應于需要從所述安全域轉(zhuǎn)換到所述次安全域的事件而將預定處理狀態(tài) 存儲到所述安全棧;如果所述事件是第一事件類型,則由所述棧訪問電路存儲的所述預定 處理狀態(tài)至少包括被存儲在所述安全棧上的預定相對位置處的返回地址;如果所述事件是 第二事件類型,則由所述棧訪問電路存儲的所述預定處理狀態(tài)至少包括被存儲在所述預定 相對位置處的第一值,其中所述第一值不是程序代碼的有效地址;并且所述處理電路還包 括故障檢查電路,所述故障檢查電路被配置為在接收到從所述次安全域到所述安全域的第 一事件類型返回時,如果存儲在所述預定相對位置的數(shù)據(jù)是所述第一值,則標識第一故障 情況。
[0008] 根據(jù)本發(fā)明,允許多個事件類型導致在安全域和次安全域之間的轉(zhuǎn)換。如果事件 需要從安全域轉(zhuǎn)換到次安全域,則棧訪問電路被安排為在向次安全域的轉(zhuǎn)換發(fā)生之前將某 預定處理狀態(tài)存儲在安全棧上。什么被存儲在安全棧上作為該預定處理狀態(tài)將取決于事件 類型,并且被選擇來保證如果次安全程序代碼試圖使用與不同事件類型相關(guān)聯(lián)的返回來返 回到安全域,則這將被檢測到。
[0009] 特別地,如果導致從安全域轉(zhuǎn)換到次安全域的事件是第一事件類型,則棧訪問電 路存儲在安全棧上的預定處理狀態(tài)至少包括返回地址,并且該返回地址被存儲在安全棧上 的預定相對位置處(例如,在棧訪問電路使用的棧幀的底部條目處來存儲預定處理狀態(tài), 或在相對于該底部條目的某預定偏移處來存儲預定處理狀態(tài))。
[0010] 類似地,如果事件是第二事件類型,則在該事件中由棧訪問電路存儲的預定處理 狀態(tài)至少包括被存儲在該預定相對位置處的第一值。該第一值是不是程序代碼的有效地址 的值。
[0011] 如果隨后第一事件類型返回從次安全域到安全域被接收,則故障檢查電路將從預 定相對位置取回數(shù)據(jù)。由于第一事件類型返回正在被使用,則應該是該預定相對位置存儲 先前由棧訪問電路存儲的返回地址的情況。但是,如果相反它存儲第一值,則這指示次安全 程序代碼正在試圖通過第一事件類型返回來返回而不管原來從安全域到次安全域的轉(zhuǎn)換 是由于第二事件類型的事實的情況,并且在這種情況下,故障檢查電路將標識第一故障情 況,從而標記該活動。因此,該機制防止惡意用戶使用很多種攻擊,包括在給定先前導致從 安全域轉(zhuǎn)換到次安全域中的時間類型的情況下,試圖通過使用與應該使用不同的事件類型 返回到安全域中來間接執(zhí)行到安全代碼的任意分支。
[0012] 第一事件類型和第二事件類型可采用各種形式。但是,在一個實施例中,第一事件 類型時函數(shù)返回,并且第二事件類型是異常。因此,上述機制將保證試圖緊接從安全域異常 分支到次安全域中而執(zhí)行函數(shù)調(diào)用返回到安全域中的惡意攻擊將被阻止。
[0013] 在一個實施例中,如果事件是所述第一事件類型,則處理電路被配置為向所述次 安全域中被用于處理所述第一事件類型的程序代碼提供虛擬(du_y)返回地址,所述虛擬 返回地址不是程序代碼的有效地址。然后,當完成次安全域中被用于處理所述第一事件類 型的程序代碼時,虛擬返回地址使所述返回地址(即,實際返回地址)從安全棧中被獲取。 特別地,當看到虛擬返回地址時,棧訪問電路被安排為從安全棧加載預定相對位置處保留 的數(shù)據(jù),因此故障檢查電路可檢查該數(shù)據(jù)是指定所期望的返回地址,還是上面提到的指示 故障情況的第一值。
[0014] 在一個實施例中,虛擬返回地址還可被用于保證當事件導致從安全域轉(zhuǎn)換到次安 全域時,隨后的返回(使用該虛擬返回地址)將導致轉(zhuǎn)換回到安全域,從而允許故障檢查電 路執(zhí)行所需檢查。
[0015] 在一個實施例中,如果事件是異常,則由棧訪問電路存儲的預定處理狀態(tài)包括預 定簽名,并且故障檢查電路被配置為當接收到從次安全域到安全域的異常返回時,如果預 定簽名不在由棧訪問電路存儲的預定處理狀態(tài)中,則標識第二故障情況。
[0016] 通過這種方法,如果異常返回是緊接著通過函數(shù)調(diào)用來發(fā)生的從安全域到次安全 域中的轉(zhuǎn)換而從次安全域發(fā)布的,則已被棧訪問電路存儲在安全棧上的預定處理狀態(tài)將不 包括該預定簽名,并且相應地這將指示使用不正確返回的意圖攻擊。
[0017] 預定簽名可被置于安全棧內(nèi)的任意適當位置,并采用任意想要的形式。但是,在一 個特別有效的實施例中,預定簽名形成被存儲在預定相對位置處的上述第一值。因此,該單 個預定簽名使得第一和第二故障情況均能夠通過故障檢查電路來檢測。
[0018] 在一個實施例中,如果事件是函數(shù)返回,則處理電路被配置為向所述次安全域中 被所述函數(shù)調(diào)用標識的程序代碼提供虛擬函數(shù)調(diào)用返回地址,該虛擬函數(shù)調(diào)用返回地址是 從不是程序代碼的有效地址的地址范圍中選擇的,并且所述預定簽名具有與所述虛擬函數(shù) 調(diào)用返回地址不同的值。通過保證預定簽名具有與所述虛擬函數(shù)調(diào)用返回地址不同的值, 這簡化了處理電路的實現(xiàn),因為要被執(zhí)行的所需動作可只根據(jù)正在被分析的值來確定,而 與該值是從函數(shù)調(diào)用返回產(chǎn)生的還是從棧中讀取的無關(guān)。
[0019] 或者或此外,如果事件是異常,則處理電路被配置為向所述次安全域中被用于處 理所述異常的程序代碼提供虛擬異常返回地址,該虛擬異常返回地址是從不是程序代碼的 有效地址的地址范圍中選擇的;并且所述預定簽名具有與所述虛擬異常返回地址不同的 值。同樣,通過使預定簽名不同于虛擬異常返回地址可獲得實現(xiàn)效率。
[0020] 在一個實施例中,預定相對位置是棧訪問電路使用的棧幀內(nèi)的預定位置。雖然理 論上該位置可以是棧幀內(nèi)的任意位置,但在一個實施例中,該預定位置是棧幀的底部位置, SP,由棧指針指向的位置。
[0021] -旦第一故障情況被引發(fā),則存在很多方法可以處理第一故障情況。但是,在一個 實施例中,處理電路響應于所述第一故障情況而在所述安全域內(nèi)執(zhí)行故障處理程序代碼。 通過保證故障處理程序代碼在安全域內(nèi)被執(zhí)行,這防止了次安全域中的攻擊者重新獲取控 制,從而相應地防止了重試攻擊。
[0022] 作為用于阻止攻擊的任意重試的替代機制,數(shù)據(jù)處理裝置可被安排使得如果所述 第一故障情況被標識,則棧指針值不被調(diào)整,使得第一事件類型返回的重放也將導致所述 第一故障情況被標識。因此,通過不調(diào)整棧指針,攻擊者不能僅消費安全棧的最后位置并然 后重試攻擊以便在安全棧內(nèi)的不同位置處進入。
[0023] 在一個實施例中,上述兩種機制均可被用于提供對抗來自次安全域的攻擊的重試 的魯棒性。雖然以上機制是關(guān)于第一故障情況的處理來描述的,但是其也可被等同應用于 第二故障情況的處理。
[0024] 在一個實施例中,可引起來自次安全域的潛在攻擊的另一情境隨著安全棧的初始 化而出現(xiàn)。在該時刻,安全棧將是空的。如果在該時刻,正在被執(zhí)行的程序代碼在次安全域 中,則程序代碼可能試圖返回到安全域中。該返回應被阻止,因為不存在從安全域到次安全 域的原轉(zhuǎn)換來合理地從其返回。在一個實施例中,數(shù)據(jù)處理裝置通過保證在安全棧的初始 化時,第二值被存儲在安全棧上的所述預定相對位置處來提供保護不受這種情景危害,所 述第二值與所述第一值不同,并且也不是程序代碼的有效地址。然后,故障檢查電路被配置 為當接收到從次安全域到安全域的返回時,如果存儲在所述預定相對位置中的數(shù)據(jù)是所述 第二值,則標識第三故障情況。根據(jù)該實施例,從次安全域的返回將導致故障檢查電路加載 被存儲在安全棧上的預定相對位置處的數(shù)據(jù),并且在該情境中,該數(shù)據(jù)將標識上述第二值, 從而導致第三故障情況被檢測。第三故障情況的處理可與上述針對第一和第二故障情況相 同的方式發(fā)生,從而保證攻擊的任意重試也被阻止。
[0025] 在一個實施例中,第三故障情況與第一故障情況相同,并且相應地,相同的故障處 理代碼被用于這兩個故障情況。因此,在這種實施例中,故障檢查電路不必區(qū)分第一和第二 值。
[0026] 在一個實施例中,數(shù)據(jù)處理裝置還包括多個寄存器,并且如果事件是異常,則由棧 訪問電路存儲的預定處理狀態(tài)還包括至少所述寄存器的子集的內(nèi)容。在一個特定實施例 中,其內(nèi)容被棧訪問電路存儲的寄存器的數(shù)量將取決于該