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

相关文章

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过