随着智能手机逐渐融入生活,手机上承载的业务也逐渐由开始的通讯娱乐扩展到人们的衣食住行,说到这些自然离不开钱。当手机厂商谈到钱的时候,用户第一个想到的问题就是安全,特别是在今天这个恶意病毒软件横行当道的年代。随着各种安全门,存款被盗事件在手机上爆发,国内的各大手机厂商,支付公司,出版商,银行也逐渐开始意识到手机安全问题,现在都开始在积极寻找手机安全解决方案。ARM在十几年前意识到安全问题对于移动产品的重要性,就推出TrustZone硬件安全解决方案,最近Linaro也开源了基于TrustZone实现的OP-TEE(Open Source Trust Execution Environment),今天我们就来在Fast Model上玩一玩OP-TEE。
OP-TEE概述
TEE背后的基本思想就是将和安全服务提取到独立的安全环境中去运行,当主系统有安全相关的操作时,通过发动请求到安全环境获取系统预定义的服务。基于此OP-TEE可以分为三个部分,TEE客户端和用来和安全环境通讯的TEE驱动,这2个部分都运行在主系统(Android/Linux…),运行在安全环境中的TEE OS以及在上面的安全应用,具体参见下图。
编译&运行
具体编译参考Linaro官方网站的脚本,注意修改其中的默认目录。编译成功后,所有的生成文件都在arm-trusted-firmware/build/fvp/debug目录下。
arm-trusted-firmware/build/fvp/debug/bl1.bin系统运行后执行的第一个程序,运行在EL3,会负责将arm-trusted-firmware/build/fvp/debug/fip.bin解压(BL2/BL3)运行,FIP最后会将Linux kernel加载,由于我是在Win7上运行Fast Model,所以我将filesystem.cpio.gz, fdt.dtb(device tree)和Image(内核)拷贝到脚本运行的目录,因为在系统启动过程中,BL3会通过semi-host的方式加载Linux内核。
调试
由于OP-TEE的运行环境涉及到用户态和安全态,而且需要频繁在2个状态之间进行切换,如果在真实的硬件上进行调试往往无法得到安全状态下的信息,而在FastModel上这些信息都很容易得到,甚至每一条指令都可以Trace,这样调试安全应用会方便很多,尤其是搭配DS-5进行使用,比如在用户态下查看安全状态下的一些寄存器,DS-5会自动进行切换到安全态读取寄存器后再切换回用户态。同时如果需要调试Boot code甚至内核,可以将符号表加载进DS-5便可进行单步调试。
注意在加载boot code的符号表的时候,要注明他运行的安全空间,因为各个ELx之间的内存空间是相互独立的。
上图显示1处便是动态添加符号表的地方,2处显示当前状态下所以的函数列表,3是列出了当前执行的指令,当然在关联符号表后,还可以找到对应的源码