TEE安全系统SMC深入理解

news2024/11/15 17:47:39

57dd2deb86ae635c73fe849ddf280011.png

1、TEE背景

在文章开始之前提几个问题:

  1. Android手机中至少运行着几个操作系统OS?

  2. 如何进入安全操作系统?

  3. 异常等级和安全操作系统之间的关系?

  4. SMC调用的实质、约定及流程是什么?

随着智能手机的普及,手机上数据的价值越来越高,如电子支付密码(包括传统密码、指纹、人脸),带版权信息的数据等。为了进一步保护这些数据的安全,ARM提出了trustzone技术,其原理是将cpu的工作状态和其它相关硬件资源(中断、内存、外设和cache等)划分为安全(secure)和非安全(normal)两种类型,来达到数据隔离与保护。当cpu运行在normal状态时,将只能访问non secure空间的资源,而不能访问secure资源。当cpu运行在secure状态时,既能访问non secure资源,也能访问secure资源。

在ARM上,基于trustzone技术实现了TEE(可信执行环境),与之对应的是REE(不可信执行环境),一般称TEE为Secure World,REE 为Normal World。OP-TEE(开源的TEE OS)运行中Secure World里边,Android运行在Normal World里边。

TEE具备以下特点:

  • 受硬件保护机制:TEE隔离于REE,只通过特定的入口于TEE通信,并不规定某一种硬件实现方法

  • 高性能:TEE运行时使用CPU的全部性能

  • 快速通信机制:TEE可以访问REE的内存,REE无法访问受硬件保护的TEE内存

0821e0ecea212f50caf02357e31d52ed.png

图1 ARM trustzone技术

2 、REE与TEE交互

在上1节中提到TEE和REE两个运行环境,当REE访问TEE的服务时,首先需要进入到非安全区的特权模式(在Android系统中表现为linux 内核态),在该模式下调用SMC,处理器将进入到监视模式,监视模式下首先备份非安全区的上下文,然后进入到安全区的特权模式,此时的运行环境是安全区的执行环境TEE,并执行TEE中相应的安全服务。

以OPTEE为例,REE与TEE交互及模式转换如下图,CA与TA简单的交互流程如下:

1) CA通过lib teec打开一次会话,通过系统调用进入内核EL1(特权模式),然后调用tee driver相关API

2)tee driver调用SMC命令进入EL3(监视模式)secure monitor

3)secure monitor下解析SMC命令,并找到optee对应的服务。并将CPU的控制交给到optee kernel

4)optee 加载TA程序,校准TA程序的合法性

5)TA开始执行,完成后返回到CA

371b4368f8940161aff0b436ee5dfdca.png

图2  REE与TEE交互框架

3 、深入SMC调用

在上节中了解到REE与TEE切换的关键是SMC,那么SMC实质是什么?其流程又是什么?

3.1 SMC指令

要深入了解SMC,需要从SMC指令开始探索,其指令如下图:

aae9dbbcb7fad945ccfa72e412360291.png

图3 SMC指令

指令格式为:SMC  #即SMC后边跟一个16位数。

但需要注意的是,该指令只能在EL1及更高的异常等级上调用,说明用户空间是不能直接调用该指令。

3.2 SMC指令错误码

对于AArch32架构,SMC32调用的错误码存放在R0中

对于AArch64架构,SMC64调用的错误码存放在X0中,SMC32调用的错误码存放在W0中。

3.3 SMC参数传递

对于AArch32架构,参数传递约定:

  • 函数标识符 -- R0

  • 函数参数-- R1-R7

  • 返回结果 -- R0-R7

  • 寄存器R4-R7必须保留,除非它们包含函数定义中指定的结果

  • 寄存器R8-R14由调用的函数保存,必须保存在SMC或HVC上

对于AArch64架构,参数传递约定:

  • 函数标识符 -- W0

  • 函数参数-- X1-X17

  • 返回结果 -- X1-X17

  • 寄存器X4-X17必须保留,除非它们包含函数定义中指定的结果

  • 寄存器X18-X30由调用的函数保存,必须保存在SMC或HVC上

3.4 SMC调用过程中寄存器使用约定

对于AArch32架构,寄存器使用约定如下表:

【注意】Rn:32位寄存器,所有位均可用

165af9a82f8ef5e866d597639ffe6a4f.png

图4 AArch32架构SMC调用寄存器约定

对于AArch64架构,寄存器使用约定如下表:

【注意】Xn:64位寄存器,所有位均可用。Wn:64位寄存器,低32位可用。

fde0aea9c02a215d27c802f5f0047936.png

e77f2134f9d26345a916fec287f342d8.png

图5 AArch64架构SMC调用寄存器约定

3.5 SMC服务标识范围

