我的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的整个运行环境是如何更新的?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开发知识点-前端-jQuery

jquery $(xxxx) id #<script src"static/js/jquery.min.js?v2.1.4"></script>jQuery对象上面还定义了 Ajax方法&#xff08;$.ajax()&#xff09;&#xff0c;用来处理Ajax操作。调用该方法后&#xff0c;浏览器就会向服务器发出一个HTTP请求。$.ajax…

pytest-教程-14-fixture之yield关键字

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest conftest.py文件的使用方法&#xff0c;本小节我们讲解一下fixture的yield关键字实现teardown后置操作。 当我们运行我们的测试时&#xff0c;我们会希望确保它们自己清理干净&#xf…

冒泡经典题

&#x1f4d1;前言 本文主要是【】——简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#xff1a;狠…

【Redisson分布式锁】Redisson公平锁实现机制

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

python之双端队列deque

普通队列只能进行队尾插入和出队头的操作&#xff0c;双端队列可以对队头和队尾进行操作&#xff0c;而且相比于list实现的队更具有优越性&#xff0c;list实现在删除和插入时的时间复杂度大约为O(n)&#xff0c;而deque的时间复杂度是O(1) 队头操作&#xff1a;append()、pop(…

蓝桥杯练习系统(算法训练)ALGO-986 藏匿的刺客

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 强大的kAc建立了强大的帝国&#xff0c;但人民深受其学霸及23文化的压迫&#xff0c;于是勇敢的鹏决心反抗。   kAc帝国防…

力扣刷题-82.删除排序链表中的重复元素

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&#xff1a; 输入&#xff1a;head [1,1,1,2…

计算机组成原理----数据的表示和运算

一&#xff1a;进位计数制 1、进制 B&#xff1a;二进制&#xff1a;0-1 逢二进一、借一当二 O&#xff1a;八进制&#xff1a;0-7 逢八进一 D&#xff1a;十进制&#xff1a;0-9 逢十进一 H&#xff1a;十六进制&#xff1a;0-9、A-F 逢十六进一 r进制2 2、…

第三百八十四回

【toc] 我们在上一章回中介绍了Visibility组件相关的内容&#xff0c;本章回中将介绍Flutter与原生平台通信相关的内容.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 在移动开发领域以Android和IOS SDK开发出的应用程序叫原生开发&#xff0c;开发同一个程序需要…

回溯算法01-组合(Java)

1.组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]示例 2&#xff1a; 输入&#x…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

社交媒体的未来图景:探索Facebook的数字化之旅

社交媒体已经成为现代社会不可或缺的一部分&#xff0c;其影响力已经深入到人们生活的方方面面。而在众多社交媒体平台中&#xff0c;Facebook无疑是其中的巨头&#xff0c;其数字化之旅更是引领着整个社交媒体行业的发展方向。本文将深入探讨社交媒体的未来图景&#xff0c;以…

事务处理

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 事务处理 事务是保证数据完整性的一种手段。 事务具备 ACID 原则&#xff08;包括原子性、一致性、独立性及持久性&#xff09;&#xff0c;保证一个人更新数据的时候&#xff0c;其他…

C# 中 TryParse 将字符串转换为特定类型的方法

在 C# 中&#xff0c;TryParse 是一个用于将字符串转换为特定类型的方法。它用于尝试解析字符串并将其转换为指定类型的值&#xff0c;而不会引发异常。如果解析成功&#xff0c;它将返回 true 并将解析结果存储在输出参数中&#xff1b;如果解析失败&#xff0c;它将返回 fals…

C# 中 Math.Round 数学函数

在 C# 中&#xff0c;Math.Round 是一个数学函数&#xff0c;用于对一个浮点数进行四舍五入操作。它接受一个浮点数作为输入&#xff0c;并返回一个最接近输入值的整数或指定小数位数的浮点数。 Math.Round 方法有多个重载&#xff0c;其中最常用的重载有以下两种形式&#xf…

就业班 2401--3.5 Linux Day11--DNS解析

DNS域名解析服务 少壮不努力&#xff0c;老大徒伤悲。一、 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;…

「项目实践」如何实现导购推荐“千人千面”

前言 在电商背景下&#xff0c;为用户提供精准的导购推荐不仅能极大提升购物体验&#xff0c;也成为推动业务增长的关键驱动力。随着人工智能和数据科学的快速发展&#xff0c;实现“千人千面”的个性化推荐已不再是无法触及的梦想。如何在众多商品中准确捕捉用户的偏好&#…

进口及国内细胞分析仪厂家名录大全-贝克曼、安捷伦、希森美康、迈瑞.....

流式细胞仪是一种测量层流中细胞的设备&#xff08;细胞仪&#xff09;&#xff0c;其通过将每个细胞排列在鞘液中&#xff0c;加以激光束照射&#xff0c;可测量散射光和荧光&#xff0c;从而获得有关每个细胞的信息&#xff0c;包含细胞结构&#xff08;如大小、粒度、表面积…

Java知识点总结(二)

ID生成策略 主键自增id 主键自动增长&#xff0c;不用手工设值、数字型&#xff0c;占用空间小、检索非常有利、有顺序&#xff0c;不会重复&#xff0c;但在迁移旧数据是会出现id冲突 UUID 基于时间&#xff0c;计数器和地址生成32位的id redis生成id 原子性自增&#xff0c;并…

记录一次排查负载均衡不能创建的排查过程

故障现象&#xff0c;某云上&#xff0c;运维同事在创建负载均衡的时候&#xff0c;发现可以创建资源&#xff0c;但是创建完之后&#xff0c;不显示对应的负载均衡。 创建负载均衡时候&#xff0c;按f12发现console有如下报错 后来请后端网络同事排查日志发现&#xff0c;是后…