【Android安全】Google Hardware-backed Keystore | SafetyNet | 远程证明Remote Attestation

news2024/9/24 17:15:16

Google Hardware-backed KeyStore Attestation 原理及流程

SafetyNet Hardware-backed Attestation

SafetyNet Hardware-backed Attestation:使用了Hardware-backed Keystore

SafetyNet 支持Software Attestation 和 Hardware-backed Attestation,根据设备是否支持Hardware Security Module (HSM)而定。
不同种类的Attestation,会导致Attestation Response的"evaluationType"字段值有所不同。
如果未进行Hardware-backed Attestation,或者Hardware-backed Attestation失败,则"ctsProfileMatch"值为false。

Hardware Security Module,包括ARM TrustZone、security co-processor like Google’s Titan M等。

对Google手机(例如Pixel)而言,Hardware-backed Attestation,基于Google Hardware-backed KeyStore实现。下面介绍其过程。

ro.boot.verifiedbootstate与Android Verified Boot

ro.boot.verifiedbootstate 代表着BootLoader的解锁状态。对于支持HSM(例如TEE)的手机而言,该值通常存储在HSM中。

以Pixel手机为例,相关的BootLoader验证过程是:
Pixel 在 TEE 中存储BootLoader状态(ro.boot.verifiedbootstate参数)。
当手机开机启动时,BootLoader会去加载Boot.img,如下图所示:
在这里插入图片描述

在加载Boot.img之前,BootLoader会去TEE中查询ro.boot.verifiedbootstate的值。

  • 如果值为locked,则BootLoader会继续执行 Android Verified Boot,检查Boot.img的签名,并拒绝加载非官签的Boot.img
  • 如果值为unlocked,则BootLoader将停止执行 Android Verified Boot,此时非官签的Boot.img也可以被加载

题外话:
常用的卡刷Root框架 Magisk,就是对Boot.img的patch。
patched Boot.img的签名自然是非官方的,所以能刷入patched Boot.img的前提是,设备的BootLoader已解锁。
详细原理参见:https://blog.csdn.net/qq_39441603?spm=1000.2115.3001.5343

关于Android Verified Boot,参考:
https://android.googlesource.com/platform/external/avb/+/master/README.md

SafetyNet对Hardware-backed Keystore的使用

从Keystore获取证书链

SafetyNet框架中的DroidGuard VM会从Google Server接收到一段bytecode,并执行这段bytecode。

这段bytecode的执行过程,会查询到一些系统属性。后续,这些属性会被发送给Google Server,用以判定设备完整性。

系统属性中包含一个证书链,该证书链是由Hardware-backed Keystore返回的。

如果想获取该证书链,可以调用getCertificateChain()。
例如:

Certificate certificates[] = keyStore.getCertificateChain(alias);

方法的文档:
https://developer.android.com/reference/java/security/KeyStore#getCertificateChain(java.lang.String)

Google security-key-attestation官方文档:
https://developer.android.com/training/articles/security-key-attestation#verifying

下面介绍:该证书链如何生成、该证书链是什么、该证书链有什么用

该证书链的内容及生成过程

本质上:该证书链相当于合法TEE签名过的ro.boot.verifiedbootstate等值,表明这些值是认证过的,是未被篡改的。
该合法TEE的私钥对应的公钥是Google备案过的。

该证书链的生成过程如下:
(1)Google相当于Root CA,手机生产商OEM相当于中间CA,TEE相当于叶CA

(2)TEE是在Google备案的:
Google用Google私钥签名Google公钥,形成自签名的根证书1;
Google用Google私钥签名OEM公钥,形成证书2;
OEM用OEM私钥签名TEE公钥,形成证书3;

(3)当DroidGuard请求证书链时,TEE生成一张证书4,证书4的Extensions 中包含ro.boot.verifiedbootstate等值。
而后,TEE用TEE私钥签名此证书4。

(4)TEE返回一个证书链,包括:

  • 证书4(内容Extensions 包含verifiedbootstate,TEE私钥签名)
  • 证书3(内容为TEE公钥,OEM私钥签名)
  • 证书2(内容为OEM公钥,Google私钥签名)
  • 证书1(内容为Google公钥,Google私钥签名)

