Android——Keymaster安全检测

2023-05-16

Keymaster

概述

   工作以来,一直在负责Android系统安全漏洞的跟踪以及修复。最近在处理Android O以上机器的时候遇到了一个坑。当你的升级系统时,如果后一个系统中修改了如:系统版本、系统安全补丁日期等重要信息,系统在未双清升级后,就会处于锁定状态,如下图所示。

密码锁定

   遇到这个问题,解决方式只有一个,就是进入recovery双清数据,即可解决。

   对于用户来说,他们只需了解该问题如何解决,而对于我们需要了解的是,为什么在Android O以后的机器会出现这种锁检测,搜索了下度娘以及Google,有很多人都遇到这个问题,也有不少人给出了解释,但是好像都没讲到重点,抽空,上谷歌官方看了下相关的文档,总结下这个问题。

Keymaster检测

   Android系统如今已经成为全球首屈一指的移动操作系统,拥有庞大的用户量。正式因为如此,谷歌为用户搭建了一个安全的系统架构,使得用户使用Android系统时能够保证其安全性。具体做了哪些安全措施,这里不在赘述,有兴趣的读者可以参阅
谷歌官方安全文档。

Keymaster的发展

   谷歌在Android中,做了很多密钥认证的行为,具体可看密钥认证。

   Android在6.0之前版本已有一个非常简单的由硬件支持的加密服务API(由0.2和0.3版的Keymaster硬件抽象层(HAL)提供)。

   Android6.0中,Keystore不仅增加了对称加密基元(AES和HMAC),还增加了针对由硬件支持的密钥的访问控制系统。

  1. 一个使用控制方案,用于限制密钥的使用,并降低因滥用密钥而损害安全性的风险
  2. 一个访问控制方案,用于限定只有指定的用户和客户端能够使用相应密钥,并且只能在规定的时间范围内使用

   Android7.0中,Keymaster2增加了对密钥认证和版本绑定的支持。

   Android8.0中,Keymaster3从旧式C结构硬件抽象层(HAL)转换到了从采用新的硬件接口定义语言(HIDL)的定义生成的C++HAL接口。

   而在最新的Android 9.0 中,更新包括:

  • 更新到 Keymaster 4
  • 对嵌入式安全元件的支持
  • 对安全密钥导入的支持
  • 对 3DES 加密的支持
  • 更改了版本绑定,以便 boot.img 和 system.img 分别设置版本以允许独立更新

Keymaster架构

   Android Keystore API和底层Keymaster HAL提供了一套基本的但足以满足需求的加密基元,以便使用访问受控且由硬件支持的密钥实现相关协议。

   Keymaster HAL是由原始设备制造商(OEM)提供的动态加载库,Keystore服务使用它来提供由硬件支持的加密服务。为了确保安全性,HAL实现不会在用户空间(甚至是内核空间)中执行任何敏感操作。敏感操作会被分配给通过某个内核接口连接的安全处理器。 最终的架构如下所示:

架构

检测原理

   简单的说,每个系统版本都有对应的Keymaster密钥,绑定到系统的版本和补丁程序级别,一旦我们更新了内容,它所对应的密钥也会更新,这样可确保在旧版系统或TEE软件中发现漏洞的攻击者无法将设备回滚到含有漏洞的版本,也无法使用在较新版本中创建的密钥。此外,在已经升级到更新的版本或补丁程序级别的设备上使用指定版本和补丁程序级别的密钥时,需要先升级该密钥才能使用,因为该密钥的旧版本已失效。如果强制使用,系统在检测时候就会因为该密钥的旧版本失效弹出那个密码框。

   想深入研究原理的话,可以在O平台上查看以下几个代码文件的逻辑。

  • system/keymaster/android_keymaster/android_keymaster.cpp
  • hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp
  • frameworks/base/core/java/android/security/keymaster/OperationResult.java

Keymaster源码相关函数

   谷歌官方给出了相关函数的地址,这里不在赘述,请查阅Keymaster

加密解决方法

普通用户

   也没什么办法了,进入recovery双清吧,数据这时候没手机重要了。

开发者

  1. 在系统升级时,检测系统重要信息,如安全补丁日期,系统版本号等,如果信息有修改,就需要提醒用户双清升级。
  2. 修改keymaster逻辑,去掉检测逻辑或者更新密钥。
//Android O中相关文件以及代码
//system/keymaster/android_keymaster/android_keymaster.cpp
//hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp
//frameworks/base/core/java/android/security/keymaster/OperationResult.java

