Android Safety 系列专题【篇一:系统签名】

本篇提到的应用签名,其实就是指android系统编译构建过程中,对应用包的签名。

相关的定义和说明Android源代码中的/build/target/product/security/的内容:

如上的官方介绍文档:https://source.android.com/devices/tech/ota/sign_builds.html

  • 其中pk8文件是私钥文件,PKCS#8 DER格式的文件
  • 其中x509.pem文件是证书文件,PEM格式。

1、目的和作用?

  • 为什么要针对apk包进行签名?同google官方网站的描述,如果你更新apk的时候,系统会检测你的apk的签名秘钥是否和系统指定的签名秘钥匹配,如果不匹配,系统将会拒绝安装改应用,这样能够保证被更新的应用是没有掉过包的。
  • 为什么要针对ota包进行签名?同前面提到的apk应用一样,OTA包其实也可以简单的理解为一个大型apk,我们在安装OTA包之前需要对其进行校验(通过RecoverySystem.verifyPackage()),如果签名秘钥对不匹配,讲拒绝OTA升级,同样保证被更新的OTA是没有掉过包的。

2、长什么样子?

每个密钥都包含两个文件:一个是扩展名为 .x509.pem 的证书,另一个是扩展名为 .pk8 的私钥。 私钥需要加以保密,并用于对 apk 包进行签名。 密钥本身也可能受密码保护。相比之下,证书只包含公开的一半密钥,因此可以大范围地分发。证书用于验证某个 apk 包是否由相应的私钥进行签名。

标准 Android build 使用四个密钥,所有这些密钥都位于 build/target/product/security

  • testkey:适用于未另外指定密钥的 apk 包的通用默认密钥。
  • platform:适用于核心平台所包含的 apk 包的测试密钥。
  • shared:适用于家庭/联系人进程中的共享内容的测试密钥。
  • media:适用于媒体/下载系统所包含的 apk 包的测试密钥。
  • networkstack:适用于网络系统所包含的 apk 包的测试密钥

3、如何客制化?

通常android源码默认使用了aosp的应用签名中的testkey,如上目录/build/target/product/security/目录下的testkey签名,然而这套签名是aosp的公共测试签名,因此安全系统极低,在XTS等测试中会对其进行拦截,通常我们会定制我们自己的应用签名。如下步骤介绍如何指定厂商自己的应用签名:

步骤一:如何生成APK应用签名文件?

在android根目录/build/target/product/security/有详细说明如何生成秘钥对,其中

在项目开发过程中,我们通常需要更换上面的秘钥对,使用客户提供或者我们自己的秘钥对,生成方式如上。

步骤二:如何集成APK应用签名文件?

我们可以通过宏变量PRODUCT_DEFAULT_DEV_CERTIFICATE来指定如上步骤生成的签名文件的路径。如ChatGPT的回答:

步骤三:如何使用APK应用签名文件?

  • Android编译构建的时候引入KEY
  • 应用集成的时候指定使用的KEY
bash 复制代码
include $(CLEAR_VARS)
LOCAL_MODULE := AOSPLauncherR
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := platform   //指定平台签名
LOCAL_PRIVILEGED_MODULE := true
LOCAL_REQUIRED_MODULES := privapp_permissions_AOSPLauncherR.xml
LOCAL_OVERRIDES_PACKAGES := Home Launcher2 Launcher3 \
    Launcher3QuickStep Launcher3Go Launcher3QuickStepGo \
    MtkLauncher3 MtkLauncher3QuickStep MtkLauncher3Go MtkLauncher3QuickStepGo MtkLauncher3GoIconRecents
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := privapp_permissions_AOSPLauncherR.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_PRODUCT_MODULE := true
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)

这里集成的AOSPLauncherR因为是平台的应用,LOCAL_CERTIFICATE = platform,因此编译构建的时候针对AOSPLancherR应用会使用步骤一中指定的plat签名文件进行签名

bash 复制代码
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := MobileFeliCaSettingApp
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
# indicate to generate .odex file in special built/core/prebuilt.mk
LOCAL_DEX_PREOPT:=true
include $(BUILD_PREBUILT)

这里集成的MobileXXX应用是三方应用,使用LOCAL_CERTIFICATE := PRESIGNED,因此编译构建的时候使用的是testKey?

4、相关案例

案例一:因为APK应用签名为系统默认,导致XTS问题

CtsSecurityTestCases

如上报错日志表示一堆应用使用了android默认的应用签名,解决方案就是生成新的应用签名文件

GtsAppBlacklistDeviceTestCases

如上报错日志表示一堆应用使用了android默认的应用签名,解决方案就是生成新的应用签名文件

GtsMbaPrivilegedPermissionTestCases

testPackageSignatures和testForBlacklistedApps和testMbaPrivilegedPermission 这样的测试用例是针对APK应用签名的校验,即编译的时候需要对所有应用或者OTA包进行应用签名,使用默认android的签名就会被检查出来,解决方案就是更新自己的应用签名

BTS which has been signed by a certificate that is known to be compromised and should be replaced

是针对系统应用签名的一个检测,即编译的时候需要对所有应用或者OTA包进行应用签名,使用默认android的签名就会被检查出来,解决方案就是更新自己的应用签名

案例二:因为APK应用签名不匹配,导致OTA无法正常升级

相关推荐
学习使我健康4 小时前
Android App 启动原理
android·android studio
TechMix5 小时前
【性能工具】atrace、systrace、perfetto抓取的trace文件有何不同?
android·性能优化
张小潇5 小时前
AOSP15 WMS/AMS系统开发 - 窗口层级源码分析
android·前端
努力努力再努力wz7 小时前
【MySQL入门系列】掌握表数据的 CRUD:DML 核心语法与执行逻辑解析
android·开发语言·数据结构·数据库·c++·b树·mysql
zh_xuan9 小时前
Android gradle任务
android·gradle构建
Grackers10 小时前
Android Perfetto 系列 10:Binder 调度与锁竞争
android·binder
李白你好10 小时前
Android 自动化渗透测试指令生成
android·自动化
CeshirenTester11 小时前
Claude Code 不只是会写代码:这 10 个 Skills,才是效率分水岭
android·开发语言·kotlin
朝星13 小时前
Android开发[2]:Flow
android·kotlin
zzb158013 小时前
Android Activity 与 Intent 学习笔记
android·笔记·学习