需要注意的是:对证书的签名,是对整个证书文件的签名(包括元数据和公钥),而不只是对证书中公钥的签名。所以证书的元数据中的Extensions也在被签名的范畴,因此Extensions中的内容也被认证了。

该证书链的验证过程

应在服务器端进行,下面说明其在成功情况下的过程。

(1)获取Google根证书列表
https://developer.android.com/training/articles/security-key-attestation#root_certificate

(2)验证证书1在上述列表中
验证证书2的签名和证书1中的公钥对得上
验证证书3的签名和证书2中的公钥对得上
验证证书4的签名和证书3中的公钥对得上
由此可说明证书4的文件内容非伪造

(3)提取证书4中的Extensions,检查其中的ro.boot.verifiedbootstate等值,据此判断设备的状态(例如bootloader是否解锁、是否rooted等),给出"basicIntegrity"、"ctsProfileMatch"的结论

官方给出的验证步骤

Google官方文档:https://developer.android.com/training/articles/security-key-attestation#verifying

(1)Use a KeyStore object’s getCertificateChain() method to get a reference to the chain of X.509 certificates associated with the hardware-backed keystore.
客户端使用KeyStore对象的getCertificateChain()方法拿到证书链(和hardware-backed keystore相关联)

(2)Check each certificate’s validity using an X509Certificate object’s checkValidity() method. Also verify that the root certificate is trustworthy.
验证每一个证书的有效性

(3)On a separate server that you trust, obtain a reference to the ASN.1 parser library that is most appropriate for your toolset. Use this parser to extract the attestation certificate extension data, which appears within the first element of the certificate chain.
提取证书的extension data

(4)Compare the extension data that you’ve retrieved from your ASN.1 parser with the set of values that you expect the hardware-backed key to contain.
将提取出来的extension data和expected values进行比较
(也就是检查extension data中的verifiedbootstate等值)

(3)和(4)应该在服务端进行
服务端实现示例:https://github.com/google/android-key-attestation/tree/master/server

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、Web应用开发模式

web应用开发模式 web应用的开发主要有两种模式: 前后端不分离前后端分离 前后端不分离 在互联网早期,web应用开发采用前后端不分离的方式。 它是以后端直接渲染模板完成响应的一种开发模式。 以前后端不分离的方式开发的web应用的架构图如下&#x…

每天15分钟JMeter进阶篇(1):JAVA 取样器的基本使用

每天15分钟JMeter进阶篇(1):JAVA 取样器的基本使用前言准备工作创建开发工程POM文件创建根工程创建module开发JAVA取样器构建、部署运行构建JAR包部署和运行写在最后前言 JMETER官方提供了丰富的取样器,可以支持80%的常见测试场景…

传输层协议:UDP协议

简介 用户数据报协议(英语:User Datagram Protocol,缩写:UDP;又称用户数据包协议)是一个简单的面向数据包的通信协议,位于OSI模型的传输层。该协议由David P. Reed在1980年设计且在RFC 768中被…

CrimeFragment的UI fragment进行管理

用户界面将由一个名为CrimeFragment的UI fragment进行管理。CrimeFragment的 实例将通过一个名为CrimeActivity的activity来托管。CrimeActivity视图由FrameLayout组件组成,FrameLayout组件为CrimeFragment要显示 的视图安排了存放位置。 CrimeFragment 的视图由一个…

Thinkphp QVD-2022-46174 多语言rce

文章目录漏洞介绍vulhub漏洞搭建漏洞利用利用一:写入文件利用二:文件包含漏洞分析参考文章漏洞介绍 Thinkphp,v6.0.1~v6.0.13,v5.0.x,v5.1.x 如果 Thinkphp 程序开启了多语言功能,那就可以通过 get、head…

[从零开始]用python制作识图翻译器·三

AlsoEasy-RecognitionTranslator具体实现开发环境准备和验证下载conda创建开发环境文字识别模块在线模块离线模块机器翻译模块在线模块离线模块GUIGUI-定位模块GUI-截图模块具体实现 开发环境准备和验证 前期测试项目文件已上传到我的仓库。 下载conda conda是python的版本管…

Day863.协程 -Java 并发编程实战

