0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

有什么方法可以检测APK应用程序是否签名异常呢

工程师邓生 来源:橙留香Park 作者:橙留香Park 2022-08-31 10:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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/[版本]。

2cdd8db6-2872-11ed-ba43-dac502259ad0.png

我们可以使用apksigner工具来验证 APK的 签名,apksigner 默认安装位置位于:C:UsersxxxAppDataLocalAndroidSdkuild-tools33.0.0lib下,随后执行如下命令:

$ java -jar C:UsersxxxAppDataLocalAndroidSdkuild-tools33.0.0libapksigner.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

2d071ed8-2872-11ed-ba43-dac502259ad0.png

当然,我们也可以使用 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:41至48-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:41至48-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:41至48-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

2d2bbfa4-2872-11ed-ba43-dac502259ad0.png

另外签名配置可以通过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 官网的介绍

2d4d2ff4-2872-11ed-ba43-dac502259ad0.png

只勾选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 开发者文档中,官方提供了几种配置应用发布的方式,

2d78e284-2872-11ed-ba43-dac502259ad0.png

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android系统
    +关注

    关注

    0

    文章

    57

    浏览量

    14216
  • API接口
    +关注

    关注

    1

    文章

    115

    浏览量

    11280
  • apk
    apk
    +关注

    关注

    0

    文章

    25

    浏览量

    5484

原文标题:APK应用程序是否签名异常的检测方法

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    S32K系列引导加载程序应用程序跨不同定制电路板设计的跳转问题求解

    。 **问题:** 1. 外设引脚配置差异会影响引导加载程序应用程序的转换吗? 2. 是否可能依赖于电路板的特定寄存器或初始化序列? 3. 您建议使用哪些调试
    发表于 04-22 07:02

    如何在 i.MX RT1050 上实现两个镜像(引导加载程序应用程序)的双 HAB 身份验证?

    实现 HAB 身份验证(引导加载程序应用程序)在 i.MX RT1050 上? 应该使用相同的SRK/CSF密钥对两个映像进行签名,还是恩智浦是否提供支持的多映像验证
    发表于 04-07 06:14

    C++程序异常的处理机制

    1、什么是异常处理? 经验的朋友应该知道,在正常的C和C++编程过程中难免会碰到程序不按照原本设计运行的情况。 最常见的除法分母为零,数组越界,内存分配失效、打开相应文件失败等等
    发表于 12-02 07:12

    如何检测电能质量在线监测装置采样电阻是否损坏?

    检测电能质量在线监测装置采样电阻是否损坏,需遵循 “ 先非侵入式数据判断(初步定位)→ 再侵入式硬件检测(精准验证) ” 的流程,结合 “数据异常现象” 和 “硬件实测阻值” 双重维度
    的头像 发表于 10-22 15:07 1223次阅读

    哪些工具可以用于电能质量在线监测装置时钟模块自动同步异常检测

    检测电能质量在线监测装置时钟模块自动同步异常,需根据同步方式(PTP/IEEE 1588、GPS / 北斗、NTP)选择针对性工具,以下是覆盖硬件、软件、协议分析的全维度工具方案: 一、通用
    的头像 发表于 10-22 14:26 629次阅读

    哪些常见的AI算法可以用于装置数据的异常检测

    在装置数据(如工业设备传感器数据、电子装置运行参数、化工装置工况数据等)的异常检测中,AI 算法的选择需结合数据特点(如 时序性、维度、标注情况 )、检测目标(如实时性、精度、可解释性)及部署环境
    的头像 发表于 09-18 09:27 1065次阅读
    <b class='flag-5'>有</b>哪些常见的AI算法<b class='flag-5'>可以</b>用于装置数据的<b class='flag-5'>异常</b><b class='flag-5'>检测</b>?

    如何利用AI算法进行装置数据的异常检测

    利用 AI 算法进行装置数据异常检测,需结合工业装置的数据特性(如实时性、多源性、强时序性、噪声干扰)和业务需求(如故障预警、安全合规、工艺优化),通过 “数据预处理 - 算法选型 - 模型部署
    的头像 发表于 09-05 15:27 2256次阅读
    如何利用AI算法进行装置数据的<b class='flag-5'>异常</b><b class='flag-5'>检测</b>?

    IGBT 样品异常检测案例解析

    通过利用Thermal EMMI(热红外显微镜)去检测IGBT 样品异常
    的头像 发表于 08-15 09:17 2141次阅读
    IGBT 样品<b class='flag-5'>异常</b><b class='flag-5'>检测</b>案例解析

    FX3 UVC 无法与 Ubuntu 24.04 Cheese 或 Snapshot 相机应用程序配合使用,怎么处理?

    `:运行一次,没有问题。首次出现缓冲错误后启动。但是,使用 libcamera 测试应用程序“cam”和“qcam”,我可以毫无问题地传输数据。 如果能帮助检查 wireshark 跟踪中是否存在处理
    发表于 07-16 06:37

    CX3 是否可以检测 MIPI CSI-2 RX 错误的寄存器?

    CX3 是否可以检测 MIPI CSI-2 RX 错误的寄存器? 如果有可以检测上述错误的寄存
    发表于 07-15 07:39

    机器学习异常检测实战:用Isolation Forest快速构建无标签异常检测系统

    本文转自:DeepHubIMBA无监督异常检测作为机器学习领域的重要分支,专门用于在缺乏标记数据的环境中识别异常事件。本文深入探讨异常检测
    的头像 发表于 06-24 11:40 1603次阅读
    机器学习<b class='flag-5'>异常</b><b class='flag-5'>检测</b>实战:用Isolation Forest快速构建无标签<b class='flag-5'>异常</b><b class='flag-5'>检测</b>系统

    对于具有直接反馈控制的 CCG3PA 应用程序是否可以正确地重新使用引脚 12(负载使能控制),它有哪些限制?

    对于具有直接反馈控制的 CCG3PA 应用程序是否可以正确地重新使用引脚 12(负载使能控制),它有哪些限制? 我们能够将其重复用于通信,但是当使用 \"
    发表于 05-26 07:23

    提高IT运维效率,深度解读京东云AIOps落地实践(异常检测篇)

    基于深度学习对运维时序指标进行异常检测,快速发现线上业务问题 时间序列的异常检测是实际应用中的一个关键问题,尤其是在 IT 行业。我们没有采用传统的基于阈值的
    的头像 发表于 05-22 16:38 1159次阅读
    提高IT运维效率,深度解读京东云AIOps落地实践(<b class='flag-5'>异常</b><b class='flag-5'>检测</b>篇)

    是否可以以某种方式利用 VBUS_CTRL 引脚来控制 NMOS 晶体管或模拟比较器?

    数据通信(通过将其连接到外部应用程序 MCU)。 我们想到的解决方案是使用 USB 数据多路复用器。 我们正在寻找一种方法,一旦 USB PD / BC1.2 协商完成,就可以自动切换 D+ 和 D+
    发表于 05-19 06:14

    如何使用USB中断传输方法访问FPGA?

    我目前正在设计一个可以通过 CY7C65216 从 Windows PC 访问 FPGA 的单元。 我正在考虑使用USB中断传输方法访问FPGA。 这可能吗? 如果有,是否任何示例软
    发表于 05-19 06:04