14-Providing protection for complex software
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
相關鏈接: (專題:《learn-the-architecture系列》)
- 01-Introducing the Arm architecture
- 02-Armv8-A Instruction Set Architecture
- 03_Introduction_to_AMBA_AXI
- 04-TrustZone for Armv8-A
- 05-Exception model
- 06-GICv3_v4_overview
- 07-Armv8-A virtualization
- 08-Isolation using virtualization in the Secure World_Whitepaper
- 09-LearnTheArchitecture-MemoryManagement
- 10-Armv8-A memory model guide–ongoing
- 11-Memory Management Examples
- 12-Generic Timer
- 13-Introduction to security
- 14-Providing protection for complex software
- 15-Arm-Confidential-Compute-Software-Stack
- 16-Understanding the Armv8.x extensions
文章目錄
- 1、Stack smashing and execution permissions
- 2、Return-oriented programming(ROP)
- 3、Jump-oriented programming
1、Stack smashing and execution permissions
最傳統的一種攻擊方式是棧溢出(stack smashing)。 有很多類型的棧溢出。 棧溢出的基本形式涉及惡意軟件將新的操作碼寫入內存,然后嘗試執行寫入的內存。如下演示了這個過程 :
通常,用來發起攻擊的內存是堆棧內存。 這就是名稱stack smashing 的由來。 為了防止棧溢出,現代處理器架構,如Arm架構,有執行權限(execution permissions)的設置。 在Armv8-A中,主要的控制是 翻譯表中的執行比特位。 如下列出translation engine1的EL0和EL1的執行權限:
- UXN User (EL0) Execute-never
- PXN Privileged Execute-never
設置其中一個位將頁面標記為不可執行。 這意味著任何分支到該頁內某個地址的嘗試都會觸發一個異常,以Permission錯誤的形式出現。 有單獨的特權和非特權位。 這是因為應用程序代碼需要在用戶空間(EL0)中執行,但不應該使用內核權限(EL1或EL2)執行。 另一種形式的攻擊包括濫用系統調用,試圖獲得特權代碼來從用戶內存調用代碼。
下圖顯示了運行在操作系統(OS)下、具有預期執行權限的應用程序的簡化但典型的虛擬地址空間:
該體系結構還在系統控制寄存器SCTLR_ELx中提供了控制位,以使所有可寫地址不可執行。 啟用此控件將使堆棧等位置不可執行。
無論PXN和SCTLR_ELx控件如何配置,在EL0上可寫的位置永遠不會在EL1上可執行
這些控制加在一起可以為我們所描述的各種攻擊提供強大的保護。 翻譯表屬性和寫入控件可以阻止任何位置的執行,惡意代碼可以寫入,如下圖所示:
2、Return-oriented programming(ROP)
術語: Pointer Authentication Code (PAC)
像我們所描述的執行權限這樣的特性使得執行任意代碼變得越來越困難。 這意味著攻擊者使用其他方法,如面向返回編程(ROP)。 ROP利用了許多現代系統中軟件堆棧的規模優勢。 攻擊者分析系統中的軟件,尋找小工具。 gadget是一段有用的代碼,通常以函數return結尾.
我們正常的程序中,一般都是在進入函數的時候,將返回地址(LR寄存器)做了一個壓棧的操作,函數返回之前,再將LR從棧中還原.
ROP的模型,就是修改棧中LR的值,使其按照攻擊者預設的flow返回. 攻擊者將一串gadget串在一起,形成一個有效的由現有代碼片段組成的新程序:
進程地址空間中可用的任何庫都是gadget的潛在來源。 例如,C庫包含許多函數,每個函數都提供了潛在的gadget。 有了這么多可用的小工具,統計上就有足夠多的小工具可以組成任意的新程序。 有些編譯器甚至被設計為編譯到gadget,而不是匯編器。 ROP攻擊是有效的,因為它是由現有的合法代碼組成的,所以它不會被執行權限或從可寫內存執行的檢查捕獲。 對于攻擊者來說,查找小工具并創建生成新程序所需的序列是非常耗時的。 但是,這個過程可以自動化,并且可以重用來攻擊多個系統。 地址空間隨機化(ASLR)可以幫助防止自動和多次攻擊的實踐。
Armv8.3-A引入了pointer authentication選項。 pointer authentication可以減輕ROP攻擊。
指針身份驗證利用了指針以64位格式存儲的,其實并不是所有這些位都需要表示 地址。 虛擬地址空間的布局如下圖所示:
可以看到,任何有效的虛擬地址的前12位都是0x000或0xFFF。 當pointer authenticatio啟用時,高比特位用于存儲簽名,而不作為地址的一部分。 這個簽名也被稱為Pointer Authentication Code (PAC).
PAC使用指針的高比特位。 bit55位保留來表示是訪問頂部區域還是底部區域。 如下所示:
PAC可用的確切位數取決于虛擬地址空間的配置大小,以及是否被標記指針被啟用。 虛擬地址空間越小,可用位就越多。
為了防止ROP攻擊,在函數的開頭對LR中的返回地址進行簽名。 這意味著以較高的順序添加PAC
寄存器的位。 返回前,返回地址是通過PAC認證的,如果檢查失敗,則返回時產生異常。 下圖顯示了一個例子:
系統提供了5個128-bit keys. 每一個key都存在64-bit系統寄存器中:
? Two keys, A and B, for instruction pointers
? Two keys, A and B, for data pointers
? One key for general use
這些寄存器只能被EL1及其以上的異常級別操作.
指針簽名的模型:
How is the PAC checked?
如下圖所示,采用PAC*指令,進行指針簽名和指針驗簽的模型:
instructions introduce
- PACIxSP Sign LR, using SP as the modifier.
- PACIxZ Sign LR, using 0 as the modifier.
- PACIx Sign Xn, using a general-purpose register as modifier.
- AUTIxSP Authenticate LR, using SP as the modifier.
- AUTIxZ Authenticate LR, using 0 as the modifier.
- AUTIx Authenticate Xn, using a general-purpose register as modifier.
- BRAx Indirect branch with pointer authentication.
- BLRAx Indirect branch with link, with pointer authentication.
- RETAx Function return with pointer authentication.
- ERETAx Exception return with pointer authentication.
(注: x是指使用A密鑰還是使用B密鑰)
Use of the NOP space
為了兼容,在不支持Pointer authentication的處理器上,使用NOP代替AUTIASP
Enabling pointer authentication
SCTLR_ELx:
? EnIx - Enables instruction pointer authentication using key x
? EnDx - Enables data pointer authentication using key x
3、Jump-oriented programming
術語:Jump-Oriented Programming (JOP)
攻擊者利用BLR或BR指令可以跳轉任何可執行地址,攻擊模型如下所示:
Branch target instructions
為了幫助防范JOP攻擊,Armv8.5-A引入了Branch target instruction(BTIs)。 BTIs也被稱為landing pads。 可以對處理器進行配置,使間接分支(BR和BLR)只能允許目標著陸臺指令。 如果一個間接分支的目標不是一個著陸臺,一個分支目標異常會生成,如圖所示:
Enabling branch target checking
在翻譯表中使用一個新的位(GP位),為每個頁面啟用了對landing pad的支持。 每個頁面控件允許文件系統包含landing pad保護代碼和legacy代碼的混合物,如下所示:
How BTI is implemented?
PSTATE包含一個字段BTYPE,該字段記錄了分支類型。 在執行跳轉分支時,跳轉分支的類型被記錄在PSTATE.BTYPE中。 下面的列表顯示了BTYPE對于不同跳轉分支指令的值:
? BTYPE=11: BR, BRAA, BRAB, BRAAZ, BRABZ with any register other than X16 or X17
? BTYPE=10: BLR, BLRAA, BLRAB, BLRAAZ, BLRABZ
? BTYPE=01: BR, BRAA, BRAB, BRAAZ, BRABZ with X16 or X17
執行任何其他類型的指令,包括直接分支,都會導致BTYPE被設置為b00
總結
以上是生活随笔為你收集整理的14-Providing protection for complex software的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13-Introduction to s
- 下一篇: 15-Arm-Confidential-