1. 程式人生 > >三星KNOX中Trustzone核心完整性動態度量方案(TIMA架構)解析

三星KNOX中Trustzone核心完整性動態度量方案(TIMA架構)解析

三星TIMA方案利用Trustzone安全模組對普通世界作業系統核心提供執行時完整性保護,即使作業系統被攻擊者控制,也無法(1)修改原有合法核心程式碼(2)注入新的核心惡意程式碼(3)實施return-to-user攻擊,將使用者空間惡意程式碼在核心層執行。

這種設計思路的最大挑戰在於正常世界對自己的系統資源具有完全的控制權,如實體記憶體,頁表及相應的控制暫存器,一旦作業系統被敵手攻破,完全可以通過修改頁表配置改變原有記憶體訪問許可權,將只讀核心程式碼段修改為可寫,或將位於資料或堆疊區域插入的惡意程式碼修改為可執行。因此TIMA方案的核心思路是:通過安全的初始化過程使核心程式碼段在系統初始化後對映為只讀,並移除作業系統對自身虛擬記憶體管理(MMU)相關配置的修改許可權(包括頁表entry,TTBR暫存器等),頁表更新操作只能由安全世界驗證並代為執行。

為修改現有的頁表對映屬性配置,攻擊者必須執行以下操作之一來繞過安全世界的監控功能.

1)直接修改當前頁表內容,修改監控程式碼對應頁表表項的對映屬性為可寫;

2) 禁用MMU,直接修改監控程式碼的物理頁面;

3) 篡改頁表基址暫存器TTBR的值,使其指向敵手偽造的頁表,破壞監控內碼表的防寫;

4)將包含監控程式碼的物理頁面對映到可寫的虛擬地址,即雙重對映攻擊;

5)禁用WXN保護,注入重寫的系統功能;

6)取消程序使用者地址空間的PXN對映屬性.

其中,WXN,MMU,TTBR通過CP15安全協處理器的相關控制暫存器設定.由此可見,敵手需要通過修改相應頁表表項和相關控制暫存器,來消除虛擬記憶體保護機制對核心程式碼區的保護.

修改相關控制暫存器(MMU,WXN,TTBR)的指令和頁表更新操作.ARM架構提供專門修改控制暫存器的指令(ldc和mcr),直接將核心程式碼中的這2類指令替換為smc指令即可.這類監控點觸發時,安全世界需確保:

1)所有關閉MMU保護的操作被禁止.

2)所有關閉WXN保護的操作被禁止.

3)對於更新頁表基址暫存器(TTBR)的操作,安全世界需首先確保新頁表基址與某一合法程序sw_pcb中儲存的頁表基址一致,即確保此操作發生在正常的程序切換過程中.如果是程序建立後首次排程產生的TTBR切換,安全世界要確保新程序頁表內容不違背正常世界地址空間的許可權策略,即核心程式碼區域必須對映為只讀,使用者地址空間對映必須包含PXN屬性,且對於包含核心程式碼的實體記憶體,不能以可寫方式對映到其他虛擬地址,這要求安全世界記錄所有核心程式碼對應的實體記憶體頁地址.如果上述策略檢查通過,則允許TTBR更新操作執行,否則禁止.

對於修改控制暫存器的操作,ARM提供專門的指令,而頁表更新的操作是通過普通的記憶體讀寫指令完成的,安全世界無法區分核心對於頁表的更新和對非頁表記憶體的更新,而在所有記憶體寫操作處插入監控點會導致監控事件頻繁觸發,嚴重影響效率,因此不能通過識別記憶體寫指令的方式部署對頁表更新的監控點.TIMA借鑑虛擬化技術中影子頁表的管理機制,強制所有包含頁表的實體記憶體對映為只讀,每次核心更新頁表時,將由於頁許可權錯誤產生資料中止異常,跳轉到異常向量表執行異常處理程式.因此在異常向量表的資料中止異常處插入一個監控點,即可確保所有的頁表更新被安全世界攔截.為保證所有頁表記憶體被對映為只讀,安全世界需要在TTBR切換和頁表更新監控點中加入新的安全策略,即確保所有頁表實體記憶體為只讀且不存在可寫的多重對映.這要求安全世界在所有頁表建立時,記錄其實體地址.ARM-Linux預設採用二級頁表格式,對一級頁表,其建立發生在核心初始化自身頁表swap_pg_dir,並嘗試將其寫入TTBR時,或程序建立後首次排程,進行TTBR切換時.對二級物理頁表,其建立發生在一級頁表更新事件中,兩者都可以被已有監控點攔截,從而確保上述策略能夠被安全世界有效驗證.頁表更新陷入安全世界的流程如下圖所示


