To build a better world !

          Bluebox Security最新提報(bào)Android漏洞的初步探討(及后續(xù)跟蹤分析)

          轉(zhuǎn)載請(qǐng)注明出處:http://www.aygfsteel.com/zh-weir/archive/2013/07/06/401270.html



          Bluebox Security最新提報(bào)Android漏洞的初步探討



              Bluebox Security在7月3號(hào)的時(shí)候,在官網(wǎng)上發(fā)布了一個(gè)據(jù)稱99% Android機(jī)器都有的一個(gè)漏洞。國(guó)內(nèi)最早在4號(hào)開始有媒體報(bào)道,并持續(xù)升溫。該漏洞可使攻擊者在不更改Android應(yīng)用程序的開發(fā)者簽名的情況下,對(duì)APK代碼進(jìn)行修改。并且,這個(gè)漏洞涉及到從1.6版本至今全部的Android版本,換句話說,這4年中生產(chǎn)的9億設(shè)備,即當(dāng)今市場(chǎng)上99%的Android產(chǎn)品都面臨這一問題。
           
              看到這樣的報(bào)道,一開始我和我的小伙伴們都不敢相信。因?yàn)楹灻麢C(jī)制用了這么多年,多少大腦袋厚眼鏡的天才們想要顛覆都沒搞定,Bluebox Security怎么可能搞定的呢?不過,由于好奇心驅(qū)使,我開始查看Bluebox Security官方的說法:《UNCOVERING ANDROID MASTER KEY THAT MAKES 99% OF DEVICES VULNERABLE》,我意識(shí)到,這個(gè)問題應(yīng)該不是簽名機(jī)制本身的問題,而是Android安裝APK過程中的校驗(yàn)存在漏洞。
           
              如果是APK安裝校驗(yàn)簽名的漏洞,而這個(gè)Bug又從1.6開始就有,那也太傷我自尊了。出于某種嗜好,俺怎么著也是從1.5起就對(duì)包管理充滿了濃厚興趣,2011年還寫了一篇《Android APK 簽名比對(duì)》的文章,里面對(duì)Android簽名機(jī)制做了稍詳細(xì)的解析。不過回過頭來一想,Google Android負(fù)責(zé)包管理的工程師估計(jì)更傷自尊了,當(dāng)然這是后話。
           
              在將信將疑的感情中,迎來了一個(gè)休息兩天的周末。于是我開始翻翻包管理的代碼,跟著APK安裝流程往下看。以前一直有個(gè)地方讓我覺得google工程師真的這么重視效率嗎?結(jié)果今天一看,發(fā)現(xiàn)好像存在問題。大家來評(píng)評(píng):

           
              安裝應(yīng)用的時(shí)候包管理檢查簽名不知檢查了多少次,在這里針對(duì)系統(tǒng)應(yīng)用卻只檢查manifest.xml一個(gè)文件的簽名。Google Android工程師真的是為了效率么?不管怎樣,他一定是深思熟慮之后的結(jié)果,因?yàn)檫@里有段注釋:“If this package comes from the system image, then we can trust it... we'll just use the AndroidManifest.xml to retrieve its signatures, not validating all of the files.”(所以如果真是這段代碼導(dǎo)致的漏洞,他真?zhèn)宰鹆?..)
           
              事實(shí)上,大多數(shù)時(shí)候安裝一個(gè)APK對(duì)于Android來說是一個(gè)復(fù)雜的過程,這個(gè)過程中Google為了安全做了很多冗余的事情。但是結(jié)合Bluebox Security的漏洞描述,我聯(lián)想到一種情況。那就是開機(jī)過程中掃描安裝/system/app中的應(yīng)用時(shí)!基于這個(gè)想法,我自己鼓搗了一會(huì)兒,發(fā)現(xiàn)按這個(gè)邏輯往下還真能繞過簽名認(rèn)證!當(dāng)然,還有一些令人掃興的附加操作,例如需要root權(quán)限以對(duì)/system/app下的文件進(jìn)行讀寫操作。
           
              這里我貼一下我的操作步驟吧。
            
              (先聲明:我所描述的不一定是Bluebox Security最近宣稱的漏洞,只是一種系統(tǒng)應(yīng)用修改代碼而繞過Android簽名校驗(yàn)的方法。Bluebox Security所描述的漏洞據(jù)官網(wǎng)消息稱,將由Bluebox的CTO Jeff Forristal,在本月27號(hào)到8月1號(hào)的拉斯維加斯美國(guó)黑帽安全大會(huì)上講話時(shí),公布具體的技術(shù)細(xì)節(jié)并放出相應(yīng)的工具和資料
           
          1、好吧,我以MIUI ROM中的系統(tǒng)應(yīng)用FileExplorer為例(切記這是99% Android手機(jī)都有的漏洞,MIUI是無辜的)。
           
          2、找一臺(tái)刷了MIUI的手機(jī),先將它從/system/app摳出來。(這個(gè)apk我們暫且稱作APK_ORG)
           
          3、使用apktool工具(或者其他類似工具)將FileExplorer.apk反編譯。apktool需要安裝MIUI的Framework資源包,詳查百度。
           
          4、修改smali代碼,想怎么改怎么改,這里我只是在onCreate的時(shí)候打印了一個(gè)Log。
           
          5、將smali及其他文件再打包成apk文件。(這個(gè)apk我們成為APK_DIST)
           
          (前面的步驟和一般破解的步驟都差不多, 后面就不一樣了。)
           
          6、將APK_ORG做zip包解壓,取出其中META-INF文件夾和AndroidManifest.xml文件。
           
          7、將尚未簽名的APK_DIST用WinRAR打開,將APK_ORG中取出的META-INF文件夾和AndroidManifest.xml文件拖入APK_DIST中。
           
          (OK,apk包做好了!)
           
          8、將APK_DIST命名為FileExplorer.apk(與手機(jī)中文件管理器名字相同)。
           
          9、adb push APK_DIST 到 /system/app/  下,覆蓋原來的APK_ORG。
           
          到此為止,大功告成了!如果系統(tǒng)沒有更新應(yīng)用,可以重啟一下手機(jī)。結(jié)果發(fā)現(xiàn)文件管理器安裝成功,自己添加的Log正常打印,之前在APK_ORG時(shí)登錄的網(wǎng)盤(快盤),數(shù)據(jù)都在且能正常使用。

            
          總結(jié):這段代碼應(yīng)該是從1.6之后就一直是這樣,因此符合Bluebox Security所說的99% Android手機(jī)都存在此漏洞。但是我現(xiàn)在發(fā)現(xiàn)的漏洞需要手動(dòng)root之后才能操作出來,且只針對(duì)system app,與Bluebox Security所描述的情況有所出入。也許是同一個(gè)漏洞,不同的操作方式,也許不是同一個(gè)漏洞,或者這個(gè)壓根不算漏洞。希望這篇文章起到拋磚引玉的作用,呼吁國(guó)內(nèi)Android安全人員和手機(jī)廠商一起加入探討~ (哦,對(duì)了,我直接把這個(gè)apk放到官方ROM中會(huì)怎么樣?文章發(fā)布后,再試試~ ^-^)

             
          關(guān)于ANDROID-8219321漏洞的后續(xù)補(bǔ)充說明。沒有后續(xù)補(bǔ)充說明,這篇文章是不完美的。因?yàn)閷?shí)際漏洞并不是上文分析的這個(gè)。
          具體后續(xù)跟蹤,之前只在看雪論壇上發(fā)布,沒有更新過來。為了本文的完整性。先將看雪上我發(fā)的后續(xù)跟蹤分析的帖子一起貼在這里。



          ★ 2013.07.08 (http://bbs.pediy.com/showthread.php?t=174928

          更新補(bǔ)充說明:

          目前已確認(rèn)本文所述問題與bluebox所說的漏洞不是同一個(gè)問題。大家可以繼續(xù)研究,但是與bluebox所稱的漏洞無關(guān)。

          bluebox所述漏洞編號(hào):ANDROID-8219321。

          Insertion of arbitrary code without changing package signature due to incorrect parsing of APKs (update to previous bulletin)
          First published: March 4th, 2013
          Last Updated: May 31st, 2013
          ID: ANDROID-8219321
          Severity: High
          Affected Android Versions: all

          由于可能涉及保密問題,更多信息在我確認(rèn)允許公布后才能公布。現(xiàn)在可以說的是,確實(shí)是對(duì)apk包進(jìn)行處理,無需操作權(quán)限。可能不是Google本身的問題,上傳應(yīng)用商店后下載即可直接安裝。我沒研究過這部分代碼,因?yàn)橐詾樗遣粫?huì)出問題的。。。

          最后想說,出問題的代碼就一句話。。。 



          ★ 2013.07.10 (http://bbs.pediy.com/showthread.php?t=175175

          這兩天這個(gè)問題基本已經(jīng)公之于眾了。所以不用再保密了。相關(guān)信息及自己研究的一些結(jié)果放上來,匯總一下。

          首先是3月和5月google官方發(fā)出的補(bǔ)丁說明:

          3月:

          Improper installation of unsigned code
          ID: ANDROID-8219321
          Severity: High
          Affected versions: Android 2.0 and greater

          An inconsistency in the handling of zip files during application installation may lead to the installation and execution of unsigned code in a privileged context.

          This issue will be publicly disclosed in 90 days. A CTS test will be included in the next CTS release.


          5月:

          Insertion of arbitrary code without changing package signature due to incorrect parsing of APKs (update to previous bulletin)
          First published: March 4th, 2013
          Last Updated: May 31st, 2013
          ID: ANDROID-8219321
          Severity: High
          Affected Android Versions: all

          Arbitrary code can be inserted into an APK and pass signature verification due to incorrect parsing of APKs. A maliciously crafted classes.dex can be inserted before a legitimately signed classes.dex in an APK. Signature verification will be performed on the second, legitimate classes.dex, but the first, malicious classes.dex is installed for application use. 

          Update: This issue will be publicly presented at Blackhat 2013. Please see http://www.blackhat.com/us-13/briefings.html#Forristal for more details. At that time, we expect active public exploitation of this issue outside of Google Play.


          官方補(bǔ)丁:patch.rar.



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


          當(dāng)然大家關(guān)注這個(gè)問題是在7月3號(hào)bluebox在官網(wǎng)發(fā)文以后。
          發(fā)文地址:http://bluebox.com/corporate-blog/bl...id-master-key/


          由于問題的嚴(yán)重性,一時(shí)間大家開始研究起來。漏洞基本公之于眾是在7號(hào)cyanogenmod打上補(bǔ)丁之后。
          詳見:http://review.cyanogenmod.org/#/c/45251/


          根據(jù)打補(bǔ)丁的代碼,大家推測(cè)到是apk中存在兩個(gè)相同的classes.dex文件。于是大家又開始研究POC的問題。我也自己做了嘗試,由于打包順序問題沒弄出來(失之毫厘,謬以千里啊~)。今天上班沒法弄,之后大家關(guān)注到了這個(gè)網(wǎng)址:
          https://gist.github.com/poliva/36b0795ab79ad6f14fd8


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


          到這本來應(yīng)該已經(jīng)完了。結(jié)果下午我網(wǎng)上下載了一個(gè)網(wǎng)易新聞Android客戶端按照上面網(wǎng)址的操作方法,卻怎么也安裝不上。我曾懷疑是我方法的問題,后來寫了一個(gè)簡(jiǎn)單的demo,發(fā)現(xiàn)通過這個(gè)方法又能成功安裝。


          這個(gè)方法是將原始apk數(shù)據(jù)全部壓縮進(jìn)修改后的未簽名的apk中,體積直接增大了一倍!網(wǎng)站上自己對(duì)這個(gè)方法的描述也是“Quick & dirty PoC for Android bug 8219321 discovered by BlueboxSec”。所以確實(shí)存在問題。


          經(jīng)過上述方法的啟發(fā),我明白之前的方法問題出在壓縮順序上。應(yīng)該是先壓縮修改后的dex文件,再壓縮原本的dex。


          于是,比較完善的方法是:


          1、將原本的apk中的文件解壓出來。分成兩個(gè)文件夾,orgin_dex和orgin_nodex。其中orgin_dex僅放解壓出來的classes.dex文件,orgin_nodex放剩余的所有文件。
          2、創(chuàng)建第三個(gè)文件夾dirty_dex,放修改之后編譯出的classes.dex文件。
          3、利用ant打包。build.xml如下:
          代碼:
          <?xml version="1.0" encoding="UTF-8"?> <project name="MyProject" default="dist" basedir="."> <zip destfile="evil.apk" duplicate="add">   <fileset dir="D:\\ant\\orgin_nodex\\"/>   <fileset dir="D:\\ant\\dirty_dex\\"/>   <fileset dir="D:\\ant\\orgin_dex\\"/> </zip> </project> 

          Linux下可使用這個(gè)shell腳本:weir.rar.


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

          最后上傳兩個(gè)按此方法制作的apk包。一個(gè)是網(wǎng)易新聞,一個(gè)是微信。在啟動(dòng)的時(shí)候彈出自定義的Toast信息。可以直接覆蓋官方應(yīng)用安裝。(用之前那個(gè)POC的方法我試了不能成功安裝)


          網(wǎng)易新聞下載    微信下載 



          轉(zhuǎn)載請(qǐng)注明出處:http://www.aygfsteel.com/zh-weir/archive/2013/07/06/401270.html
              


          posted on 2013-07-06 16:58 zh.weir 閱讀(5925) 評(píng)論(6)  編輯  收藏 所屬分類: Android框架研究Android軟件安全

          評(píng)論

          # re: Bluebox Security最新提報(bào)Android漏洞的初步探討 2013-08-15 19:24 lgwinner

          您好,很佩服您的破解思路,我也做了些破解實(shí)驗(yàn)
          詳細(xì)信息已經(jīng)發(fā)到了您的gmail郵箱。
          希望可以進(jìn)行有深度交流!  回復(fù)  更多評(píng)論   

          # re: Bluebox Security最新提報(bào)Android漏洞的初步探討[未登錄] 2013-08-17 12:41 jack

          博主可以寫的再詳細(xì)點(diǎn)嗎?
          首先從system/app下導(dǎo)出一個(gè)APK文件,經(jīng)過apktool反編譯后是沒有smali文件的。在網(wǎng)上查了下,需要將apk對(duì)應(yīng)的odex反編譯,生成smali。
          修改生成過的smali后再編譯生成classes.dex,如果此時(shí)直接將classes.dex放入導(dǎo)出的APK包中,再放到system/app下,重啟機(jī)器后,就無此應(yīng)用了,請(qǐng)博主詳細(xì)說下從odex-->smali-->classes.dex之后,再如何打包成APK。對(duì)這一步還不是特別清楚  回復(fù)  更多評(píng)論   

          # re: Bluebox Security最新提報(bào)Android漏洞的初步探討[未登錄] 2013-08-18 22:53 jack

          還發(fā)現(xiàn)一個(gè)問題 講system/app/Calendar.apk扣出來后按照樓主的說法,修改完之后重新覆蓋原來的apk,手機(jī)重啟后,系統(tǒng)中這個(gè)應(yīng)用就沒了!不知道什么原因,樓主可以給點(diǎn)建議嗎  回復(fù)  更多評(píng)論   

          # re: Bluebox Security最新提報(bào)Android漏洞的初步探討 2013-08-19 19:23 an0nym0us

          扯淡,這也叫漏洞?
          Google注釋里的代碼已經(jīng)寫得很清楚了,“If this package comes from the system image, then we can trust it”,在Android的安全體系中,system image本來就是受信任的。你用ROOT讀寫system image后,已經(jīng)直接破壞了Android的安全體系,這時(shí)再說能繞過人家的簽名驗(yàn)證,你確定這能叫做漏洞?
          好比在windows里面,你在administrator權(quán)限,關(guān)掉安全軟件,用一個(gè)驅(qū)動(dòng)干掉了安全軟件的簽名檢查,你認(rèn)為這叫做漏洞?
          ROOT讀寫system image有1000種方法繞過Android的簽名驗(yàn)證。  回復(fù)  更多評(píng)論   

          # re: Bluebox Security最新提報(bào)Android漏洞的初步探討 2013-08-29 14:24 sincere

          @lgwinner
          你們?cè)趺醋龅钠平獍。∏蠼?nbsp; 回復(fù)  更多評(píng)論   

          # re: Bluebox Security最新提報(bào)Android漏洞的初步探討(及后續(xù)跟蹤分析) 2014-10-23 11:09 764511389@qq.com

          我覺著吧,這不算漏洞
          既然你都root了,你破門而入,進(jìn)到房子里面了,人家只是沒鎖抽屜,被你拿戒指了。那也沒什么說的了。
          你無論怎么簽,只要替換原文件就好了(當(dāng)然直接adb install 是不行的)  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          公告

          大家好!歡迎光臨我的 Android 技術(shù)博客!



          本博客旨在交流與 Android 操作系統(tǒng)相關(guān)的各種技術(shù)及信息。

          博客內(nèi)的文章會(huì)盡量以開源的形式提供給大家,希望我們能相互交流,共同提高!

          有不足之處,請(qǐng)不吝賜教!

          我的郵箱:zh.weir@gmail.com
          我的新浪微博:@囧虎張建偉

           

          導(dǎo)航

          <2013年7月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          統(tǒng)計(jì)

          留言簿(19)

          隨筆分類(24)

          隨筆檔案(18)

          文章檔案(1)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 宁晋县| 邛崃市| 临西县| 睢宁县| 兴海县| 阿城市| 若尔盖县| 突泉县| 元氏县| 睢宁县| 建昌县| 英德市| 兴仁县| 津南区| 镶黄旗| 图木舒克市| 平湖市| 肇东市| 邢台县| 渭源县| 温宿县| 罗定市| 临沭县| 昆山市| 叙永县| 尉氏县| 内丘县| 建始县| 农安县| 宾阳县| 柏乡县| 广德县| 阿拉尔市| 六安市| 筠连县| 清水县| 乌拉特前旗| 威海市| 邛崃市| 洪江市| 华亭县|