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获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息