tee漏洞学习-翻译-1:从任何上下文中获取 TrustZone 内核中的任意代码执行

本文主要是介绍tee漏洞学习-翻译-1:从任何上下文中获取 TrustZone 内核中的任意代码执行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:http://bits-please.blogspot.com/2015/03/getting-arbitrary-code-execution-in.html

目标是什么?

这将是一系列博客文章,详细介绍我发现的一系列漏洞,这些漏洞将使我们能够将任何用户的权限提升到所有用户的最高权限 - 在 TrustZone 本身内执行我们的代码。

由于我只有个人 Android 设备(搭载 Snapdragon 800 SoC 的 Nexus 5),因此我将重点关注我设备上的 TrustZone 平台 - 高通的 TrustZone 实现。

应该指出的是,高通的 TrustZone 平台存在于所有采用高通 SoC 的设备上,但是,它们也允许 OEM 对该平台进行修改和添加,我将在后面的博客文章中更详细地介绍这一点。

Android & Security

多年来,Android 中添加了许多安全机制,并且现有的安全机制也得到了改进。

虽然底层安全架构没有改变,但现代设备上的防御措施已经变得相当强大,以至于获得高权限可能成为一项相当困难的任务,很多时候需要多个漏洞。

如果您还没有阅读过,我建议您阅读 Google 的“Android 安全概述”,其中解释了安全架构并列出了当前正在使用的大部分安全机制。

在这里插入图片描述

什么是 TrustZone?

根据 ARM Ltd. 的说法,TrustZone 是:
“…针对各种客户端和服务器计算平台(包括手机、平板电脑、可穿戴设备和企业系统)的全系统安全方法。该技术支持的应用程序极其多样化,但包括支付保护技术、数字版权管理、BYOD 以及一系列安全的企业解决方案。”

简而言之,这意味着 TrustZone 是一个旨在在目标设备上启用“安全执行”的系统。

为了执行安全的 TrustZone 代码,需要指定一个特定的处理器。该处理器可以执行非安全代码(在“正常世界”中)和安全代码(在“安全世界”中)。所有其他处理器仅限于“正常世界”。

TrustZone 在 Android 设备上有多种用途,例如:

  • Verifying kernel integrity (TIMA)
  • Using the Hardware Credential Storage (used by “keystore”, “dm-verity”)
  • Secure Element Emulation for Mobile Payments
  • Implementing and managing Secure Boot
  • DRM (e.g. PlayReady)
  • Accessing platform hardware features (e.g. hardware entropy)

为了保护整个系统,系统总线上的特定位在进入“安全世界”时被设置,并在返回“正常世界”时取消设置。

外设能够访问这些位的状态,因此可以推断出我们当前是否在安全世界中运行。

TrustZone 的安全模型如何运作?

ARM 还对 TrustZone 安全模型的工作原理进行了简短的技术概述,值得一读。

为了实现安全执行,必须定义 TrustZone 和非 TrustZone 代码之间的边界。这是通过定义两个“世界”来实现的——“安全世界”(TrustZone) 和“正常世界”(在我们的例子中是 Android)。

如您所知,在“正常世界”中,在“用户模式”下运行的代码和在“主管模式”(内核模式)下运行的代码之间存在安全边界。

不同模式之间的区别由当前程序状态寄存器 (CPSR) 管理:
在这里插入图片描述

五个模式位(上图中用“M”标记)控制当前的执行模式。对于 Linux 内核,用户模式 ​​(b10000) 用于常规用户代码,而管理员模式 (b10011) 用于内核代码。

然而,这里缺少一些东西——没有任何信息来表明当前活跃的“世界”是什么。这是因为有一个单独的寄存器用于此目的 - 安全配置寄存器 (SCR)

在这里插入图片描述

该寄存器是一个协处理器寄存器,位于 CP15 c1 中,这意味着它可以使用 MRC/MCR 操作码进行访问。

与CPSR寄存器一样,“正常世界”无法直接修改SCR寄存器。但是,它可以执行 SMC 操作码,这相当于常规管理程序模式调用的 SWI。 SMC 是 Supervisor Mode Call 的缩写,是可用于直接向 TrustZone 内核发出请求的操作码。

另外,应该注意的是,SMC 操作码只能从管理程序上下文中调用(内核模式),这意味着常规用户代码无法使用 SMC 操作码。

为了实际调用 TrustZone 相关功能,管理程序代码(在我们的例子中为 Linux 内核)必须注册某种服务,该服务可用于在需要时调用相关的 SMC 调用。

对于高通来说,这是通过名为“qseecom”的设备驱动程序来实现的——“qseecom”是高通安全执行环境通信的缩写。我们将在后面的博客文章中详细讨论该驱动程序,所以请耐心等待。

把它们放在一起

因此,前面的路还很长——为了在没有权限的情况下从用户模式 ​​Android 应用程序执行 TrustZone 代码,我们需要以下权限提升漏洞:

  • 从没有权限的 Android 应用程序升级到特权 Android 用户。
  • 从特权 Android 用户升级到 Linux 内核中的代码执行。
  • 从 Linux 内核升级到 TrustZone 内核中的代码执行。

因此,如果您对此感兴趣,请继续阅读!

在下一篇博文中,我将介绍有关 Qualcomm TrustZone 实现以及我在其内核中发现和利用的漏洞的更多详细信息。

这篇关于tee漏洞学习-翻译-1:从任何上下文中获取 TrustZone 内核中的任意代码执行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643475

相关文章

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加