从3.1知道SMC调用格式:SMC  #

SMC可以根据不同的OEN(Owning Entity Number)区分不同的服务的功能,当注册SMC runtime service时,需要为对应service指定正确的OEN范围。具体如下表:

425e7d09f3b4da1df07cf42191feb0f6.png

图6 SMC服务范围说明

3.6 SMC函数标识范围

SMC对于不同的函数调用,也有一些约定,不同函数标识符值范围对于不同的服务,在0x0000 0000–0xFFFF FFFF范围内,未被表覆盖的数据将被保留。如下表:

79a910fe0092e2730279028164aeb0ed.png

4418bff496606f0e18f5d9a12bde2f17.png

图7 SMC函数范围说明

3.7 SMC返回值说明

SMC调用的错误码为有符号的整形:int

通用含义如下表,0表示调用成功,-1表示调用不支持。

8e9b257eb1fd31b6e969f93addce58a4.png

图8 SMC返回值说明

3.8 SMC调用的代码实现

根据3.1到3.7的介绍,如何用代码实现SMC调用?

源码路径:kernel-5.10/include/linux/arm-smccc.h

9e6fbd9c0a80fbd303476312e13b89ef.png

图9 [code]SMC宏定义

所以,AArch64架构SMCCC最终调用形式为:

__arm_smccc_1_1(“smc  #0”, __VA_ARGS__)

其中__arm_smccc_1_1的实现:

2376bc12c44d8403143e525bac38a17e.png

bebcad502edef123edf1a8faf6031916.png

图10 [code]__arm_smccc_1_1声明

__arm_smccc_SMC主要驱动用来将cortext切换到monitor模式的函数,在切换时保存上下文,SMC调用结束后,恢复上下文。

该函数是以汇编的方式编写,实现如下:

第2行的\instr  #0 扩展之后主是SMC #0 即执行SMC指令,进行模式切换,陷入到EL3中,后边单独介绍。

【注】SMC #0执行时,根据SMCCC约定,需要对通用寄存器进行赋值用于传递参数,在AArch32架构中,r0 - r3可以直接保存到寄存器中,r4 - r6需要被压入到堆栈中保存。

AArch64架构中,不需要此操作。

SMC执行完成之后,4、5行会把x0 - x3保存到栈中,根据SMCc约定,x0 - x3用于返回执行结果,即结构体arm_smccc_res。后边7-11行会根据条件是否返回结果arm_smccc_quirk。

【注】stp指令 把一对寄存器写入到右边内存中

dde34f8a4b1a15ef86f45fa27f236fcb.png

图11 [code]arm_smccc_smc函数声明

3.9 SMC调用两种方式

1、fast SMC模式:W0[31] == 1,在执行这类命令时,将会关闭cpu的irq和fiq中断。可保证其执行上下文是原子的,一度程度上影响系统的响应速度和实时性,一般用于执行速度很快的场景中

2、yielding 或者std SMC模式:W0[31] == 0,在执行这类命令时,不会关闭中断。在中断处理中可能需要转发normal world的foreign中断,同时在一些服务中可能需要通过rpc操作调用normal world的相关功能。

详见下表:

87a908f43ca5e3f51b01f278157e68ea.png

2895ca39c0e84dd49362aced9e6b3cb0.png

图12 SMC两种调用方式

4 、SMC处理流程

通过第3节知道SMC调用底层原理,本节将进一步探索SMC调用之后的流程,之后流程会涉及到EL3中的BL31流程,简单介绍如4.1。

4.1 secure monitor启动流程

BL31的启动流程如图9,BL31主要的工作有:

1 初始化cpu

2 初始化c运行时环境

3 初始化基本硬件,如timer、串口、gic等

4 创建页表,使能cache

5 加载后级镜像以及新镜像的跳转

6 若bl31支持el3中断,则初始化中断处理框架

7处理不同secure状态的SMC,初始化异常等级切换的上下文

8注册处理SMC命令的运行时服务

77345a0917619cdd59ad6a27ccccd214.png

图13 Secure monitor启动流程

注册服务的实现如下:

3e12b4063ae7cfe9fe139672af9a46cd.png

图14 [code]注册服务宏定义

在注册处理SMC命令服务时,DECLARE_RT_SVC宏定义了一个结构体__svc_desc_ ## _name,并将其放到了一个特殊的段rt_svc_descs中,若需要获取这些结构体指针,只需遍历这段地址即可。

59087a109bbd8dfbdcd75cd66e27c0af.png

图15 [code]注册服务初始化

各服务经过service->init()初始化后,完成了注册。

4.2 SMC详细处理流程

4.1节完成了TEE服务注册后,考虑从REE到TEE发起SMC调用,则会经历图10的流程。

357504434f5d1d1c64d40d50d6da817d.png

图16 SMC处理流程

SMC调用引发的同步异常被cpu捕获到,开始执行sync_exception_aarch64。

e644e30cd7e55d083299e7c4f35c3f79.png

图17 [code]异常sync_exception_aarch64

handle_sync_exception实际上是一个宏,关键操作执行smc_handler64

b53e1575ff81b53050ef4937361a7d29.png

图18 [code]handle_sync_exception宏

在smc_handler64中主要完成:

  • 保存x0 - x29等寄存器的值。

  • x5指向cookie,x6指向context structure (SP_EL3)

  • x12指向cpu_context,用于从ERET返回EL3

  • 使用SP_EL0堆栈

  • 保存SPSR_EL3, ELR_EL3, SCR_EL3等寄存器

  • 计算并加载指定的服务到x15

  • 跳转到x15所指的地址 -- std_svc_smc_handler

  • 执行完成后调用el3_exit返回

【注】:服务index最大为127,所以会检查x15第7位是否为1

3c51b907dabb9812b9c24133fa6a579a.png

591fdca6163ba6c45f548843821a7766.png

图19 [code]smc_handler64实现

执行完tee EL0的服务后,需要先返回到EL3中,然后返回到REE中,el3_exit主要完成:

  • 保存TEE中的SP_EL0,然后切换到SP_EL3

  • 恢复SPSR_EL3, ELR_EL3 ,SCR_EL3等寄存器

  • 恢复CPTR_EL3寄存器

  • 恢复通用寄存器(x1 - x29)

  • 最后调用exception_return宏,实际上调用eret,返回到REE环境中

7942e0f340f2f4603c8f9b69597ae2c6.png

41094e061a424ade80b981502a196b0d.png

图20 [code]exit_el3实现

【注】调用eret指令后,恢复PC指针,然后跳转到REE - EL1(Linux Kernel)中,跳转地址为el1的elr_el3设置的地址。

5、SMC服务处理

通过第4节知道SMC处理流程中会调用std_svc_setup.c中的服务函数:std_svc_smc_handler

这是一个顶层的SMC服务函数handler,是一个c语言函数,比较好分析:首选根据SMC_fid的值判断是否是psci的SMC指令,如果是,直接执行psci相关指令;否则根据SMC_fid进行选择执行。

函数处理完成后,会返回第4节的smc_handler64汇编代码中,继续执行。

【注】psci是arm提供的一套电源管理接口,当前一共包含0.1、0.2和1.0三个版本。它可被用于以下场景:

1 cpu的idle管理

2 cpu hotplug以及secondary cpu启动

3系统shutdown和reset

ffd4deafe1b963386da44e7492d46c97.png

8eecb9ed17147431256aadd36b727066.png

图21 [code]std_svc_smc_handler实现

6 结语

本文从TEE使用的背景切入,然后着重分析了REE与TEE交互过程的SMC相关原理和实现。中间涉及到arm构架,SMCCC调用约定,EL异常等级,BL启动流程,TEE服务注册及汇编代码分析等知识。

对于SMC涉及到的线程相关分析,不同的TEE OS实现不一样,这块对实际工作有较大影响,特别是TEE多线程,后边会继续深入研究。

【参考文章】:

https://zhuanlan.zhihu.com/p/401632688

https://www.jianshu.com/p/929d806f7caf

https://blog.csdn.net/shift_wwx/article/details/116005889

《DDI0487G_a_armv8_arm.pdf》

《DEN0028D_SMC_Calling_Convention-1.3eac0.pdf》

【源码获取】:

Linux内核源码:

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/?h=linux-5.10.y

基于ARMv8-A应用处理器,ARM开源参考实现BL31:

https://github.com/ARM-software/arm-trusted-firmware

Linaro 推出的开源TEE:

https://github.com/OP-TEE/optee_os

a6a6db8871a13aa8a3b760451ae13159.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章 | 精选教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据

原文链接:http://tecdat.cn/?p5919在本文中,我将介绍ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型如何用于预测时间序列数据(点击文末“阅读原文”获取完整代码数据)。使用滞后算子计算滞后差分…

[附源码]计算机毕业设计JAVA校园网学生成绩查询系统

[附源码]计算机毕业设计JAVA校园网学生成绩查询系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM …

Android面试题——高级开发面试题二

一 面试题概述 回答自己理解的java虚拟机、gc机制Java多线程、线程池集合原理(hashmap,list)java虚引用封装、继承、多态的理解activity生命周期安卓activity和fragment数据传递Handler内存泄漏、内存溢出、内存抖动 原因及解决办法ANR原因以及解决办法性能优化、卡顿优化事件…

xshell与xftp

目录 1.什么是xshell 2.下载xshell与xftp 3.安装与操作xshell 4.什么是xftp 5.安装与操作xftp 6.xshell与xftp互联 1.什么是xshell Xshell是一个强大的安全终端模拟软件,它支持SSH1,SSH2, 以及Microsoft Windows平台的TELNET协议。. …

[Camunda BPMN进阶] 电商订单流程设计与调试

目录 摘要 基于BPMN的软件设计思想 电商订单流程业务场景 基本订单流程BPMN设计 1.最基本流程设计 2. 添加超时未付款自动取消功能 3. 添加15分钟付款提醒 4. 添加用户取消订单事件 进阶订单流程BPMN设计 1. 使用并行网关执行任务 2. 将具有相同事件分支的任务合并…

基于PHP+MySQL月子中心管理系统的设计与实现

月子中心管理系统是信息时代的产物,月子基本是每个适龄女子都会经历的一个特殊时期,尤其是在中国对月子的重视程度尤其的重要,只有让产妇和婴儿受到精心的照顾才能够让产妇更好的康复,才能够让婴儿更好的成长,所以越来越多的人关注到了月子期间的养护问题,为了能够让更多的月子…

安卓APP源码和报告——学生信息管理系统

学生信息管理系统APP演示视频《移动开发技术II》实践考核方案 适用网络工程(网络软件开发)2018级 一、考核内容: 环境配置及移动开发生命周期、控件的使用、用户界面设计、数据存储与访问、广播、服务、网络编程、蓝牙应用等知识点。 二、…

canal同步MySQL的binlog数据时踩了个大坑

背景 在同步MySQL数据到ES的场景中,选择了canal组件同步数据。 问题描述 在同步的时候发现canal-adapter中canal-adapter/conf/es7/product.yml 配置文件中sql 语句连表查询的时候会出现无法更新Elasticsearch 中数据的情况,而且日志没有提示异常&…

python使用opencv画圣诞树和画小星星函数

画星星函数: #img 图片 #x y 坐标 #size 大小 def darw_star(img,x,y,color,size40):poly_linenp.array([[x, y-size], [xint(size/4), y-int(size/4)], [xsize, y-int(size/4)],[xint(0.375*size),yint(size/4)],[xsize,ysize],\[x,yint(0.625*size)],[x-size,ysi…

分布式定时调度:xxl-job 万字详解

一.定时任务概述 1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行,或者周期性的去执行某个任务,比如:每天晚上24点做数据汇总,定时发送短信等。 1.2.常见定时任务方案…

基于web的家电维修系统/家电维修管理系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的系统管理应运而生,各行各业相继进入信息管理时代&a…

生物素标记甾体化合物/多杀菌素探针分子/壳聚糖/聚乙二醇偶连基团为华生物提供

生物素标记的甾体化合物探针将D-生物素酰氯与胺反应,合成了新型生物素探针标记的甾体衍生物,经检测这些衍生物对某些肿瘤细胞株有较好的抗肿瘤活性,且对正常细胞株(HEK293T)没有明显的毒害作用。 生物素标记的多杀菌素探针分子,经检测验证,生物素标记多…

Python多字段排序函数——cmp_to_key()【LeetCode50天刷题计划寒假特别版(Day 1 — 最大数(11.40-12.20)】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言使用方法例子一、题目最大数示例提示二、思路三、代码前言 python标准模块functools中的cmp_to_key可以将一个cmp函数变成一个key函数,从而支持自定…

第二证券|支持多子女购房、提高公积金贷款额度、发放限时补贴

近来,多地购房支持方针密集出台。 12月1日,安徽安庆发布住所公积金新政,对多子女家庭首次请求住所公积金借款购买自住住所,最高借款额度添加10万元。 11月30日,江西九江也优化多子女家庭住所公积金事务,进…

[附源码]Python计算机毕业设计Django公益组织登记与查询系统论文

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Springboot集成shiro框架:

1, Shiro:是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。 使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 2,三…

POSIX线程(二)

目录 一、前言 二、Thread Attributes 1、Setting the Detached State Attribute(thread5.c) 2、Thread Attributes Scheduling (1)Scheduling(thread6.c) 三、Canceling a Thread 1、Canceling a …

[附源码]计算机毕业设计医院门诊管理信息系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

一篇打通线程 等待 中断

✨✨hello,愿意点进来的小伙伴们,你们好呐! 🐻🐻系列专栏:【JavaEE初阶】 🐲🐲本篇内容:介绍 线程的 中断,等待的区别 🐯🐯作者简介:一名现大二的…

思科防火墙——实验练习加命令

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.实验练习 1.实验(1)配置ASA接口 2.实…