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服务获取Pod当前IP的两种方案

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

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

通过cmd获取网卡速率的代码

《通过cmd获取网卡速率的代码》今天从群里看到通过bat获取网卡速率两段代码,感觉还不错,学习bat的朋友可以参考一下... 1、本机有线网卡支持的最高速度:%v%@echo off & setlocal enabledelayedexpansionecho 代码开始echo 65001编码获取: >

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc