Android安全开发之通用签名风险

1 通用签名风险简介

1.1 Android应用签名机制

阿里聚安全漏洞扫描器有一项检测服务是检测APP的通用签名风险。Android系统要求安装的应用必须用数字证书进行签名后才能安装,而且签名证书的私钥由应用开发者保存。签名证书的生成也由开发者本身生成。在应用安装时会校验包名(package name)和签名,若是系统中已经存在了一个相同的包名和签名的应用,将会用新安装的应用替换旧的;若是包名相同可是签名不一样,则会安装失败。html

为何须要数字签名? java

数字签名是防止要保护的内容被篡改,用非对称加密算法。先对要保护的内容进行消息摘要,用私钥对消息摘要进行加密,生成数字签名,将数字签名和要保护的内容一块儿分发出去。 内容接收者用公钥对数字签名解密获得发送者给的消息摘要A,内容接收者对接收到的内容进行用相同的消息摘要算法处理获得消息摘要B,对比A和B是否相同,来断定传送的内容是否被篡改。 正常的APK文件是个ZIP压缩文件,除了应用的可执行文件、资源文件,还包括这些可执行文件、资源文件的摘要信息,数字证书的公钥信息等。而且经过这些签名信息能够肯定APP和其开发者的关系。linux

进行签名须要的工具备哪些? android

对apk进行签名须要用到签名证书和签名工具。Android系统要求对APP进行签名的数字证书能够由开发者本身生成。签名工具备jarsignersignapk。jarsigner是Java自己自带的一个工具,他也能够对jar进行签名的;而signapk是专门为了Android应用程序apk进行签名的工具。两者的区别是:jarsigner工具签名时使用的是keystore签名文件,signapk工具签名时使用的是pk8,x509.pem文件。git

签名后的文件都有哪些? github

应用签名完后在应用的META-INF目录下会有三个文件: 算法

CERT.RSA、CERT.SF和MANIFEST.MF。数据库

MANIFEST.MF中保存了全部其余文件的SHA1摘要并base64编码后的值。windows

CERT.SF文件 是对MANIFEST.MF文件中的每项中的每行加上“rn”后,再次SHA1摘要并base64编码后的值(这是为了防止经过篡改文件和其在MANIFEST.MF中对应的SHA1摘要值来篡改APK,要对MANIFEST的内容再进行一次数字摘要)。安全

CERT.RSA 文件:包含了签名证书的公钥信息和发布机构信息。

对安装包的校验过程在源码的frameworks/base/core/java/android/content/pm/PackageParser.java类中能够看到,具体可看阿里聚安全博客的另一篇文章:Android5.1.1 - APK签名校验分析和修改源码绕过签名校验。

1.2 通用签名风险

什么是通用签名?

搭建好Android开发环境后(使用Eclipse或Android Studio),对APK签名的默认密钥存在debug.keystore文件中。在linux和Mac上debug.keystore文件位置是在~/.android路径下,在windows目录下文件位置是C:\user\用户名.android路径下。

除了debug.keystore外,在AOSP发布的Android源码中,还有如下几个证书是公开的,任何人均可以获取,在源码的build/target/product/security目录中:

图片描述

这几个证书的做用:

testkey

Generic default key for packages that do not otherwise specify a key.

platform

Test key for packages that are part of the core platform.

shared

Test key for things that are shared in the home/contacts process.

media

Test key for packages that are part of the media/download system.

verity

Test Key for verifiedboot system imagein Android Lollipop. Sign boot.img,sign verity metadata in system.img.

通用签名风险:

(1)若是攻击者的应用包名与目标应用相同,又使用了相同的密钥对应用进行签名,攻击者的应用就能够替换掉目标应用;

(2)另外目标应用的自定义权限android:protectionlevel为“signature”或者“signatureOrSystem”时,保护就形同虚设;

(3)若是设备使用的是第三方ROM,而第三方ROM的系统也是用AOSP默认的签名,那么使用若是使用系统级签名文件签名过的应用,权限就获得了提高。