协程 Hi,我是阿昌,今天学习记录的是关于协程的内容。 Java 语言里解决并发问题靠的是多线程,但线程是个重量级的对象,不能频繁创建、销毁,而且线程切换的成本也很高,为了解决这些问题,Java SD…

C++设计模式(4)——策略模式

策略模式 亦称: Strategy 意图 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 问题 一天, 你打算为游客们创建一款导游程序。 该程序的核心…

什么是CNCF云原生

一、CNCF简介 CNCF:全称Cloud Native Computing Foundation(云原生计算基金会),成立于2015年12月11日,是一个开源软件基金会,它致力于云原生(Cloud Native)技术的普及和可持续发展。…

golang 错误处理channel+error真的香

官方推荐golang中错误处理当做值处理, 既然是值那就可以在channel中传输,本文带你看看golang中channelerror来做异步错误处理有多香,看完本文还会觉得golang的错误处理相比java try catch一点优势都没有吗? 场景 如下&#xff0…

LeetCode刷题笔记 - JavaScript(二)

文章目录1.剑指 Offer 60. n个骰子的点数2.面试题67. 把字符串转换成整数3.面试题59 - II. 队列的最大值剑指 Offer 60. n个骰子的点数 面试题67. 把字符串转换成整数 面试题59 - II. 队列的最大值 1.剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上,所有骰子朝上一…

Java运行机制

java的运行机制 Java程序的运行机制分为编写、编译和运行三个步骤。 1.编写 编写是指在Java开发环境中进行程序代码的编辑,最终生成后缀名为“.java”的Java源文件。 2.编译 编译是指使用Java编译器对源文件进行错误排查的过程,编译后将生成后缀名为…

一篇文章带你熟悉Ajax

文章目录一、AJAX 简介二、创建 AJAX 的基本步骤1. 创建 XMLHttpRequest 对象2.向服务器发送请求3.服务器响应状态一、AJAX 简介 ☀️AJAX 的英文全称为 Asynchronous JavaScript And XML,Asynchronous 是异步的意思。何为异步呢?在这里异步是指通过 AJA…

IT运维服务体系的总体架构是什么?

大家好,我是技福的小咖老师。 今天我们来简单介绍一下IT运维服务体系的总体架构。 运维服务体系由运维服务制度、运维服务流程、运维服务组织、运维服务队伍、运维技术服务平台以及运行维护对象六部分组成,涉及制度、人、技术、对象四类因素。制度是规…

每日一题-力扣(leetcode)2368. 受限条件下可到达节点的数目

题目描述 现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - 1 条边。 给你一个二维整数数组 edges ,长度为 n - 1 ,其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restr…

激光雷达对植被冠层结构和SIF同时探测展望

前言陆表植被在全球碳循环中起着不可替代的作用。但现阶段,人们对气候变化与植被生态理化功能的关系的研究还不够完善。为了提高气候预测以及缓解气候恶化的速率,对植被参数比如:叶面积指数(leaf)、植被冠层结构&#…

JavaScript JSON序列化和反序列化

文章目录JavaScript JSON序列化和反序列化概述JSON序列化JSON.stringify()仅一个参数使用使用2个参数使用3个参数其他自定义toJson序列化顺序反序列化JSON.parse()仅一个参数使用使用2个参数eval()JavaScript JSON序列化和反序列化 概述 JSON数据在网络传输时存在两种类型&am…

【虹科云展厅】虹科赋能汽车智能化云展厅专题回顾

虹科赋能汽车智能化云展厅 聚焦前沿技术,【虹科赋能汽车智能化云展厅】正式上线,本次云展厅围绕“汽车以太网/TSN、汽车总线、智能网联、电子测试与验证、自动驾驶”等核心话题,为您带来如临展会现场般的讲演与介绍,更有技术工程…

PromQL之选择器和运算符

平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符 PromQL 匹配器 相等匹配器() 选择与提供的字符串完全相同的数据 例:筛选出id“G1 Eden Space” 的数据 jvm_memory_used_bytes{id"G1 Eden Space"}…

Elasticsearch高级查询—— 匹配查询文档

目录一、初始化文档数据二、匹配查询文档示例2.1、概述2.2、示例一、初始化文档数据 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/1,请求体内容为: {"name":"张三","age&…