曝出时间:2015.07
原理浅述:Android源文件有其对应的数字摘要保证其完整性,并且有对CERT.SF的数字签名来保证其不可篡改。但是/META-INFO文件夹中的内容没有采取任何的保护措施,我们只要不触碰CERT.RSA中的证书公钥,以及其中的CERT.SF数字签名部分(当然这二者也保证了CERT.SF不能篡改),就可以对该文件夹做任意的恶意代码插入,并且能够保证插入代码后的apk能够正常安装,运行,而且可以和旧版本升级兼容。接下来,我们可以在其它地方加载调用该隐藏代码,实现攻击行为。
埋点:“others”, “MANIFEST.MF”, “CERT.RSA”, 以及“CERT.SF.signature”
1.Android5.1的源码中方法readMetaEntries()用于读取/META-INFO文件夹中的有效文件,在除开MANIFEST.MF文件之外,它使用后缀名来甄别有效文件。如果后缀名是 SF, DSA, RSA, EC,那么读取该文件;但是如果不是这些后缀名呢?Android什么都没做。因此可以将任意其它后缀的文件放入meta-inf/文件夹中
2.Android5.1源码中签名校验部分的注释写到:对于部分java 1.5之前的apk,Android会忽略到对MANIFEST.MF文件的摘要值的验证。对于这种情况,我们可以直接在MANIFEST.MF文件尾部增加任意我们想要的代码。
3.Android5.1源码中提取CERT.RSA中的签名数据SignedData,但是在提取数据之前,CERT.RSA的ASN1编码结构并没有做任何校验,也就是说我们完全可以破坏整个文件,只要它的SignedData部分没动,Android就检测不出来。举例来说,在ASN1编码的最开头几个字节,会定义整个ASN1文件的最大长度,假设是900,那么Android就会取出900个字节,对于900之后的901直到更多,没有做任何的校验操作。该函数在开头缺少校验有效长度的代码:
if\(defined\_length < file.size\(\)\)
throw exception\(“More bytes in CERT.RSA detected”\);
最简单的代码隐藏方法,直接将炸弹代码粘贴在该文件CERT.RSA的末尾。
4.方法用来验证CERT.SF的数字签名,其中红线部分是提取签名者信息(开发者信息)。我们可以看到,签名者信息可以存在多个,使用列表List数据结构存储。如果列表sigInfos不为空,则提取第一个签名者信息;那么多余的签名者信息呢?Android根本就没有考虑到多个签名者信息存在的情况,缺少校验签名者信息的代码:
if\(sigInfos.size\(\) > 1\) {
throw exception (“More than 1 signerInfos found!”);
return null;
}
引爆器一:ClassLoader.loadClass()
该方法可以用来调用外部类,并且启用外部类的方法,示例中调用com.ali.mobilesecurity.TestActivity类的getMoney\(\)方法。该类与方法已经提前埋设在手机设备之中。
Class<?> mLoadClass = classLoader.loadClass\("com.ali.mobilesecurity.TestActivity"\);
Object TestActivity = \(Object\)mLoadClass.newInstance\(\);
Method getMoney = mLoadClass.getMethod("getMoney", Context.class, String.class, Drawable.class, String.class);
getMoney.setAccessible(true);
引爆器二:Runtime.exec()
该方法主要用来调用shell命令语句。
cmd = readFromManifest(“/META-INFO”); //读取隐藏代码
Runtime.getRuntime\(\).exec\(cmd\); //执行cmd语句
引爆器三:远程执行
得配合其它远程执行漏洞或者网络劫持方法,来引爆本地埋点炸弹。
3. “炸弹引爆”漏洞利用流程
攻击步骤可以分为3步:
在apk中埋点隐藏代码,并通过应用安装/升级,将隐藏代码植入手机设备。
解压并且拷贝出手机中的隐藏代码。
使用点燃方法引爆隐藏的代码炸弹。
攻击者可能采用的攻击模式:
攻击者开发出自己的一个apk,在/META-INFO文件夹中隐藏了恶意代码,并在主程序运行时动态加载恶意代码。该模式可以绕过目前市面上大部分的静态病毒木马检测工具。
攻击者可以往任意的合法apk中(例如Youtube.apk, Twitter.apk等)插入恶意代码,并且不影响该apk的正常安装、运行与升级,因为CERT.RSA中的证书公钥,以及其中的CERT.SF数字签名部分,和CERT.SF均和正常apk一模一样。然后,攻击者通过各种手段发布感染过的apk,假以时日,你的手机设备中可能会种满了各种各样的代码炸弹,而不自知,该过程可理解为“广撒网”;接着攻击者可以使用一款单独的点燃器apk,去引诱用户下载安装,去引爆手机中已被植入的代码炸弹,可理解为“多捞鱼”。