APK应用程序签名异常的检测方法

原创 橙留香Park 2022-10-07 00:01

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

少走了弯路,也就错过了风景,无论如何,感谢经历


更多关于Android安全的知识,可前往:https://blog.csdn.net/ananasorangey/category11955914.html



0x01 APK应用程序签名异常的检测方法

要在Android上安装APK必须要进行数字签名,数字签名用于验证应用程序更新的所有者身份,验证的目的是为了防止APK应用程序被篡改或修改APK来包含恶意代码

对 APK 进行签名时,会附加一个公钥证书,这个证书是将 APK 应用程序与开发者和开发者的私钥进行关联


:在调试模式下构建应用时,Android SDK 会使用专门为调试目的创建的调试密钥对我们要打包的APK应用程序进行签名,需要注意使用调试密钥签名的应用并不会在大多数APK应用商店中被接受和允许上架

应用程序的最终发布版本(上线生产版本)必须使用有效的发布版本的密钥进行签名。在 Android Studio 中,APK可手动或通过创建分配给发布构建类型的签名配置来对应用进行APK的签名

Android 9(API 级别 28)之前的 Android 上,所有的应用程序更新都需要使用相同的证书进行签名,所以开发者可以考虑使用 25 年或更长的有效期

:需要注意,如果在 Google Play 上发布的应用必须使用有效期在 2033 年 10 月 22 日之后结束的密钥进行签名

三种 APK 签名方案:

  • v1 方案:JAR 签名

  • v2 方案:APK 签名方案 v2

  • v3 方案:APK 签名方案 v3

与 v1 方案相比,Android 7.0(API 级别 24)及更高版本支持的 v2 签名,且提供了更高的安全性和性能。Android 9(API 级别 28)及以上版本支持的 V3 签名,使应用程序能够更改其签名密钥,作为APK 更新的一部分,此功能通过允许同时使用新/旧密钥,保证了兼容性和应用程序的持续可用性。需要注意对于每个签名方案,发布APK版本也应该始终通过之前内部评估好的方案进行签名

在做静态分析(当然动态分析时跟这个一样,将APK导出来用jarsigner或apksigner工具来验证APK的签名是否异常)APK时,我们要确认几个重要的信息,比如APK的发布版本是 Android 7.0(API 级别 24)及更高版本的 v1 和 v2 方案以及 Android 9(API 级别 28)及更高版本的所有三个方案进行签名,且 APK 应用程序中的签名证书是属于开发者的

我们可以使用 Android SDK 构建工具的修订版 24.0.3 及更高版本中提供的 apksigner 工具为 APK 签名,并确保 APK 的签名能够在 APK 支持的所有版本的 Android 平台上成功通过验证,此处我们是主要是利用apksigner 工具来验证APK的签名是否是属于正确的开发者的,apksigner 工具它的位置在[SDK-Path] /build-tools/[版本]。它位于[SDKPath]/build-tools/[version],更多详情请前往:https://developer.android.com/studio/command-line/apksigner?hl=zh-cn#usage

我们可以使用apksigner工具来验证 APK的 签名,apksigner 默认安装位置位于:C:\Users\xxx\AppData\Local\Android\Sdk\build-tools\33.0.0\lib下,随后执行如下命令:

$ java -jar C:\Users\xxx\AppData\Local\Android\Sdk\build-tools\33.0.0\lib\apksigner.jar verify --verbose vuls.apk
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): false
Verified using v3.1 scheme (APK Signature Scheme v3.1): false
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1

当然,我们也可以使用 jarsigner 工具来检查APK的签名证书的内容,但需要注意在调试证书时,Common Name (CN)属性要设置为 "Android Debug"

使用调试证书签名的 APK 的输出,这里我们使用JAVA自带的jarsigner工具来做签名,如何签名的命令如下:

$ jarsigner -verify -verbose -certs vuls.apk

sm 14112 Fri Nov 30 00:00:00 CST 1979 AndroidManifest.xml