在資料中止異常監控事件觸發時,安全世界需要對3種不同情況分別進行處理:1)當異常由系統正常功能觸發時,如程序建立時的寫時拷貝機制,安全世界跳轉到正常世界相應的處理函式處即可.2)當異常由合法的頁表更新請求觸發時,如mmap系統呼叫,安全世界獲取呼叫引數代替核心完成頁表更新操作.雖然頁表記憶體在正常世界中對映為只讀,但2個世界具有獨立的地址空間對映,安全世界可以將正常世界實體記憶體對映到自身地址空間中進行修改,因此可以代理頁表更新操作.3) 對於其他頁表更新請求,安全世界需執行與TTBR修改操作相同的策略檢查.安全世界可以讀取正常世界的錯誤地址暫存器(data fault address register, DFAR),錯誤狀態暫存器(data fault status register, DFSR)來獲取出錯地址和錯誤型別,以此區分上述3種情況.

綜上所述,需要在正常世界核心中插入2類監控點:控制暫存器修改(MMU,WXN,TTBR),資料中止異常,設定相應頁表對映許可權策略,即可確保核心程式碼的執行時完整性保護.

相關推薦

三星KNOXTrustzone核心完整性動態度量方案(TIMA架構)解析

三星TIMA方案利用Trustzone安全模組對普通世界作業系統核心提供執行時完整性保護,即使作業系統被攻擊者控制,也無法(1)修改原有合法核心程式碼(2)注入新的核心惡意程式碼(3)實施return-to-user攻擊,將使用者空間惡意程式碼在核心層執行。 這種設計思路的

如何使用gcc檢查動態符號的完整性

Check out the linker option "-z defs" / "--no-undefined". When creating a shared object, it will cause the link to fail if there are unr

數據庫的參照完整性(Foreign Key)

part 回滾 arc bsp 元祖 varchar 指定 系統 屬性 之前在項目中遇到了這樣一個問題,我舉得簡單的樣例來說明。 比方我們有兩個表,一個表(department)存放的是部門的信息,比如部門id,部門名稱等;還有一個表是員工表(staff),員工表裏面肯

python學習(二)python核心數據類型

核心 ble 學習 經驗 隨心所欲 創建 相關 字符串 cells 數據類型是編程語言中的很重要的一個組成部分,我所知道的有數據類型的好處有:在內存中存放的格式知道,規定了有哪幾種可用的操作。我的埋點:為什麽要有數據類型那麽python中的數據類型有哪幾種呢? 對象類型

wpf靜態資源和動態資源的區別

一次 div font size res static 靜態 mil source 靜態資源(StaticResource)指的是在程序載入內存時對資源的一次性使用,之後就不再訪問這個資源了。 動態資源(DynamicResource)指的是在程序運行過程中然會去訪問資源。

SpringAOP:Proxy動態代理淺解析(被代理對象必須實現接口)

ima throwable light public RR eth 對象 處理 span 小貼士:以下內容純屬個人觀點,如有不當請指出並諒解 import java.lang.reflect.Proxy; Proxy可以動態代理一個對象 寫一個代理工廠類ProxyFac

muduo庫核心:std::bind和std::function

muduo main ons 源碼 綁定 func 靜態成員 con 函數 最近在讀完陳碩大牛的《Linux多線程服務端編程》以及muduo源碼後,對其中的一些實現細節有著十分深刻的印象,尤其是使用std::bind和std::function的回調技術。可以說,這兩個大殺

使用ctypes在Python調用C++動態

sage contex count free ini val 結果 struct 加法 使用ctypes在Python中調用C++動態庫 入門操作 使用ctypes庫可以直接調用C語言編寫的動態庫,而如果是調用C++編寫的動態庫,需要使用extern關鍵字對動態庫的函數進行

深入理解RPC——RPC在企業服務核心價值

