我的NPI项目之Android 安全系列 -- Keymaster到底是个什么

最近因为一直在调研独立secure element集成的工作,不巧的是目前使用的高通平台只有NFC-eSE的方案。高通目前也并不支持独立的eSE集成,codebase中并无相对应的代码。举个例子,目前使用的STM的一款eSE,但是这款eSE的开发STM还没有完成(搞不清楚,为什么就可以被选来用于项目),STM需要将code release给到高通进行validation的操作,高通集成进codebase之后,才能使可用状态,我理解这个也是进Qualcomm PVL的基本方法。

说一下Keymaster,之前的项目上是有过Keymaster相关经验的。Qualcomm SDM660的平台(至少是Android6 launch)基于这个平台,我们在Android N上launch了一个产品,产品为Gpc60,当时对应的keymaster1.0。通过观察,ota包解压后,里面有个两个镜像文件,keymaster.img

这里插一个Google version binding的项目:https://source.android.com/docs/security/features/keystore/version-binding?hl=zh-cn

通过绑定的系统版本和安全补丁信息,阻止针对攻击的系统回滚!详细的后面继续深度研究一下 。 

将OTA包解压后,内容如下:

这里最大的内容是,payload.bin文件,其它部分后面再看。通过,payload_dumper工具能够将payload.bin 的内容导出:

可以看到里面的keymaster.img,update engine能够通过分区表中的分区名称查找镜像文件,并用来更新分区。分区表的内容通常和Emergency download的tool中对应的xml分区表是一致的。通常,分区表中内容是由Qualcomm进行定义的,codebase中自带。

那好,这里留一个疑问,keymaster.img和androd.hardware.keymaster@1.0-service的关系是什么?

为弄清楚上面这个问题,继续理解Qualcomm Android Security中的keymaster相关的技术。有幸经历了三个高通平台和Android6~Android14的8个Android的OS的开发过程。就先从Android6的keymaster1开始。在Android6(M)中,我们可以看到,要支持keymaster,

首先要物理分区表进行配置,早期都是使用的emmc作为存储。配置如下:

<partition label="keymaster" size_in_kb="256" type="4F772165-0F3C-4BA3- BBCB-A829E9C969F9" bootable="false" readonly="false" filename="keymaster.mbn" />
 

这里还涉及tz和metadata的内容,tz的具体内容暂时先不看,主要看下metadata。分区表中,有单独的metadata的分区配置,但是目前也不是很清楚具体的作用,暂时按下不表。但是,可以了解一下vbmeta。

vbmeta 是Android 8.0 以后引入的一个机制,用于保证系统启动过程的完整性和安全性。 vbmeta 是一个包含数字签名的元数据文件,其中记录了系统启动过程中需要校验的boot、recovery、system 和vendor 分区的完整性信息,以及用于校验这些分区完整性的公钥。在分区表中通常由如下的分区设定:

<partition label="vbmeta_a" size_in_kb="64" type="4b7a15d6-322c-42ac-8110-88b7da0c5d77" bootable="false" readonly="true" filename="vbmeta.img"/>

<partition label="vbmeta_b" size_in_kb="64" type="77036CD4-03D5-42BB-8ED1-37E5A88BAA34" bootable="false" readonly="true" filename=""/>  //没有文件名称?

<partition label="vbmeta_system_a" size_in_kb="64" type="1344859D-3A6A-4C14-A316-9E696B3A5400" bootable="false" readonly="true" filename="vbmeta_system.img"/>

<partition label="vbmeta_system_b" size_in_kb="64" type="FE3AB853-5B66-4D4A-BF85-8D90AF1C2C4A" bootable="false" readonly="true" filename=""/> //没有文件名称?

看下verify boot是什么概念:先看看Google的相关概念,简单的流程图如下:

简单的说就是签名和验签的过程, 确保用本公司自己的签名工具签过的image来启动机器。签名的过程就是获取分区的摘要(摘要通常就是一个数据块的hash值),使用私钥对摘要进行加密,并将加密文件和分区文件打包并刷到机器的磁盘中,例如mmc或者ufs中。

这里涉及到一个问题,这里的signature是存储在哪个位置?通过相关文档,发现是存在了vbmeta.img中了;

验证(verify)的过程就比较简单了,同样对分区取摘要为摘要A,对签名进行解密得到之前签名时的分区镜像文件的摘要为摘要B,对A/B进行比较,如果摘要一直,那么验签成功。针对Android的Verified boot后面要重点讲一下。

这里继续keymaster的故事,看一下一些名称需要理解和记忆:

AndroidKeystore 是供应用访问 Keystore 功能的 Android Framework API 和组件。它是作为标准 Java Cryptography Architecture API 的扩展程序实现的,包含在应用自己的进程空间中运行的 Java 代码AndroidKeystore 通过将与密钥库行为有关的应用请求转发到密钥库守护程序执行这些请求。//最好自己写一下测试app进行调试看看

