博文作者:金刚项目团队
发布日期: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