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

作者:伊樵、舟海、呆狐@阿里聚安全


1 通用签名风险简介

1.1 Android应用签名机制

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

为什么需要数字签名? 

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

进行签名需要的工具有哪些? 

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

签名后的文件都有哪些? 

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

CERT.RSA、CERT.SF和MANIFEST.MF。

  MANIFEST.MF中保存了所有其他文件的SHA1摘要并base64编码后的值。

 CERT.SF文件是对MANIFEST.MF文件中的每项中的每行加上“\r\n”后,再次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工具和pk8、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/studio/publish/app-signing.html

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

[3] 数字签名是什么,http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

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

[5] Signing Builds for Release,https://source.android.com/devices/tech/ota/sign_builds.html

[6] https://github.com/android/platform_build/tree/master/target/product/security

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

Android安全开发之通用签名风险的更多相关文章

  1. Android采访开发——2.通用Android基础笔试题

    注意finddreams博客: http://blog.csdn.net/finddreams/article/details/44219231 正值跳槽的热季.整理一下Android面试中最常考的笔 ...

  2. Android NDK开发 JNI类型签名和方法签名(六)

    在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与Java比较起来,其范围更具严格性,如下: 1.primitive types ---- ...

  3. Android简单开发之 通用Adapter ViewHolder

    我们寻常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { private List<Busba ...

  4. Android安全开发之安全使用HTTPS

    Android安全开发之安全使用HTTPS 1.HTTPS简介 阿里聚安全的应用漏洞扫描器中有证书弱校验.主机名弱校验.webview未校验证书的检测项,这些检测项是针对APP采用HTTPS通信时容易 ...

  5. Android安全开发之启动私有组件漏洞浅谈

    0x00 私有组件浅谈 android应用中,如果某个组件对外导出,那么这个组件就是一个攻击面.很有可能就存在很多问题,因为攻击者可以以各种方式对该组件进行测试攻击.但是开发者不一定所有的安全问题都能 ...

  6. Android UI开发【开篇导航】

    如今移动互联网正处于飞速发展的时期,正式看中这个行业的发展势头,本人在2011年从.NET转行做了移动应用开发这块,接触了android和ios开发,到今已快3个年头,先前忙于学习各种基础知识和语法方 ...

  7. Android应用开发完全退出程序的通用方法

    在开发一个android应用时,有可能有N个Activity,而在每个Activity里的菜单里有个"退出程序"菜单,这里就要完全退出程序了,所以今天给大家分享的是Android应 ...

  8. Android系统开发 编译系统签名的APP

    前言 一般情况下,我们使用的签名都是自己生成的Java签名来编译APP. 但是,如果需要开发一些特定设备的APP(对权限有更高的要求,需求一些系统基本的权限,比如让APP可以控制设备的休眠),那就需要 ...

  9. Android软件安全开发实践(下)

    Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你 ...

随机推荐

  1. 2017年第1贴:EXT.JS使用MVC模式时,注意如何协调MODEL, STORE,VIEW,CONTROLLER的关系

    也调了快一天,死活找不到窍门. MODEL, STORE,VIEW的调置测试了很久,试了N种方法,不得其果. 最后,试着在APPLICATION里加入CONTROLLER, 在CONTROLLER里加 ...

  2. 获取youku视频下载链接(wireshark抓包分析)

    随便说两句 前两天写了一个python脚本,试图以分析网页源码的方式得到优酷视频的下载地址,结果只得到视频的纯播放地址,下载纯播放地址得到的文件也无法正常播放视频. 这里共享一下播放地址得到的方法(想 ...

  3. C# ORM中Dto Linq Expression 和 数据库Model Linq Expression之间的转换

    今天在百度知道中看到一个问题,研究了一会便回答了: http://zhidao.baidu.com/question/920461189016484459.html 如何使dto linq 表达式转换 ...

  4. JavaScript DOM节点和文档类型

    以下的例子以此HTML文档结构为例: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  5. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    有时候,当我们使用"mysql"."mysqladmin"."mysqldump"等命令管理数据库时,服务器抛出类似如下错误: 一.错误现场 ...

  6. EXEC sp_executesql

    declare @sql nvarchar(max)declare @nu int set @sql='SELECT * FROM [FMTest].[dbo].[FM_Radio_Station]' ...

  7. 360浏览器导出Excel闪退BUG

    最近这半个月在疯狂的修改各种BUG,所以比较少更新博客. 现在谈谈这个360浏览器导出Excel的BUG的解决方法. 该BUG常出现在win7系统与xp系统导出Excel的瞬间关闭导出弹窗. 目前互联 ...

  8. 盘点销售一体机 打印POS一体的设备。 打印,盘点,销售PDA(手持终端)+移动销售POS软件

    一.产品介绍 本产品为一个PDA(手持终端)+移动销售POS管理软件组合.可以实现功能如下: 可以实现移动销售(销售退货).盘点.配送.移库.打印小票的功能. 销售时,可以选择客户.业务员.库房,并且 ...

  9. STDIN(0), STDOUT(1), STDERR(2), 2 > &1

    当我们在 shell 中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符(文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的文件是0,第二个是1 ...

  10. 【转】bash 参数展开(Parameter Expansion)

    转自:http://www.360doc.com/content/13/0513/20/9437165_285204629.shtml ${parameter} 取parameter的值 ${para ...