对于普通开发者若是本身的签名证书泄露也可能发生(1)、(2)条所提到的风险。

2 通用签名风险示例

使用通用签名的公开案例很是少,不过咱们阿里聚安全漏洞扫描器仍是发现了一些应用使用了通用签名, 扫描结果数据库中查到曾经有819个APP使用了AOSP的签名证书 (排查了几个APP的最新版,但都已经用了新的签名;也不排除应用被恶意攻击者反编译重打包后使用通用签名证书签名)。另外还有很多私有签名证书泄露、滥用的(使用通用签名证书其实就至关于泄露了签名证书)状况。

以乌云公开的WooYun-2014-67027为例 ,有安全研究人员发现有一个数字证书签名被不少银行的手机客户端所使用。与此同时还发现了几款我的开发者类应用也使用了此证书签名。而这种数字签名被滥用的行为存在极大的安全隐患。

解压应用安装包,可用keytool查看应用的签名证书信息:

keytool -printcert -v -file META-INF/CERT.RSA

图片描述

经挖掘和分析,研究人员发现目前共有23款不一样银行手机银行客户端使用该签名:

图片描述

在应用市场内,目前共发现6款我的开发的应用同时使用该数字证书签名:

图片描述

事情发生的缘由是银行的外包开发管理不严,不一样银行的APP竟然用一样的数字证书签名,而且开发者还将证书用于了我的APP的开发中。若是签名证书被恶意攻击者获取,能够编写安装是能直接替换掉这些银行客户端的恶意APP。

还可使用AOSP通用签名提高应用权限:

本人直接编译AOSP源码获得的ROM,使用AOSP的默认证书,在设置->关于手机,版本号中可查看到:

图片描述

对于普通的用默认debug.keystore证书签名的App,若是在AndroidManfiest.xml的manifest节点加入android:sharedUserId=”android.uid.system”这个属性,安装时会提示错误:

图片描述

若是对app-debug.apk使用AOSP提供的platform.x509.pem和platform.pk8从新签名,则能够安装成功:

图片描述

查看应用的进程属性,已经是system用户组。

图片描述

目前有很多的第三方ROM使用的AOSP提供的默认签名(见参考[4]的论文中所提)。

3 阿里聚安全对开发者建议

(1)上线前用阿里聚安全的漏洞扫描器进行一下检查。

阿里聚安全的漏洞扫描器目前已能检查出通用签名风险,将来可能增长检测证书是否泄漏风险。还能够发现其余安全风险。

(2) 生成本身专有的签名证书,证书分类使用。

使用keytool工具生成.keystore的数字证书:

keytool -genkey -v -keystore my-release-key.keystore

-alias alias_name -keyalg RSA -keysize 2048 -validity 10000

使用jarsigner工具对打包好的APK进行签名:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1

-keystore my-release-key.keystore my_application.apk alias_name

使用openssl生成pk8和x509.pm的证书,参考以下:

图片描述

使用signapk工具和pk八、x509.pm证书对打包好的APP签名:

java -jar signapk.jar platform.x509.pem platform.pk8 input.apk output.apk

或者Gradle打包配置设置:

图片描述

(3)作好安全培训,规范开发流程,证书之类的统一管理。

(4)我的开发者在往开源平台上传代码时,注意不要将签名证书的私钥上传。

搜了下github,有很多开发者将其release版的keysotre上传了,而且在gradle文件上写上了keystore的访问密码。以下:

图片描述

参考

[1] Sign Your App https://developer.android.com...

[2] Android签名机制之—签名过程详解,http://blog.csdn.net/jiangwei...

[3] 数字签名是什么,http://www.ruanyifeng.com/blo...

[4] Min Zheng,DroidRay: A Security Evaluation System for Customized Android Firmwares

[5] Signing Builds for Release,https://source.android.com/de...

[6]https://github.com/android/pl...

做者:伊樵、舟海、呆狐@阿里聚安全,更多安全类技术文章,请访问阿里聚安全博客

相关文章
相关标签/搜索