密钥库守护程序是 Android 系统中的一个守护程序,该程序通过 Binder API 提供对所有密钥库功能的访问权限(java的后端,AIDL)。密钥库守护程序负责存储“密钥 blob”。密钥 blob 中包含已加密的实际密钥材料,因此密钥库可以存储这些材料,但无法使用或显示这些材料。(比如说?)

keymasterd 是一个 HIDL 服务器,可提供对 Keymaster TA 的访问权限。(此名称未进行标准化,仅用于说明概念。)(keymaster@1.0-service.rc/ keymaster@4.0-service.rc/keymaster@3.0-service). e.g :keymaster@3.0-service, 这个便是keymasterd的一个实例。

Keymaster TA(可信应用)是在安全环境(大多数情况为 ARM SoC 上的 TrustZone)中运行的软件。它可提供所有安全的密钥库操作,能够访问原始密钥材料,在密钥上验证所有访问权限控制条件,等等。(ps操作命令可以能访问到吗?肯定是不能够的,因为运行在TEE中);

LockSettingsService 是负责用户身份验证(包括密码和指纹)的 Android 系统组件。它不是密钥库的一部分却与其相关,因为很多密钥库密钥操作都需要对用户进行身份验证。LockSettingsService 与 Gatekeeper TA 和 Fingerprint TA 进行交互以获取身份验证令牌,并将其提供给密钥库守护程序,这些令牌最终将由 Keymaster TA 应用使用。

Gatekeeper TA(可信应用)是在安全环境中运行的另一个组件,它负责验证用户密码并生成身份验证令牌(用于向 Keymaster TA 证明已在特定时间点完成对特定用户的身份验证)。

Fingerprint TA(可信应用)是在安全环境中运行的另一个组件,它负责验证用户指纹并生成身份验证令牌(用于向 Keymaster TA 证明已在特定时间点完成对特定用户的身份验证)

继续回到上面的问题:keymaster.img和androd.hardware.keymaster@1.0-service的关系是什么?手边刚好有Android12 的代码作为O设备的launch的设备MR。 对应的service是android.hardware.keymaster@3.0-service。对应的partition.xml内容如下:

那就要看看keymaster64.mbn的编译脚本,就可以知道keymaster64.mbn的内容。但开始可以确认的是,android.hardware.keymaster@3.0-service 是属于vendor分区的一部分,会被打包到vendor.img中。有点意思,keymaster64.mdn的内容到底是啥?(引导加载密钥?)

从高通得知,这个是高通平台封装的TA,是通过编译脚本打包进ROM包中。有一个问题是,那么TEE的整个运行环境是如何更新的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/269493.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数&#xff1a;获取参数值的字节个数concat(str1,str2,...)函数&#xff1a;字符串拼接upper(str)、lower(str)函数:大小…

java 商机管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 商机管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

【数据结构】用队列实现栈

下面是一些思路分析和代码分享&#xff0c;有需要借鉴即可。 1.问题描述 我想用队列来实现栈的功能&#xff0c;具体而言是用两个队列做底层做出栈的功能来。 有人可能会疑问会不会多次一举&#xff0c;这里仅作练习&#xff0c;为了更加进一步了解栈/队列的性质 2.思路分析 …

Android logcat系统

一 .logcat命令介绍 android log系统: logcat介绍 : logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息. 二.C/Clogcat访问接口 Android系统中的C/C日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别&#xff1a; /…

递归学习资料

思路 例题 package 递归;public class 反向打印字符串 {public static void main(String[] args) {f("ABC",0);}static void f(String str,int n){if (nstr.length()){return;}f(str,n1);System.out.println(str.charAt(n)"");} }多路递归 递归优化 -剪枝…

数据库系统概论(超详解!!!) 第二节 数据模型

1.数据模型分为两类&#xff08;两个不同的层次&#xff09; &#xff08;1&#xff09; 概念模型 &#xff0c;也称信息模型&#xff0c;它是按用户的观点来对数据和信息建模&#xff0c;用于数据库设计。 &#xff08;2&#xff09; 逻辑模型 &#xff0c;逻辑模型主要包括…

异地组网搭建方案

在这个信息爆炸的时代&#xff0c;人与人之间的联系变得越来越密切&#xff0c;而异地组网搭建方案也因此变得越 来越重要。无论是跨国企业、远程学习还是国际合作&#xff0c;构建一个快捷稳定的异地组网系统&#xff0c;已经 成为许多组织和个人不可或缺的需求。接下来&#…

运维随录实战(2)之k8s部署应用

