Apk协作攻击漏洞“炸弹引爆”详解

2015年07月23日 11:02 9070

       继BH系列上篇“Apk升级漏洞Upgrade DoS详解”,本文详细介绍Android另一系统安全漏洞 “炸弹引爆(Hide and Ignite)”的技术细节。

       本文已在BlackHat Mobile Security Summit London 2015大会上主讲,英文讲义可见https://www.blackhat.com/ldn-15/summit.html#what-can-you-do-to-an-apk-without-its-private-key-except-repacking。

1. Android证书验证机制

      首先,详细的Android证书验证机制,可见BH系列上篇“Shadows Everywhere漏洞浅析,影响全部安卓用户” 。

       本文将每个apk文件分为2个部分,定义为Android源文件和证书验证文件夹/META-INFO。Android源文件指除了/META-INFO文件夹以外的所有文件,包括执行文件classes.dex、配置文件AndroidManifest.xml、资源文件、动态库文件so等等。在/META-INFO文件夹中,首先是MANIFEST.MF,以BASE64编码存储着所有源文件的摘要值;接着是CERT.SF(或者是xx.SF),存储着MANIFEST.MF的摘要值以及所有源文件的摘要值的二次摘要值;最后是CERT.RSA(或者xx.DSA, xx.EC),存储着开发者证书以及用该证书对CERT.SF的数字签名。

       Android源文件有其对应的数字摘要保证其完整性,并且有对CERT.SF的数字签名来保证其不可篡改。但是/META-INFO文件夹中的内容没有采取任何的保护措施,我们只要不触碰CERT.RSA中的证书公钥,以及其中的CERT.SF数字签名部分(当然这二者也保证了CERT.SF不能篡改),就可以对该文件夹做任意的恶意代码插入,并且能够保证插入代码后的apk能够正常安装,运行,而且可以和旧版本升级兼容。接下来,我们可以在其它地方加载调用该隐藏代码,实现攻击行为。本文中我们对其取名“炸弹引爆”,先将恶意代码作为炸弹,隐藏在手机设备之中,然后再使用引爆器来点燃隐藏炸弹。

       在此,我们将介绍四个可以做完炸弹埋点的地方:“others”, “MANIFEST.MF”, “CERT.RSA”, 以及“CERT.SF.signature”,图中以橙色标记。

Apk协作攻击漏洞“炸弹引爆”详解-拒绝服务-阿里聚安全


2. “炸弹引爆”漏洞原理

       本节详细介绍4个炸弹埋点,以及可采用的引爆器方法。当然,可能存在更多的埋点以及更好的远程调用方法。

埋点一:others

       下面是节选自Android Lollipop 5.1.0的部分代码:

Apk协作攻击漏洞“炸弹引爆”详解-Shadow Everywhere-阿里聚安全

        该方法readMetaEntries()用于读取/META-INFO文件夹中的有效文件,在除开MANIFEST.MF文件之外,它使用后缀名来甄别有效文件。如果后缀名是 SF, DSA, RSA, EC,那么读取该文件;但是如果不是这些后缀名呢?Android什么都没做,该函数代码缺少一个else分支:

        else { 

                throw exception(“Unrecognized file exists!”); 

                return;

        } 

       我们可以将恶意代码作为一个新的文件插入在/META-INFO文件夹中,采用其它后缀名,或者不采用任何后缀。可以是一行代码,甚至,可以直接将dex文件或者另一个apk文件放在该文件夹下。

测试样例:

Apk协作攻击漏洞“炸弹引爆”详解-证书校验-阿里聚安全

埋点二:MANIFEST.MF

       节选自Android Lollipop 5.1.0的部分代码:

Apk协作攻击漏洞“炸弹引爆”详解-root-阿里聚安全

       在注释中提到,对于部分java 1.5之前的apk,Android会忽略到对MANIFEST.MF文件的摘要值的验证。对于这种情况,我们可以直接在MANIFEST.MF文件尾部增加任意我们想要的代码。经测试,国内主流的应用apk均可以采用这种埋弹方式,例如某信,某度等,应该是出于兼容性的考虑,可以兼容低版本Android。

       测试样例:

Apk协作攻击漏洞“炸弹引爆”详解-阿-阿里聚安全

埋点三:CERT.RSA

      节选自Android Lollipop 5.1.0的部分代码:

Apk协作攻击漏洞“炸弹引爆”详解-Apk升级-阿里聚安全        注释部分:该方法用来处理所有的关于PKCS7、ASN1编码、签名验证以及证书链构建等。CERT.RSA/DSA/EC正是采用的ASN1编码(本文以RSA为例),该方法的前3条语句(红色标记)正是提取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的末尾。 

测试样例:

Apk协作攻击漏洞“炸弹引爆”详解-拒绝服务-阿里聚安全

埋点四:CERT.SF.signature

       节选自Android Lollipop 5.1.0的部分代码:

Apk协作攻击漏洞“炸弹引爆”详解-Shadow Everywhere-阿里聚安全

       该方法用来验证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,去引诱用户下载安装,去引爆手机中已被植入的代码炸弹,可理解为“多捞鱼”。

更多可以做的:

除了使用单一的埋点,恶意代码可以打乱、分散后,插入多个炸弹埋点,然后在引爆器中将其重新组合。

恶意代码隐藏时可以采用加密模式,然后在点燃之前调用解密方法。

可以更好的隐藏自己,现有的大部分安全工具完全无法检测出来。


4. “炸弹引爆”漏洞危害

       任意恶意代码可以植入apk中,通过安装/升级带入你的手机。

在没有“点燃”之前,代码炸弹能够填满你的手机,静静地等待“点燃器”的点火。你永远不知道你的手机中到底有多少不为人知的恶意代码。

“炸弹”和“点燃器”,单独存在时,两者都完全无害,因而可以躲过大部分的安全工具检测;但当两者碰到一起时,所产生的巨大危害是无法估量的。

本文中提到的“恶意代码”,并不局限于具体的某一个或某一种木马病毒等,几乎可以囊括所有的恶意行为:隐私窃取、短信电话监听、密码账号盗取、网络钓鱼、远程执行、手机控制……


5. 防范措施

普通用户:

      - 在安全的应用市场进行应用下载,防止恶意应用对系统漏洞的利用。
      - 
对手机常作备份,若发生不能用等现象,可以通过安全备份进行恢复。
      - 
尽量不要ROOT自己的安卓手机,ROOT之后,软件权限过大,可以直接利用漏洞。
      - 
使用官方网站来升级系统应用。
      - 
阿里钱盾提供了专业的木马/病毒检测,可以通过静态检测,有效地发现隐藏在apk中的“炸弹”代码,在危险行为发生之前杜绝恶意代码

应用开发者:

- 为用户提供相对安全的升级通道。
       - 
运用阿里聚安全的服务,防止自有开发的应用的升级新版本被篡改,被仿冒!

除了以上这些,Shadow Everywhere的更多细节,更多利用方式,将于接下来数日一一进行公布,或可见https://www.blackhat.com/ldn-15/summit.html#what-can-you-do-to-an-apk-without-its-private-key-except-repacking

                                                                                                             作者:肖鹏


标签

  • 短信
  • 积分兑换
  • 仿冒应用
  • 漏洞分析
  • 漏洞预警
  • 年度报告
  • 安全报告
  • 病毒分析
  • 阿里聚安全
应用更安全,用户更放心! 立即登录