Android FakeID任意代码注入执行漏洞简析

博文作者:金刚项目团队

发布日期:2014-09-01

阅读次数:100

博文内容:


u  漏洞背景

国外安全机构BlueBox在2014年7月30日公布了一个关于APK签名的漏洞——FakeID,攻击者可利用该漏洞实现代码注入,执行恶意操作。

u  漏洞危害

1)受影响系统版本:部分Android 4.4及所有4.4以下版本;

2)典型攻击场景:使用了Android webview组件的应用可被恶意监控或隐私数据失窃;可能对GoogleWallet类的支付应用产生威胁,如可获得NFC(近距离无线通信)设备的控制权限;


u  漏洞原理

1)APK签名

Android应用在发布之前需要进行签名,签名信息放在apk压缩包的/META-INF目录(.RSA),系统在以下场景会检查该签名:

l  安装前验证apk中文件数据的完整性;

l  识别apk的身份。如果一个apk有系统签名,会有更高的权限;如果两个apk的签名一致,这两个应用可以共享数据;

l  一些特定场景下一些应用会验证其他应用是否有某个特定签名,如webkit会验证一个插件程序是否是由Adobe颁发的。

Android应用的自签名证书内容如下所示:

 


2)
问题所在

Android系统在证书链的校验过程中,对子证书校验不足,如下图所示,根证书仅校验子证书的issuer name是否与自己的subject name相同,并没有校验它们是否是同一个public key签名,这样便导致恶意应用可以通过伪造证书的方式进行恶意操作。


 

漏洞代码位于JarUtils类的findCert方法,修复前后代码对比如下:






u  
漏洞利用

FakeID漏洞的利用过程包含证书伪造、恶意应用签名、篡改证书、安装应用到客户端等。本文给重现漏洞的实现过程,伪造一个Adobe FlashPlayer的恶意插件,根据以下验证缺陷实施:

a)     WebKit在访问请求flash的页面时会调用Adobe FlashPlayer插件;

b)     WebKit认证Adobe FlashPlayer插件的依据是APK证书链中最底层的证书为Adobe的签名证书;

c)      恶意应用应符合Adobe FlashPlayer插件认证需求,同时在APK中放一个符合规范的so文件供Webkit调用。


因此伪造恶意应用,将其根证书篡改为真实的Adobe证书,即可通过认证,在访问请
求flash的页面时将自动被调用并执行so库中的恶意代码。

 

1)伪造证书

l  更改openssl.cnf配置,修改policy属性的值为policy_anything;

l  使用openssl生成CA自签名根证书(设置为Adobe证书名称)

l  使用根证书签发子证书

l  导入根证书到keystore

l  导入子证书到keystore


操作完成后,伪造的子证书中含有2个证书结点,认证1为自身,认证2为CA根证书(伪造的假Adobe证书),两个证书构成证书链,如下所示:



 

2)构造符合要求的恶意应用

l  符合Adobe FlashPlayer插件规范


除使用Adobe签名外,还需满足以下要求:APK申请了android.webkit.permission.PLUGIN权限;APK声明了一个服务,Intent是android.webkit.PLUGIN,有个meta信息是type,type的值必须是native;

l  符合webkit插件开发的规范

 

3)使用子证书签名恶意apk

 此时恶意应用的签名中包含两个证书,其中Adobe的证书是虚假的(名称一致),如下所示:


  

 

4)篡改apk证书使有效的Adobe证书作为签发者

通过自动化脚本[1],将恶意应用apk目录下/META-INF中的RSA签名文件,与真实的Adobe应用的签名文件合并,生成一个具有真实Adobe证书的RSA签名文件,并用其替换原有的签名文件。篡改后的签名文件内容如下:



 

5)安装恶意应用到客户端


将上述构造的恶意插件应用安装到客户端。

 

u  漏洞利用效果

结合Android FakeID与LaunchAnyWhere漏洞,实现注入APP进程,远程监听APP登录密码的效果。

1)  当用户打开恶意app,恶意app会自动调起微信的webview去访问一个含有flash的网页,这样so文件就注入到微信进程,静默监听用户输入密码;



恶意app

 

         

 



恶意app自动打开网页

 



so库注入成功

 

2)  之后用户在微信中输入密码,恶意app会将用户输入的密码发送给远程服务器



用户输入密码

 



远程服务器端接收密码

 

 

u  漏洞解决方案

将android系统升级到最新版或者安装第三方提供的在XPOSED框架下的一个apk补丁[4]来暂时修复该漏洞。

 

 

u  参考:

[1]https://github.com/retme7/FakeID_poc_by_retme_bug_13678484/

[2] http://bluebox.com/technical/android-fake-id-vulnerability/

[3]http://blogs.360.cn/360mobile/2014/08/04/all-about-fakeid/

[4]http://repo.xposed.info/module/tungstwenty.xposed.fakeidfix

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值