WF曲速未来表示:本文章具技术性地解决了暴露给攻击者的攻击面和热点,以及在TrustZone中可用的不同权限级别实现代码执行后可以执行的操作。
TrustZone攻击面
确定目标攻击面始终是漏洞研究过程的第一步。TrustZone的攻击区域包括三点:
1)直接发送到监视器的消息处理程序。
2)在TrustZone中运行的第三方应用程序(trustlet)。
3)安全启动组件,它可以允许在加载TrustZone之前执行代码,从而能够破坏TrustZone本身。
跟随用户输入
为了执行漏洞搜索,必须确定提供给攻击者的攻击面,即可以使用哪些参数来影响程序。要做到这一点,必须遵循从Normal World传递到Secure World的参数,以确定如何调用Secure World中可用的函数。
浏览开源通信驱动程序
要弄清楚参数如何从Normal World传递到Secure World,即如何在SMC(Secure Monitor Call)中传递参数,可以浏览Normal World开源驱动程序。如驱动程序源代码中所述,执行SMC指令(名为smc)的函数由称为scm_call的函数调用(其中scm代表安全通道管理器)。当需要将信息从普通世界传递到安全世界时使用它,通过填写以下结构来执行此操作:
由于scm_response结构,我们收到了TrustZone内核的答案 :
下面的列表显示了实际执行SMC操作码的最后一个函数:
在此清单中,r1指向内核堆栈地址,r2指向分配的scm_command结构的物理地址。r0设置为1,表示该scm是正常的。但是,对于需要较少数据的命令,或者当不需要结构时,存在另一种形式的scm_call。
另一种形式的SCM称为scm_call_ [1-4],其中数字是传递给监视器的参数数量。这些函数用于发出具有给定参数,服务和命令ID的SMC。使用宏SCM_ATOMIC将服务ID,命令ID和参数号放在r0中。由于r0不再等于1,它向TrustZone内核指示以下SCM是一个原子调用,其参数编号在r0中编码,参数本身放在r2到r5中。
攻击者的第一个攻击面:安全监视器(基于Qualcomm的设备)
现在已经确定了正常世界如何与安全世界对话(感谢监视器,它充当了世界之间的桥梁),我们可以搜索功能及其服务ID和命令ID之间的链接。
为了获得Normal World所请求的功能,填充有结构的阵列静态地放置在监视器中。此静态数组对应于攻击者可用的攻击面。结构的格式如下:
1.服务ID和命令ID的串联;
2.指向SCM函数名称字符串的指针;
3.一个未知的整数;
4.指向处理功能的指针;
5.参数编号;
6.数组由每个参数的大小填充,一个整数由参数组成
Qualcomm的可信执行环境实施中的漏洞
这个错误和监视器处理消息的反向是由Gal Beniamini完成的。这个在三星S5上重现的错误很有趣,因为它可以在处理器的最特权模式下执行任意代码:监控模式(EL3)。
浏览通过SCM可用的所有功能列表,并逐一分析它们,导致发现tzbsp_es_is_activated函数中的新漏洞。此漏洞允许将零DWORD写入攻击者(在r0中)给出的任意地址,包括TrustZone监视器和内核。
使用以下修补程序修复了此漏洞
启示
此漏洞允许攻击者在监视器(EL3)中的运行时获得任意代码执行。这可以用于后门普通世界以及安全世界,但也可以用于检测或将调试器放入安全世界(在监视器或安全操作系统级别),以便在TrustZone操作系统中找到新的漏洞(TEE-OS)。
第三方应用程序中的漏洞(CVE-2018-14491,基于Qualcomm的设备)
可以在/ system / vendor / firmware或/ firmware / image下检索基于Qualcomm的设备可用的Trustlet,并将其拆分为不同的文件,即trustlet_name.b00,trustlet_name.b01...和trustlet_name.mdt。Qualcomm的TrustZone实现使操作系统能够在TrustZone中加载二进制文件,以扩展安全执行环境提供的功能。这些二进制文件称为trustlet。Gal Beniamini完全颠倒了文件系统中可用的信任片的格式,并开发了一个脚本来重建有效的ELF可以加载到IDA。
但是,一旦完成了trustlet文件格式的反转,问题仍然存在:
1.普通世界如何向安全世界发出请求加载信任小组的请求?
2.普通世界如何在运行时与它通信?
这些任务由qseecom驱动程序执行,该驱动程序提供API以执行高级任务,依赖于安全通道管理器(特别是scm_call函数)提供的原语 。
加载信任时所需的所有功能都可通过此内核模块获得,该内核模块又使用适当的请求命令ID将正确的结构填充到Secure World中请求的功能。然后,Normal World可以使用qseecom_load_app函数加载trustlet,并使用qseecom_send_cmd向其发送数据。
一旦加载到Secure World,内核就会为trustlet分配一个ID并调用其入口函数。此入口函数将trustlet注册到TrustZone内核,并提供一个处理程序例程,该例程在Normal World调用trustlet的功能时触发。
接收消息的处理函数提供不同的函数,并且必须始终以命令otp_init开头,以初始化trustlet的内部状态,而不是陷入琐碎的错误案例处理。查看可用的不同函数,然后注意到它们都受堆栈cookie保护,除了一个名为otp_resync_account的函数。通过读取此函数中的第一行汇编,还注意到一个BLE指令,它是一个带符号的比较,(这对应于比较> 384在hexrays视图中)。这是天赐之物,因为我们的输入缓冲区不能包含空字节,因此这意味着对于无符号数字,这种比较总是正输出。但是,由于这个有符号的比较,我们可以在缓冲区中传递一个负值,如0xFFFFFFFF,然后跟随调用函数sub_68F8的分支(变量v3 在函数开头被初始化为0)。
这个函数特别有趣,因为它有一个memcpy漏洞,其长度和src参数直接由来自Normal World提供的缓冲区的攻击者控制,我们不需要任何内存泄漏,因为这个函数也没有堆栈cookie!
另一个幸运的突破是这个功能相同的memcpy(),特别是因为复制的数据及其长度由用户控制。是的,这意味着在没有cookie的函数中堆栈溢出:
启示
WF曲速区表示此漏洞使得在EL0 Secure World(用户安全世界)中获得任意代码执行成为可能。这特别有趣,因为它提供了对TrustZone内核执行系统调用的机会,从而访问新的攻击面以提升其在TrustZone内核中的权限。此外,它还提供对TrustZone操作系统功能的访问,例如提供对安全文件系统(SFS)的访问的开放和读取系统调用。Secure-filesystem是一个可用于永久存储的加密文件系统。它使用仅来自Secure World的特殊硬件密钥加密然后,确保来自可能已损坏的正常世界的数据的机密性。
结论
区块链安全实验室WF曲速未来表示:讨论了为普通世界中的用户提供的两个攻击面,并详细说明了两个漏洞:监视器中的一个漏洞,其利用允许在CPU的最高特权异常级别中获取任意代码执行。- 在trustlet中的另一个,用于在用户模式(EL0)Secure World中获得任意代码执行。WF曲速未来再次提醒最后一个漏洞可用于审核在TrustZone中运行的安全OS的安全性,并为攻击者启用新的攻击面。