# [AIdrifter CS 浮生筆錄](https://hackmd.io/s/rypeUnYSb) Trusted Execution Environment (TEE) ## 前言 **何謂TEE ?** 為了預防原本架構下的作業系統被Hacker入侵,另外用一個安全的OS去保護敏感的資料,限制主CPU無法去access 另外一個OS的記憶體區段,以達到保護的功效,一般來說,敏感的資料有下列這些 - 非對稱式 or 對稱式的加解密金鑰 - 加密的Streaming (EX: ES Data) 兩個OS彼此溝通,通常透過API`TEEC_InvokeCommand()`,將資料放在兩塊OS彼此共享的Shared memory上面,此種機制也可以視為是一種IPC(Inter-Process Communication)的溝通。 ## ARM TrustZone [官方網站](https://www.arm.com/products/security-on-arm/trustzone) ![Sample](https://www.arm.com/-/media/global/products/security-on-arm/arm-trustzone-for-cortexA.jpg?revision=e339b88b-e9db-4ff3-b53c-6465e8344e65&h=339&w=354&la=en&hash=072763EA72D36C3B5F1E9D29EEDB4EB1CA37633F) ARM TrustZone 是個使用**硬體**作為區分的 TEE 系統。不安全以及安全的程式執行時透過控制硬體資源的調度分配來確保安全執行的環境。不安全以及安全程式在互相調度時使用的是 - 軟體實作的 secure moniter (Cortex-A 系列) - 硬體的核心邏輯 (Cortex-M系列)。 其主要應用於需要在硬體層級確保安全執行的環境,如: * 認證機制確保 * 加解密 * 數位版權管理 (DRM) 以 Cortex-A 系列為例,為了完整劃分 Trusted 以及 Non Trusted,透過 [AMBA](https://www.wikiwand.com/en/Advanced_Microcontroller_Bus_Architecture)、外部設備(peripherals)以及processor內部的硬體實現。每個物理處理器core皆有兩個**虛擬核心**可使用,其一為安全的另一個則是不安全的, - 1. 提供上下文切換機制(secure moniter exception), - 2. 使用時可以使用其提供的指令(SMC - Secure Moniter Call)或者引發一些其他exception,促使 secure moniter 進行上下文切換。 實際切換的方法是儲存目前的process status至non-securted OS(REE),進入TEE做完相關operations後,接著recovery切換回原本的REE OS process status。 ### arm-trusted-firmware 上面提到的 secure moniter 本身亦被 ARM 所實作,並開放原始碼於 Github,命名為 [arm-trusted-firmware](https://github.com/ARM-software/arm-trusted-firmware),其當然不只有 secure moniter,如下圖: ![](https://www.arm.com/-/media/arm-com/products/security/TrustZone/Firmware.png?revision=1755262a-ddec-46c5-8952-8e6536f67f5b&h=450&w=454&la=en&hash=1AF7113DFCAC5F3FD33A4B3F99A4AD1A1CDA285C) 這個專案可以理解為一個 firmware,其運行於作業系統(或虛擬機之管理系統 Hypervisor) 之下,根據作業系統本身是否為 Trusted 來決定執行環境。 ### OP-TEE/optee_os http://kernel.meizu.com/2017/08/17-33-25-tee_fp.html 在開源世界中亦有人在 ARM 的 TrustZone 技術之上實作了一個可信任的虛擬作業系統(Trusted OS) - [optee_os](https://github.com/OP-TEE/optee_os)。 當然,其實際上支援了數十種平台如以下: ``` Allwinner A80 Board ARM Juno Board Atmel ATSAMA5D2-XULT Board FSL ls1021a NXP ls1043ardb NXP ls1046ardb NXP ls1012ardb FSL i.MX6 Quad SABRE Lite Board FSL i.MX6 Quad SABRE SD Board FSL i.MX6 UltraLite EVK Board NXP i.MX7Dual SabreSD Board ARM Foundation FVP HiSilicon D02 HiKey Board HiKey960 Board Marvell ARMADA 7K Family Marvell ARMADA 8K Family MediaTek MT8173 EVB Board QEMU QEMUv8 Raspberry Pi 3 Renesas RCAR Rockchip RK322X STMicroelectronics b2260 - h410 (96boards fmt) STMicroelectronics b2120 - h310 / h410 Texas Instruments DRA7xx Texas Instruments AM57xx Texas Instruments AM43xx Xilinx Zynq 7000 ZC702 Xilinx Zynq UltraScale+ MPSOC ``` ## TEE Use case 這樣的 TEE 技術在真實世界中有幾個主流的應用領域: * "安全" 的實作根據 聯網裝置在進行聯網認證時需要一個認證的基礎(常為一個 key),這類需求常會出現在需要進行無線更新的移動裝置(e.g. 手機),當這類裝置需要更新韌體時其必須百般確保更新進來的韌體是正確的。利用 TEE,其可以將認證用的資訊存入受保護的記憶體空間,即使裝置上的應用程式遭到感染並嘗試攻擊系統,依然可以避免系統韌體遭到置換。 * 物聯網設備之安全管理 許多物聯網設備必須儲存管理各種敏感資料,若硬體支援 TEE,則可以將這些資訊儲存於受保護的安全空間中,使得未經認證的應用程式無法碰觸到甚至修改這些敏感資訊。 * 韌體保護 韌體所控制的裝置當中亦包含不少有價值並且敏感的硬體(e.g. **金融卡讀卡機**、**行動支付**),為避免其資料輕易遭到竊取以及竄改,韌體在從外部裝置搬運資料至記憶體時,可以為其準備受保護的記憶體空間,確保資訊無法被外部應用程式竊取。 * 使用認證過的軟體控制硬體 許多的 ASSP (e.g. 藍芽晶片組) 雖包含預裝軟體,但其依然允許開發人員使用自製的軟體控制。為了防止產品出產後遭到惡意程式竄改甚至取代出廠時所裝配的軟體,將其放置於受保護的記憶體空間中,即可確保這個控制軟體的正確性,並降低遭到逆向的可能。 實際的應用則有以下: * [Android TEE](https://source.android.com/security/trusty/) * [阿里雲 IoT-TEE 安全套件](https://iot.aliyun.com/product/tee) * [專題報導 行動支付安全元件之存取控制](https://www.fisc.com.tw/Upload/9920fd22-3489-406f-957d-a7acff52e251/TC/08.%20蘇偉慶、黃建隆.pdf) 這裡僅擷取部份應用,實際上應用十分大量,而這些應用都是聚焦在於不安全的環境創造安全的環境並執行程式。 ## 延伸 ### QEMU 在這個 TEE 技術中,身為處理器模擬大老理所當然也支援 ```Arm-TrustZone``` 的技術。透過這款模擬器,便可不必購買昂貴的硬體開發包以及NDAs條款的簽署,我們便可以於 QEMU 之上建立一套 TEE 系統。 ![QEMU TrustZone](https://www.linaro.org/assets/blog/quem-trusted.jpg) 以上是使用 QEMU 模擬時採用 ```Arm-TrustedZone``` 技術的架構圖,可以發現其在系統中跟 [arm-trusted-firmware](#arm-trusted-firmware) 幾乎是相同的位置,其都位於 Trusted OS 之下,但實際上 QEMU 可以說是整台電腦的模擬器甚至是個 hypervisor,並且於其中包裝 ```Arm-TrustedZone``` 使得使用者可以直接於其上安全的運行程式。 ### Intel 如何創造Securted OS ? - Software Guard Extensions 關鍵特性為何? 與以往沙盒系統不同的是,SGX 將欲保護的程式放進 enclave 中,而這塊 enclave 是獨立的一塊記憶體,程式透過 API 能夠進到這塊受保護的區域,而任何未經授權的動作都會被拒絕,另外該區塊的程式 swap 出 CPU 時會經過加密,如下圖所示,如果直接讀取記憶體的話只會拿到加密後的結果,使得安全性程式能夠得到完整的保護不受攻擊。 ![MSA](https://cdn2-techbang.pixfs.net/system/images/320393/original/fdef11e8c39990b57ddafb77cb11f3a8.jpg?1444019222) 在找 SGX 的應用時偶然發現了 UHD 的關鍵字,再搜尋發現原來認證影片的 DRM 也是使用 SGX 來實作。 。 ### ELF 執行檔格式包含哪些 section 呢?又在哪裡可見到詳細描述? > TODO LIST: > * ELF 的 sections 有何用途? > * main() 放在哪一個 section (***hint: .symtab***) 以下列出常見的 sections: |section名稱|說明| |:--------:|:-:| |.text|程式段| |.data|資料段| |.bss|未設初值的全域變數| |.rodata|唯讀資料段| |.dynamic|動態連結資訊| |.dynstr|動態連結用字串表| |.got|動態連結用的全域位移表| |.plt|動態連結用的程式連結表| |.interp|記錄程式解譯器的路徑| |.ctors|物件導向中的建構函數| |.dtors|物件導向中的解構函數| |.hash|雜湊表| |.init|在主程式執行前會執行此段落| |.fini|在主程式執行後會執行此段落| |.rel<name>|重定位資訊,例如: rel.text 是程式段的重定位資訊,rel.data 則是資料段的重定位資訊。| |.shstrtab|儲存 section 名稱| |.strtab|字串表| |.symtab|符號表| |.debug|除錯資訊(保留給未來用)| |.line|除錯時的行號資訊| |.comment|版本控制訊息| |.note|附註資訊| 使用 `objdump` 指令可看到執行檔的詳細 sections,舉例如下: ``` $ objdum -x tests/basic [FIXME] To be Continued... ``` 參考資料: (https://hackmd.io/s/HJP5QDOJf) * [目的檔格式 (ELF)](http://sp1.wikidot.com/elfobjfile) --- ### Reference * [ARM TrustZone](https://www.arm.com/products/security-on-arm/trustzone) * [AMBA](https://www.wikiwand.com/en/Advanced_Microcontroller_Bus_Architecture) * [arm-trusted-firmware](https://github.com/ARM-software/arm-trusted-firmware) * [optee_os](https://github.com/OP-TEE/optee_os) * [ARM TrustZone in QEMU](https://www.linaro.org/blog/core-dump/arm-trustzone-qemu/) * [Android TEE](https://source.android.com/security/trusty/) * [阿里雲 IoT-TEE 安全套件](https://iot.aliyun.com/product/tee) * [專題報導 行動支付安全元件之存取控制](https://www.fisc.com.tw/Upload/9920fd22-3489-406f-957d-a7acff52e251/TC/08.%20蘇偉慶、黃建隆.pdf) * [Intel Skylake 微架構處理器小異動,新出貨版本將具備 SGX 安全功能](https://www.techbang.com/posts/39194-intel-skylake-microarchitecture-processors-will-open-sgx-security-features) * [Intel® SGX Details](https://software.intel.com/en-us/sgx/details)