TUI是TEE的一个重要基础模块。最初人们认识了解TEE最直观的展示就是TUI,早在指纹识别成为手机的标配之前,TEE的主要应用是围绕着TUI进行,但由于普适性不好需要适配工作、界面显示不友好,对丰富的界面和字体需求定制化等等一些原因,最后却由指纹芯片应用成为带动TEE技术普及的一个重要触发点。最近随着华为手机盾产品的强势问世,TUI重新成为了一个不可缺少的存在!当然除了手机盾,TUI在安全二维码中的应用也是一个重要方向,安智客认为TUI归根结底是在TEE中一个基于触摸和显示器件的一个应用软件安全模块,同样也涉及到驱动、服务、TEE功能模块、TA等等,本文安智客将TUI设计做一个简要总结。如有不对,欢迎指正。
1,TUI保护对象是什么?
安全的显示和安全的输入,首先必须保证屏幕上显示的画面内容必须在TEE的安全内存中,然后Linux驱动所获取到触摸器件的像素坐标,这时数据送往TEE处理解析,保证了输入数据的安全性,为了完成上述安全目标,Linux触摸驱动和显示驱动必须修改。同时TEE端增加TA、TUI驱动。
从应用层面来说,通过TUI保护PIN或Password等敏感信息的安全输入及保护输出显示敏感信息,如交易关键信息由用户确认后签名,抵御按键记录,屏幕获取,钓鱼等攻击方式,为用户建立安全通道。
2,TUI架构说明。
一个完整的TUI系统架构如下图所示:
TUI client applicant:客户端程序,运行在非安全端,处理业务命令逻辑,监控touch事件。
RSEE touch driver:触摸中断linux驱动。
TUI trusted application tee:端应用程序,运行在tee安全环境中。主要是显示和触摸两大模块,包括界面逻辑、字体库、图像处理和对外接口等。
TUI drivers:tee安全tui驱动提供安全内容显示及触摸坐标的安全硬件访问。
kernel driver:接收来自CA发送过来的事件消息, 通过smc操作,进行非安全与安全显示切换,在进入TEE之前, kernel driver负责打开i2c时钟。在退出安全世界进行REE测UI访问时, kernel driver负责关闭i2c时钟及将显示切换为非安全显示。
具体说来,TUI包含对触摸屏, 键盘外设和显示外设的应用。TUI显示时,REE端不能读写访问触摸,键盘和显示外设, TUI里面的事件也不能被REE铺获。TUI显示完毕, 由TEE切换到REE中,由REE控制触摸显示及其它外设。TrustZone 可保护安全区域的框架缓冲区 (frame-buffer)及其内容,因为该框架缓冲区无法被拦截、修改或隐藏。
3,完整的TUI执行流程是什么?
一个TUI工作流程同样包含APP、服务、CA、驱动、TA等部分,其运行流程和其他的TEE应用流程基本一致,首先应用发起调用CA,CA通过系统调用完成SMC中断进入EL3,然后在ATF完成执行级别切换到EL1,进入到TEE,TEE完成对TA的加载,TA运行。另外,服务主要是处理android端的异常事件,比如来电等。对于异常事件处理流程,GP规范有详细的介绍。
4,与指纹芯片相比软件差异在哪里?
安智客前面介绍过一次指纹软件流程,详见Android8.0中对指纹的新要求。比如指纹只是单向性的数据采集,手指接触到指纹模组、芯片产生中断,中断发起CA调用指纹TA流程,数据的采集、模版存储、对比工作,这一切都在TEE中完成,android端只提供界面框架和标准接口方法。而TUI则涉及到触摸输入和显示输出,在TUI中与指纹类似的部分是输入模块,触摸输入模块通过I2C总线接受TEEOS管理,如同指纹模组通过安全SPI总线接入TEEOS,也就是说android端驱动由于无法获知屏幕的用户点击的像素值而无法得知显示的是什么,且送往屏幕显示的数据内存已经被TEE保护了,是安全的内存。
随着相关规范的明确,未来手机盾+指纹的应用,指纹的全部流程都将在TUI中完成,详见Global Platform最新TUI规范与央行TEE规范。这些规范为TUI的产品应用指明了方向。