方案 很多 系統交互 分布式系 管道 keep 數據交互 代理 距離 隨著企業 IT 服務的不斷發展,單臺服務器逐漸無法承受用戶日益增長的請求壓力時,就需要多臺服務器聯合起來構成「服務集群」共同對外提供服務。同時業務服務會隨著產品需求的增多越來越腫,架構上必須進行服務拆分,

三星系列NXP系列核心板設計研發-迅為嵌入式ARM方案提供商

多種核心板平臺,從硬體原型設計、layout、硬體驅動,作業系統移植、中間到上層應用等方面。   三星系列核心板:   1. SCP-4412核心板 三星Exynos4412 四核 Cortex-A9 主頻為1.4GHz-1.6GHz 記憶體:1G

android如何打造一個動態的底部導航欄

在開發專案中底部導航是必不可少的控制元件之一,雖然網上已經有很多開源的專案可以用,如果一些特定的需求,導致專案不能用的話,那就頭大了,所以明白如何做一個動態導航欄,還是很有必要的。本教程主要針對一些初級的android程式設計師,利用隨手可得的控制元件來完成,而不是用自定義View的方式

Vueimg的src動態賦值本地路徑報錯

問題:我想根據tabIndex是否是當前值,來判斷顯示本地不同的圖片。我按照下面的寫法,頁面會報404找不到相應圖片地址。   <div class="tab-item" @click="tabIndex=0"> <img :src="tabIndex ==

Hive如何根據表某個欄位動態分割槽

使用hive儲存資料時,需要對做分割槽,如果從kafka接收資料,將每天的資料儲存一個分割槽(按天分割槽),儲存分割槽時需要根據某個欄位做動態分割槽,而不是傻傻的將資料寫到某一個臨時目錄最後倒入到某一個分割槽,這是靜態分割槽。   Hive動態分割槽步驟如下: 1、建立某一個源表模擬資料來源並

vue的導航欄動態新增class(三目運算子)

1.三目運算子,:class=" isActive==‘aaa’ ? ‘isActive’ : ‘’ ",@click=“toggle(‘aaa’)”。判斷isActive是否等於aaa,相等 -> class=“isActive”,不等 -> class=’’,點選的時候帶

Spring --17.Spring核心監聽器ContextLoaderListener

開發環境: JDK 1.8 Idea 2017 Tomcat:apache-tomcat-8 Spring:5.0.7 1、概述 ContextLoaderListener是Spring中的核心監聽器,當web工程啟動時, 該監聽器負責建立Spring的IOC容器,存放在Servle

react使用antdesignform元件,動態設定Input的值

問題: 在使用Antdesign的form元件時,通過initialValue來設定Input的值,在form未驗證之前,可以通過initialValue來對input賦值,但是form驗證之後,雖然state中存在值,但是不能在input中顯示,form也不能再次提交,程式碼如下所示:

Shell的多變數動態賦值問題

實際文字處理的時候會碰到多個變數,動態賦值的問題。比如說在遍歷1到100的數字,將其動態賦值給 var_1=1 var_2=2 var_3=3 ...... var_100=100 如果按常規的話,是賦值不成功,這個時候要藉助declare和export來完成 藉助decla

如何在CentOS 7安裝核心標頭檔案

在本文中,我們將解釋如何使用預設包管理器從基本儲存庫中安裝CentOS / RHEL 7和Fedora發行版中的核心標頭檔案。 當您在CentOS系統上編譯自定義核心模組(如裝置驅動程式)時,您需要在系統上安裝核心標頭檔案,其中包括Linux核心的C標頭檔案。 核心標頭檔案在安裝或

25(java的反射和動態代理)

1 概述 反射獲取的都是class物件,以下是在不同的階段獲取物件的方式。 2 原始檔階段class物件的作用 可以利用全類名創造物件,具體程式碼為: 3 class物件獲取類中的欄位(即成員變數) 註釋:通過Class.forName()獲取到了Pe

spring的設計模式——動態代理(一)

前言 今天一定要把這一篇部落格補上,前段時間看了看動態代理的jdk方式如何實現,用起來簡單,但是jdk中的實現就不那麼容易了~~ 代理模式的特點 有執行者、被代理者兩種角色 這件