一、Tee介紹
TEE (Trusted Execution Environment) 被定義為運行於一個信任環境中的小型操作系統,它採用硬件安全模塊 (HSM) 來增強其安全性能。TEE 專註於安全,支持安全的數據和代碼處理,允許保存和共享客戶數據,確保其完整性,防止其被篡改或泄漏。
TEE 在 Android 平台上被廣泛應用,它的主要功能之一是實現加密安全方案。TEE 作為 CPU 的一個副本運行,只分配少量的 RAM 和存儲空間。該技術的目的是提供一種安全的執行環境,同時保證代碼和數據安全,這對於需要進行敏感操作和數據的應用程序非常重要。
二、Tee的實現方式
在 Android 平台上,有兩種 Tee 的實現方式,分別是 Global Platform Tee 和 Trusty Tee。
1. Global Platform Tee
Global Platform Tee 是由硬件廠商實現的 TEE,它通過硬件提供安全保證,比如 ARM Trustzone 或高通 QSEE 等。全球範圍內,許多廠商已經生產了支持 ARM Trustzone 的處理器,這使得它成為實現 Global Platform Tee 的理想選擇。
// 示例代碼 int open_session() { uint32_t ret = 0; TEEC_Result result = TEEC_ERROR_GENERIC; TEEC_UUID uid = GP_TEE_UUID; result = TEEC_InitializeContext(NULL, &ctx); if (result != TEEC_SUCCESS) { LOGD("TEEC_InitializeContext failed with code 0x%x", result); return -1; } memset(&sess, 0, sizeof(sess)); result = TEEC_OpenSession(&ctx, &sess, &uid, TEEC_LOGIN_PUBLIC, NULL, NULL, &ret); if (result != TEEC_SUCCESS) { LOGD("TEEC_OpenSession failed with code 0x%x", result); goto out; } out: TEEC_FinalizeContext(&ctx); return ret; }
2. Trusty Tee
Trusty Tee 是 Android 平台上的TEE,它是通過軟件實現的,可以在不同的處理器上以用戶應用程序的形式運行,不需要獨立芯片,使得 TEE 的實現更加簡單和靈活。
與硬件實現TEE相比,Trusty Tee 不依賴於芯片硬件支持,因此它可以在許多不支持硬件 TEE 的設備上運行。另一方面,它的安全性可能會受到威脅。
// 示例代碼 int open_session() { int fd; fd = open("/dev/trusty-ipc-dev0", O_RDWR); if (fd < 0) { LOGD("failed to open trusty device.\n"); return -1; } return fd; }
三、基本操作
在使用 TEE 前,需要進行一些常見操作,包括初始化 TEE 環境、打開會話等。下面示例代碼中的 GP_TEE_UUID 指的是 Global Platform Tee 上的 TEE UUID,這裡通過它來打開會話。對於 Trusty Tee,可以通過 /dev/trusty-ipc-dev0 這個設備節點來打開會話。
// 示例代碼 int open_session() { uint32_t ret = 0; TEEC_Result result = TEEC_ERROR_GENERIC; TEEC_UUID uid = GP_TEE_UUID; // 初始化 TEE 上下文 result = TEEC_InitializeContext(NULL, &ctx); if (result != TEEC_SUCCESS) { LOGD("TEEC_InitializeContext failed with code 0x%x", result); return -1; } memset(&sess, 0, sizeof(sess)); // 打開會話 result = TEEC_OpenSession(&ctx, &sess, &uid, TEEC_LOGIN_PUBLIC, NULL, NULL, &ret); if (result != TEEC_SUCCESS) { LOGD("TEEC_OpenSession failed with code 0x%x", result); goto out; } out: // 結束 TEE 上下文 TEEC_FinalizeContext(&ctx); return ret; }
四、Tee的數據讀寫
TEE 可以使用共享內存機制,在 TEE 和 Android 應用程序之間進行數據讀寫,實現數據的保護。共享內存可以通過類似 mmap 的調用來實現,在 Android 系統中,這個過程可以通過 C++ 接口分別在客戶端和 TEE 中完成。
// 示例代碼 int read_data() { uint32_t ret; TEEC_Result result = TEEC_ERROR_GENERIC; TEEC_Operation operation; // 共享內存 TEEC_SharedMemory shared_mem; // 分配共享內存空間 int mem_size = 1024; char* mem = new char[mem_size]; shared_mem.buffer = mem; shared_mem.size = mem_size; // 進行讀操作 memset(&operation, 0, sizeof(operation)); operation.paramTypes = TEEC_PARAM_TYPES( TEEC_MEMREF_WHOLE, TEEC_NONE, TEEC_NONE, TEEC_NONE); operation.params[0].memref.parent = &shared_mem; result = TEEC_InvokeCommand(&sess, CMD_READ_DATA, &operation, &ret); if (result != TEEC_SUCCESS) { LOGD("TEEC_InvokeCommand failed with code 0x%x", result); goto out; } // 讀取共享內存數據 char* buffer = (char *)shared_mem.buffer; int buffer_size = get_buffer_size(buffer); char* buffer_data = get_buffer_data(buffer); ... // 操作完成,釋放內存 out: delete[] mem; return ret; }
五、TEE與Android應用程序的交互
TEE 通過執行非安全 TAs(Trust Applications)來處理應用程序發起的請求。TA 是一個無法直接調用的庫文件,它可以加載到 TEE 並訪問 TEE 的安全功能。Android 應用程序可以通過 TEE 的 IPC 機制與 TA 進行交互。
在 Android 系統中,TA 可以是一個動態鏈接庫(.so 文件),它可以被 Android 應用程序調用。如果需要訪問諸如加解密之類的安全功能,需要使用 TEE 來實現。
// 示例代碼 #include #include int ta_send_cmd(uint32_t cmd, void *in_buf, uint32_t in_size, void *out_buf, uint32_t out_size) { ipc_msg_t msg = { 0 }; ipc_msg_info_t msg_info = { 0 }; int rc = -1; /* send message */ msg.hdr.cmd = cmd; msg.hdr.num_out_objs = (out_size > 0) ? 1 : 0; msg.hdr.num_in_objs = (in_size > 0) ? 1 : 0; msg.data = in_buf; msg.len = in_size; if (ipc_send(trusty_channel, &msg) < 0) { LOGD("failed to send ipc message to %s\n", TA_NAME); return rc; } ...... }
六、總結
通過 TEE,可以實現安全的數據和代碼處理,允許保存和共享客戶數據,確保其完整性和防止其被篡改或泄漏。Android 平台上的 TEE 有兩種實現方式,分別是 Global Platform Tee 和Trusty Tee。TEE 可以使用共享內存機制,實現客戶端和TEE之間的數據讀寫。此外,TEE 還支持通過 TA 和 Android 應用程序進行交互操作,進行安全保障。Tee 使得安全敏感的應用程序在 Android 平台上更加安全,讓企業和用戶能夠放心地使用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/243081.html