keymaster_error_t CheckVersionInfo(const AuthorizationSet& tee_enforced,
                                   const AuthorizationSet& sw_enforced,
                                   const KeymasterContext& context) {
    uint32_t os_version;
    uint32_t os_patchlevel;
    context.GetSystemVersion(&os_version, &os_patchlevel);

    uint32_t key_os_patchlevel;
    if (tee_enforced.GetTagValue(TAG_OS_PATCHLEVEL, &key_os_patchlevel) ||
        sw_enforced.GetTagValue(TAG_OS_PATCHLEVEL, &key_os_patchlevel)) {
        if (key_os_patchlevel < os_patchlevel)
            return KM_ERROR_KEY_REQUIRES_UPGRADE;
        else if (key_os_patchlevel > os_patchlevel)
            return KM_ERROR_INVALID_KEY_BLOB;
    }

    return KM_ERROR_OK;
}

Return<void> KeymasterDevice::update(uint64_t operationHandle,
                                     const hidl_vec<KeyParameter>& inParams,
                                     const hidl_vec<uint8_t>& input, update_cb _hidl_cb) {
    // result variables for the wire
    uint32_t resultConsumed = 0;
    hidl_vec<KeyParameter> resultParams;
    hidl_vec<uint8_t> resultBlob;

    // result variables the backend understands
    size_t consumed = 0;
    keymaster_key_param_set_t out_params{nullptr, 0};
    keymaster_blob_t out_blob{nullptr, 0};

    auto kmInParams = hidlParams2KmParamSet(inParams);
    auto kmInput = hidlVec2KmBlob(input);

    auto rc = keymaster_device_->update(keymaster_device_, operationHandle, &kmInParams, &kmInput,
                                        &consumed, &out_params, &out_blob);

    if (rc == KM_ERROR_OK) {
        resultConsumed = consumed;
        resultParams = kmParamSet2Hidl(out_params);
        resultBlob = kmBlob2hidlVec(out_blob);
    }

    _hidl_cb(legacy_enum_conversion(rc), resultConsumed, resultParams, resultBlob);

    keymaster_free_param_set(&out_params);
    if (out_blob.data) free(const_cast<uint8_t*>(out_blob.data));

    return Void();
}



   第一种方式,是从应用层方面去处理该问题的,相对于来说灵活、简单,不会影响系统问题;而第二种方式则是要违背谷歌的规定,在系统中做一些小聪明,而这是谷歌这些年来不倡导的,谷歌推出的一系列诸如CTS、GTS、STS等认证检测,就是反制产商们对系统乱定制影响系统安全性,所以谨慎点好。

参考文献

谷歌Source

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android——Keymaster安全检测 的相关文章