一, 创建.gitlab-ci.yml文件 架构流程 文件内容 stages: #设置流水线模版- build # 编译- source2img- deploy # 发布variables: # 设置全局变量MAVEN_PATH: .m2MAVEM_IMAGE: maven:3.8.5-openjdk-17-slim # maven 打包使用的镜像MAVEN_CLI_OPTS: "-s $MAVEN_PATH/set…

R语言安装和简单入门HelloWorld用法

R语言安装和简单入门HelloWorld用法 #R语言安装地址 https://www.r-project.org/ click->CRAN mirror->选择China下列表&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/CRAN/ 选择Download R for Windows 选择base Download R-4.3.2 for Windows 下载文件R-4.3.2-…

身份证识别系统(安卓)

设计内容与要求&#xff1a; 通过手机摄像头捕获身份证信息&#xff0c;将身份证上的姓名、性别、出生年月、身份证号码保存在数据库中。1&#xff09;所开发Apps软件至少需由3-5个以上功能性界面组成。要求&#xff1a;界面美观整洁、方便应用&#xff1b;可以使用Android原生…

【Unity】使用Unity实现双屏显示

引言 在使用Unity的时候&#xff0c;有时候会需要使用双屏显示 简单来说就是需要在两个显示器中显示游戏画面 双屏显示注意点&#xff1a; ①双屏显示需要电脑有两个显示 ②双屏显示只能用于PC端 ③不仅仅可以双屏&#xff0c;Unity最大支持8屏显示 1.相机设置 ①我们打开Un…

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机(完整图文详细步骤教程)

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机&#xff08;完整图文详细步骤教程&#xff09; 一、PcDos20001.PcDos2000简介2.PcDos2000下载 二、创建PcDos2000虚拟机1.新建虚拟机2.类型配置3.类型配置4.选择版本5.命名、存位置6.磁盘容量7.调整虚拟配置7.1 调整虚拟配…

【python】堆排序

堆的概念 堆&#xff1a;一种特殊完全二叉树&#xff0c;也就是二叉树必须全部是满的&#xff0c;但是最后一排可以从右向左缺失。 大根堆&#xff1a;每个节点都比他的子节点大 小根堆&#xff1a;每个节点都比子节点小 堆在代码中的形式 堆在代码中实际上就是列表&#…

蓝桥杯倒计时 41天 - KMP 算法

KMP算法 KMP算法是一种字符串匹配算法&#xff0c;用于匹配模式串P在文本串S中出现的所有位置。 例如S“ababac&#xff0c;P“aba”&#xff0c;那么出现的所有位置是13。 在初学KMP时&#xff0c;我们只需要记住和学会使用模板即可&#xff0c;对其原理只需简单理解&#xff…

一文搞懂Stable Diffusion中的提示词

欢迎来到Stable Diffusion的世界&#xff0c;这里是AI和创意的交汇点。在这里&#xff0c;我们将一起探索如何通过精心设计的提示词&#xff0c;指引这一强大的AI工具创造出令人叹为观止的图像。无论你是技术爱好者&#xff0c;还是对AI艺术充满好奇的初学者&#xff0c;这里都…

excel数值无法左对齐

右键&#xff0c;单元格格式 修改为常规 解决

力扣--动态规划64.最小路径和

思路分析&#xff1a; 基本思路&#xff1a; 本算法采用动态规划的思想&#xff0c;通过构建一个额外的二维矢量 dp 来存储每个位置的最小路径和。最终目标是求得右下角位置的最小路径和&#xff0c;即整个网格的最小路径和。 初始化&#xff1a; 初始化矢量的行数和列数&…

【AI视野·今日Sound 声学论文速览 第五十一期】Mon, 4 Mar 2024

AI视野今日CS.Sound 声学论文速览 Mon, 4 Mar 2024 Totally 6 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers VoxGenesis: Unsupervised Discovery of Latent Speaker Manifold for Speech Synthesis Authors Weiwei Lin, Chenhang He, Man Wai Mak, …

Stable Diffusion——Animate Diff一键AI图像转视频

前言 AnimateDiff 是一个实用框架&#xff0c;可以对文本生成图像模型进行动画处理&#xff0c;无需进行特定模型调整&#xff0c;即可为大多数现有的个性化文本转图像模型提供动画化能力。而Animatediff 已更新至 2.0 版本和3.0两个版本&#xff0c;相较于 1.0 版本&#xff…

【学位论文】上海交通大学 研究生学位论文 本地保存

上海交大研究生学位论文网&#xff1a;http://thesis.lib.sjtu.edu.cn/ &#xff08;只能校内访问或SJTU VPN访问&#xff09; 如果希望下载论文&#xff0c;需要参考&#xff1a;https://github.com/olixu/SJTU_Thesis_Crawler 安装过程 安装过程的几个坑&#xff1a; &a…