>>> 签名者
X.509, C=US, O=Android, CN=Android Debug
[证书的有效期为18-6-6 下午12:4148-5-29 下午12:41]
[无效的证书链: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

sm 6 Fri Nov 30 00:00:00 CST 1979 META-INF/android.arch.core_runtime.version

>>> 签名者
X.509, C=US, O=Android, CN=Android Debug
[证书的有效期为18-6-6 下午12:4148-5-29 下午12:41]
[无效的证书链: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

sm 6 Fri Nov 30 00:00:00 CST 1979 META-INF/android.arch.lifecycle_livedata-core.version

(... ...此处省略一堆内容)

>>> 签名者
X.509, C=US, O=Android, CN=Android Debug
[证书的有效期为18-6-6 下午12:4148-5-29 下午12:41]
[无效的证书链: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]


s = 已验证签名
m = 在清单中列出条目
k = 在密钥库中至少找到了一个证书
i = 在身份作用域内至少找到了一个证书

- 由 "C=US, O=Android, CN=Android Debug" 签名
摘要算法: SHA1 (弱)
签名算法: SHA1withRSA (弱), 1024 位密钥 (弱)

jar 已验证。

警告:
此 jar 包含其证书链无效的条目。原因: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
此 jar 包含其签名者证书为自签名证书的条目。
SHA1 摘要算法被视为存在安全风险。此算法将在未来的更新中被禁用。
SHA1withRSA 签名算法被视为存在安全风险。此算法将在未来的更新中被禁用。
RSA 签名密钥的密钥大小 1024 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
此 jar 包含的签名没有时间戳。如果没有时间戳, 则在其中任一签名者证书到期 (最早为 2048-05-29) 之后, 用户可能无法验证此 jar。

签名者证书将于 2048-05-29 到期。

上面可以看到出现了许多"CertPath not validated"错误,这个错误在 Java SDK 7 及以上版本才有,如果想忽略这个错误,我们可以使用 Android SDK 构建工具的修订版 24.0.3 及更高版本中提供的 apksigner 工具为 APK 签名来代替JAVA JDK自带的 jarsigner 工具来验证APK的证书链,如下:

  • 检查 APK 的签名是否可在 APK 支持的所有 Android 平台上被确认为有效:

$ apksigner verify vuls.apk

  • 检查 APK 的签名是否可在 Android 4.0.3(API 级别 15)及更高版本上被确认为有效:

$ apksigner verify --min-sdk-version 15 vuls.apk

另外签名配置可以通过 Android Studio或 build.gradle中的 signingConfig 块进行管理。要同时激活 v1和 v2 以及 v3 方案,必须设置以下值:

v1SigningEnabled true
v2SigningEnabled true
v3SigningEnabled true

在官方的 Android 开发者文档中,提供了几种配置应用发布的最佳实践

Android Studio Signature Version V1/ V2

  • V1 (jar Signature)

    • V1: Jar Signature 来自 JDK,可对签名后的文件,作适当修改,并重新压缩

    • V1 签名不保护 APK 的某些部分,例如 ZIP 元数据。APK 验证程序需要处理大量不可信(尚未经过验证)的数据结构,然后会舍弃不受签名保护的数据。这会导致相当大的受攻击面。此外,APK 验证程序必须解压所有已压缩的条目,而这需要花费更多时间和内存。为了解决这些问题,Android 7.0 中引入了 APK 签名方案 v2

  • V2 (Full APK Signature)

    • V2: Android 7.0 (Nougat) 引入的一项新的签名方案,不能对签名后的 APK作任何修改,包括重新解压。因为它是针对字节进行的签名,所以任何改动都会影响最终结果

  • V3

    • V3:在 Android 9 中,v2 方案已更新为 v3 方案(也称为v2+),以便在签名分块中包含其他信息,但在其他方面保持相同的工作方式,该方案会对 APK 的内容进行哈希处理和签名,然后将生成的“APK 签名分块”插入到 APK 中

APK 签名方案详情,请移步Android 官网的介绍:https://source.android.com/docs/security/apksigning?hl=zh-cn

只勾选v1签名所有机型都能用,如果只勾选V2签名7.0以下机型会在直接安装完后显示未安装,7.0及以上机型使用V2的方式验证成功安装,同时勾选V1和V2对所有机型成功安装,或者在Gradle 文件中修改,如下:

signingConfigs {
debug {
v1SigningEnabled true
v2SigningEnabled true
v3SigningEnabled true
}
release {
v1SigningEnabled true
v2SigningEnabled true
v3SigningEnabled true
}
}

来说说为什么我们要推荐使用v1和v2共同使用呢?因为在2020年的时候Google公布的“Janus”漏洞,可使攻击者将Dex附加到原有的apk之上,绕过签名认证,在执行时优先执行附加的dex文件,这个漏洞直接影响Android 5.0~8.0上所有基于signature scheme V1签名的APK。这里说哈,对应APK应用程序来说签名确是唯一的,是用来证明是谁开发的是否是盗版或恶意APK,那么假如正版应用被恶意修改,其签名也会随之被破坏,需要重新签名才能安装到Android上,而且市面上各种APK应用商店和手机应用助手类的工具,往往通过包名和签名来判断一个APK应用程序是否是盗版或恶意APK应用程序

:在官方的 Android 开发者文档中,官方提供了几种配置应用发布的方式,详情请移步:https://developer.android.com/studio/publish/preparing#publishing-configure

参考链接

https://www.cnblogs.com/daemon369/p/3227309.html

https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05i-Testing-Code-Quality-and-Build-Settings.md

https://support.google.com/googleplay/android-developer/answer/9848633?hl=zh-Hans

https://blog.csdn.net/beyond702/article/details/56281068

https://www.jianshu.com/p/271474cd1d91


你以为你有很多路可以选择,其实你只有一条路可以走



橙留香Park 橙留香来自一位三流剑客之乡,担任威胁猎手,脑子不会转弯,属于安全特学脑。橙留香同学[小菜鸟],定期分享从零入门车联网安全(包括基础知识储备)技术。只为你呈现有价值的信息,专注于车联网安全领域之Android终端反入侵技术研究。
评论
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 74浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 48浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 131浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 85浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 104浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 122浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 83浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 76浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 173浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 145浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