随机推荐

  • React Native 中布局入门

    我在做布局的时候 xff0c 大部分时间看这个例子就够了 xff0c 分享给大家 Properties To choose the right layout for a component 39 s children we must mak
  • clover黑苹果正常安装,安装完后找不到Mac OS启动图标的解决办法

    身边有小伙伴没有苹果电脑 xff0c 但是又想体验Mac os 帮几个朋友安装过黑苹果 其中遇到两次 xff0c 系统安装正常 xff0c 能正常进桌面 xff0c 重启以后就找不到启动图标了 一开始不知道什么原因 xff0c 百度搜也没搜
  • Windows2000系统下载安装,怀念一下

    今天突然心血来潮 xff0c 想怀念一个windows2000 操作系统 好像是我接触的第一个操作系统了 xff0c 当年为了研究windows 2000系统的安装方法 xff0c 看了好多书 不对 xff0c 貌似之前也用过windows
  • React 使用Ant Design组件2020年11月

    今天同事问我一个问题 xff0c 说他搭的ant项目样式错乱 我去看了一下 xff0c 愣是看了半天没发现问题原因 最终后来才发现是Ant Design组件配置的问题 我不得不在这里吐槽一下And Design这篇文档https mobil
  • Windows XP 下载与安装-怀念过去

    前段时间刚安装了windows 2000系统 xff0c 今天想安装一下windows xp怀念一下 其实windows xp时代安装操作系统大部分都是使用ghost安装的 xff0c 那时候的番茄花园 xff0c 电脑公司 xff0c 深
  • 免费的在线版photoshop网站推荐

    我是一个普通的开发者 xff0c 不是专业的photoshop使用者 偶尔能用到photoshop xff0c 但是频率比较低 简单的修图改改尺寸之类的 电脑的存储空间老是提醒不够用 xff0c 想卸载又不能卸载 关键是有些同事懒自己电脑上
  • 盘点MAC下用过的五笔输入法

    五笔输入法现在越来越小众了 xff0c 开发者们更新也相对比效慢 xff08 对比拼音输入 xff09 windows中五笔输入法也用过很多种 xff0c 相对最喜欢的是QQ五笔输入法 xff0c QQ五笔输入法最近几年更新也很少 从win
  • Spring Boot修改最大上传文件限制:The field file exceeds its maximum permitted size of 1048576 bytes.

    SpringBoot做文件上传时出现了The field file exceeds its maximum permitted size of 1048576 bytes 错误 xff0c 显示文件的大小超出了允许的范围 查看了官方文档 x
  • “辶”“廴”偏旁的字五笔拆字

    打了好多年五笔 xff0c 连 字拆字是lpk 如果补码用最后一笔算的话 xff0c 不应是lpi吗 xff1f 正解 五笔输入法有个规定 xff1a 凡是 辶 廴 偏旁的字 xff0c 末笔都取里面部分的最后一笔 这样才会减少重码 如果不
  • React Native开发的应用在android下闪退

    最近遇到个奇怪的问题 xff0c 以前本来正常使用的APP xff08 0 63 2 xff09 xff0c 自从升级到0 63 3并且引用的组件全部升级 在android下经常闪退 但是ios下很正常没有任何问题 各种排除法 xff0c
  • windows 查看文件的MD5值

    有时下载的文件 xff0c 需要检查一下是否正确 certutil hashfile macOS11 0 1 dmg MD5 查一下 xff0c 还是有必要的 有次我下载的系统镜像我没查 xff0c 快安装完了 xff0c 提示文件已损坏
  • (己解决)黑苹果驱动英特尔核显疑问记录

    这是一个求助文章 xff01 求大佬帮忙解惑 xff01 求大佬提供一个4代的Opencore的EFI做下参考 型号 xff1a 联想 xff08 Lenovo xff09 拯救者 14 0英寸游戏本 xff08 i7 4720HQ 8G
  • 2014年的老电脑(Lenovo Gaming)使用OpenCore吃上新苹果(Big Sur)

    型号 xff1a 联想 xff08 Lenovo xff09 拯救者 14 0英寸游戏本 xff08 i7 4720HQ 8G 128G SSD 43 1T GTX960M 原配置如上 后来又加了根内存 xff0c 机械盘换成了ssd 以前
  • OpenCore解决HD4600笔记本电脑hdmi输出

    参考文档 xff1a https blog daliansky net Tutorial Using Hackintool to open the correct pose of the 8th generation core displa
  • 手把手教你安装黑苹果之openCore-0.6.3 EFI制作全过程相关config.plist

    被引用地址 xff1a 手把手教你安装黑苹果之openCore 0 6 3 EFI制作全过程 代码太长了 xff0c 单独开一篇文章保存代码 config plist代码如下 xff1b span class token prolog lt
  • 拯救者14(i7-4720HQ)电池驱动过程记录顺带解决了触控板设置项无法打开的问题

    文章目录 前言电池解决过程ACPI SSDT BAT amlKexts SMCBatteryManager kextconfig plist增加补丁ProperTree效果触控板涉及的文件下载 参考文档 总结 前言 我的型号 xff1a 联
  • 查询 opencore版本信息

    使用 OpenCore Configurator 要注意一点 xff0c 使用的版本要与 OpenCore 版本最好是一致的 所以我们需要知道如何查询当时使用的OpenCore版本信息 方式一 xff1a Hackintool 黑苹果必备工
  • 黑苹果使用小技巧之按键设置

    刚安装完黑苹果的小伙伴 xff0c 可能会遇到类似这样的问题 我怎么复制粘贴没有用啊 xff1f 大家用惯了Windows 的快捷键了 xff0c Ctrl 43 C Ctrl 43 V之类的 到mac 下有点区别 xff0c 基本上是Co
  • QQ群加入代码在线获取

    进入http shang qq com widget group php 页面 xff1a 选择你管理的QQ群 xff0c 必须是群主或这管理才可以 然后把下面的代码复制到你页面上就可以了
  • Android——Keymaster安全检测

    Keymaster 概述 工作以来 xff0c 一直在负责Android系统安全漏洞的跟踪以及修复 最近在处理Android O以上机器的时候遇到了一个坑 当你的升级系统时 xff0c 如果后一个系统中修改了如 xff1a 系统版本 系统安