前言
在上一篇我们知道TA是什么,以及为什么需要加载TA。这里来写写加载TA后,怎么CA和TA,TA和TA怎么建立会话,实现我们的功能的。
参考内容全部来自《手机安全和可信应用开发指南》,少有OPTEE书籍,感恩前辈。这篇都是Copy加上一点自己的理解和看法,免得自己看书走神。
1、OP-TEE内核空间对创建会话的处理
当动态TA被加载到OP-TEE中后,enter_open_session成员变量所指向的函数进一步处理CA创建会话的请求。
在创建CA与动态TA的会话过程中,tee_ta_open_session函数会调用ctx->ops->enter_open_session接口,其对应的是user_ta_ops变量中的enter_open_session成员所指向的函数,该成员的值指向user_ta_enter_open_session函数。
user_ta_enter_open_session通过调用user_ta_enter函数来处理创建会话的操作,建立内存映射后会进入OP-TEE的用户空间去执行,user_ta_enter函数的内容和注释如下:
2 、切换到用户空间的实现
动态TA是运行在用户态,静态是内核态。(前面也举了一些栗子)
调用thread_enter_user_mode函数会进入到OP-TEE的用户空间。调用该函数时会指定切换到用户空间后的起始运行函数的地址。
在OP-TEE中该值被设置成ta_head->entry. ptr64,entry.prt64在user_ta_header.c文件中被赋值为__utee_entry,即当切换到用户空间后,系统将会执行__utee_entry函数。
如何实现这个切换呢?
OP-TEE中是通过调用__thread_enter_user_mode函数来实现的,该函数在AArch32中的内容如下:
切换到用户态后,系统将执行pc指针指向的函数,该函数会被赋值成entry.prt64的值,在用户空间调用__utee_entry继续执行。
3、执行用户空间的entry_open_session函数
当系统切换到OP-TEE的用户态后,会进入__utee_entry函数执行,该函数中会根据命令ID调用用户空间中的entry_open_session函数来执行特定TA中的创建会话接口的内容,该函数的内容和注释如下:
待执行完具体的动态TA中的TA_OpenSessionEntryPoint函数后,动态TA的创建会话操作也就完成,
在CA端可使用返回的会话ID通过调用命令的接口来调用该动态TA中的具体命令去执行特定的操作。(其实就是建立链接的过程,建立了链接就可以通过链接通信,有点计算机网络TCP的感觉,但是要是把这个CA的软件给劫持了是不是还是能穿过漏洞?这样的应该没法保护了吧。)
4.用户空间返回到内核空间
待entry_open_session执行完并返回到__utee_entry后,__utee_entry函数将会调用utee_return函数,通过系统调用的方式返回到OP-TEE的内核空间。
该返回操作最终会调用syscall_sys_return函数来实现。从用户空间切换回到内核空间的过程如图13-4所示。
这个调用和接触都是要经过内核态的,不是说直接两个就搞在一起了。
thread_unwind_user_mode函数主要是将寄存器的状态恢复到切换到用户空间之前的状态,该函数的内容如下:
到这里知道了整个TA-CA会话的创建与销毁的流程,对于这种函数的调用关系,建议大家可以画画图脸理清逻辑。
下一篇来看看TA命令是怎么操作的,安全吗?能不能解决我的那个疑惑。(疑惑的关键就在于一个没有授权的白名单应用能不能驱使一个授权的白名单应用去帮忙获取需要的隐私数据。)