細數Android系統那些DOS漏洞
0x00 前言
Android系統存在一些漏洞可導致系統重啟,當然讓系統重啟只是一種現象,這些漏洞有的還可以許可權提升、執行程式碼等。本文以重啟這個現象為分類依據,牽強的把這些漏洞放在一塊來看。下面對這些漏洞的成因和本質進行簡單的分析,並儘量附上編譯好的poc和漏洞利用演示影片。
0x01 Nexus 5 <=4.4.2 本地dos
https://labs.mwrinfosecurity.com/advisories/2014/11/05/nexus-5-4-4-2-local-dos/ 漏洞概述:
Nexus 5預裝了一個隱藏的用來測試網路連通性的系統應用。在4.4.3之前的版本里,這個應用裡有大量匯出的activity,這些 activity不需要任何許可權就可以被外部呼叫。其中一個匯出的activity可以使手機遭受DOS攻擊,外部呼叫就可以讓手機直接重啟。
漏洞危害:
除了呼叫這個元件使系統重啟外,如果一個惡意應用註冊響應BOOT_COMPLETED廣播,並且傳送合適的intent給漏洞activity元件,那麼手機將會迴圈重啟。
漏洞詳情:
存在漏洞的應用包:com.lge.SprintHiddenMenu
存在漏洞的元件: com.lge.SprintHiddenMenu.sprintspec.SCRTN,該元件是匯出的,並且沒有做任何許可權限制。 透過如下命令即可使Nexus 5手機重啟:
#!bash
adb shell am start –n com.lge.SprintHiddenMenu/com.lge.SprintHiddenMenu.sprintspec.SCRTN
漏洞修復:
4.4.3及以上系統中對這個元件做了許可權限制,只有應用申請了com.lge.permission.SPRINTHIDDEN這個許可權才能調起com.lge.SprintHiddenMenu.sprintspec.SCRTN元件。
0x02 異常的AndroidManifest.xml引起的dos:
http://blog.trendmicro.com/trendlabs-security-intelligence/malformed-androidmanifest-xml-in-apps-can-crash-mobile-devices/
兩種方法:
strings.xml檔案中一些tag(如permission name,label,activity name)如果包含超長字串,當Package Parser去解析這個.XML檔案時需要申請大量記憶體,導致記憶體溢位,PackageParser crash。所有依賴PackageParser執行的服務都會停止,導致系統也會重啟一次。
下面是編譯好的一個poc應用,這個應用沒有申請任何許可權,也無惡意程式碼,只是在strings.xml的label tag中使用了超長字串。裝上之後執行就可使系統重啟。
雲盤下載地址:
http://yunpan.cn/cZK5pQRasVrAr (提取碼:f256)
如果一個apk檔案裡大量activity或者service包含下面特定的intent-filter,那麼應用安裝後會生成相同數量的icon.如果這樣的activity或service的數量超過10000,系統就會重啟,如果超過100000,裝置會迴圈重啟。
#!html
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
0x03 Nexus 6異常重啟
執行如下命令即可導致nexus6異常重啟。
#!bash
$ adb shell cat /d/pc_debug_counter
具體原因不詳,Twitter上有人講是因為arch/arm/mach-msm/msm-pm.c核心驅動檔案裡msm_pc_debug_counters_copy()裡呼叫的scnprintf()函式引起的。
scnprintf() API說明見1。作用是格式化一個字串並把它放在buffer裡,返回值是寫進buffer的字元數量。
在網上找到這個檔案的兩個版本,舊版本2如下:
漏洞可能是因為MSM_PC_NUM_COUNTERS 值等於4,而counter_name長度為3,迴圈中j最大取值為3,陣列下標越界,counter_name[j]取不到值導致的。
新的版本3如下,發現新檔案在迴圈中做了處理。
0x04 CVE-2014-7911
http://seclists.org/fulldisclosure/2014/Nov/51
漏洞概述:
Android < 5.0, java.io.ObjectInputStream 沒有校驗被反序列化的物件是否合法.
漏洞詳情:
java.io.ObjectInputStream不校驗被反序列化的物件的真實性,這就意味著攻擊者可以構造一個任意的序列化物件,這個物件的屬性值可以由攻擊者指定。然而這個惡意物件是無用的,最終會被GC回收,GC會呼叫物件的finalize方法。
Android裡system_service是以root許可權執行的,其他應用都可以透過Intent的方式和其通訊,可以傳遞一個Bundle物件給Intent,而Bundle裡可以放一個序列化物件,其他應用都可以以這種方式攻擊system_service。
android.os.BinderProxy類包含一個finalize方法,這個方法最終會呼叫native層的android_os_BinderProxy_destroy()4這個方法,可以看到這個方法裡會使用序列化物件裡的兩個欄位值,並把這兩個值傳給了指標。
如果攻擊者可以在system_server 的已知記憶體地址插入資料,那麼就可以執行任意程式碼。 Android有做地址空間隨機化ASLR,但是所有的app都是fork自zygote程式,他們都有相同的基本記憶體佈局,因此是可以繞過system_server的ASLR.
漏洞利用:
poc偽造了一個AAdroid.os.BinderProxy類物件,傳遞給system_server的jvm後觸發了GC回收,但是把其當成了android.os.BinderProxy,觸發了android_os_BinderProxy_destroy函式,獲得程式碼執行。
編譯好的poc:http://yunpan.cn/cZK5NuMJspXAc(提取碼:5962)
漏洞演示影片:http://v.youku.com/v_show/id_XOTE0MDgxODE2.html
0x05 CVE-2015-1474
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1474
漏洞概述:
Google Android platform/frameworks/native/libs/ui/GraphicBuffer.cpp中的GraphicBuffer::unflatten函式存在整數溢位錯誤,攻擊者透過傳遞超長檔案描述符或整數值,可使應用程式崩潰或執行任意程式碼。
受影響系統:
Google Android 5.0
漏洞危害:
遠端攻擊者利用漏洞可使應用程式拒絕服務或執行任意程式碼。
漏洞利用:
利用和CVE-2014-7911一樣,攻擊system_service。
漏洞修復:
Google已經發布patch,對numFds 和numInts的最大值進行了判斷和限制。
修復前:
https://android.googlesource.com/platform/frameworks/native/+/4aaa39358f538d8e06e026385bb8be8088d78c35/libs/ui/GraphicBuffer.cpp
修復後:
https://android.googlesource.com/platform/frameworks/native/+/38803268570f90e97452cd9a30ac831661829091/libs/ui/GraphicBuffer.cpp
如果有興趣,讀者也可以自行編譯AOSP程式碼進行patch,可以使用下面這個教程。 https://gist.github.com/Fuzion24/068fe36bb5b762367921
0x06 CVE-2014-0997 Android wifi直連dos漏洞
漏洞概述:
一些Android裝置,透過Wifi直連功能搜尋可直連的裝置過程,可以被DOS攻擊。攻擊者傳送一個精心構造的802.11協議的探測響應幀,存在漏洞的裝置在收到這個響應幀後不能正確處理畸形資料,導致系統重啟。
漏洞影響的裝置:
Nexus 5 - Android 4.4.4
Nexus 4 - Android 4.4.4
LG D806 - Android 4.2.2
Samsung SM-T310 - Android 4.2.2
Motorola RAZR HD-Android4.1.2
其他裝置也可能受影響。
漏洞細節:
Android使用了修改過的wpa_supplicant來提供無線驅動和Android platform framework之間的通訊介面。關於wpa_supplicant請參考:http://w1.fi/wpa_supplicant/
下面的函式用來處理wpa_supplicant events。這個函式最後透過呼叫NewStringUTF方法來返回一個jstring。 https://gitorious.org/android-eeepc/base/source/a0332f171e7413f79f156e8685d1147d89bfc5ca:core/jni/android_net_wifi_Wifi.cpp#L127
WiFi_Direct 規範裡定義了P2P的發現過程,使得P2P裝置間可以互相交換裝置資訊,device name是裝置資訊的一部分。 WifiP2pDevice類位於/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java5檔案,它的物件可以表示一個Wi-Fi p2p裝置。程式碼如下,可以看到它的建構函式是透過wpa_supplicant返回的string來初始化的,也就是剛才提到的android_net_wifi_waitForEvent()返回的值。如果這個值,也就是wpa_supplicant event是個異常值,那麼就會丟擲IllegalArgumentException。
一些Android裝置在處理探測響應幀時,如果WiFi-Direct(p2p)資訊元素裡包含device name屬性和一些特定的位元組生成的異常的supplicant event字串,那麼就會丟擲IllegalArgumentException。然而WiFiMonitor這個系統程式並沒有處理這個異常,導致裝置重啟。
Nexus 5上的部分logcat內容如下:
Poc:
檔案地址:http://downloads.securityfocus.com/vulnerabilities/exploits/72311.py
這個poc裡使用了兩個開源庫Lorcon6和PyLorcon27,其中PyLorcon2是對Lorcon的封裝。
這兩個庫可以獲取到無線網路卡的資訊,並且可以開啟monitor模式。透過指定無線通道、源和目標資訊來構造探測響應幀,最後響應給被攻擊裝置。被攻擊裝置收到畸形的響應資料,沒有處理異常,導致系統重啟。
下面是我們錄製的漏洞演示影片:
http://v.youku.com/v_show/id_XODgwNzk2Nzk2.html
0x07.總結: 以上漏洞成因總結大致如下: (1)沒有判斷資料型別的邊界值,導致溢位攻擊 (2)傳遞惡意payload (3)陣列下標越界 (4)許可權限制不嚴 (5)攻擊system_service
0x08 參考連結:
1 http://oss.org.cn/ossdocs/gnu_linux/kernel-api/r1980.html
2https://bot.bricked.de/showp1984/zarboz_m8wlv/raw/621cf6bec9f2b2fed94374c8cd949985a740dbbf/arch/arm/mach-msm/msm-pm.c
3https://github.com/dtsinc/DTS-Eagle-Integration_CAF-Android-kernel/blob/master/drivers/power/qcom/msm-pm.c
4https://code.google.com/p/android-source-browsing/source/browse/core/jni/android_util_Binder.cpp?repo=platform--frameworks--base&name=android-cts-4.2_r2
5https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
6 https://code.google.com/p/lorcon/
7https://code.google.com/p/pylorcon2/
相關文章
- Dos系統中未公開命令與引數2006-04-15
- Android Notes|細數「十大布局」那些事兒2020-12-07Android
- 那些蘋果、谷歌、微軟系統中的魔鬼細節2017-02-22蘋果谷歌微軟
- Dos系統的陳年往事2014-12-16
- Strandhogg漏洞:Android系統上的維京海盜2019-12-04HOGAndroid
- 獲取系統時間的DOS命令2017-07-08
- 在樹莓派上執行 DOS 系統2018-04-14樹莓派
- PHP multipart/form-data 遠端DOS漏洞2020-08-19PHPORM
- DOS命令新增, 刪除, 查詢系統環境變數(永久/臨時生效)2015-07-07變數
- DOS環境變數2020-11-04變數
- 細數Android開源專案中那些頻繁使用的併發庫中的類2015-09-09Android
- SourceFire:調查統計iOS漏洞數量遠超WP和Android2013-03-29iOSAndroid
- 細數 C++ 那些比起 C語言 更爽的特性2021-05-17C++C語言
- 最佳化ySQL系統變數詳細介紹2018-04-14SQL變數
- [譯] 細數那些我離不開的 Sketch 外掛2018-04-25
- 細數 Win 10 開發實現的那些牛逼功能2015-09-16
- NFT數字資產系統開發方案整理,功能細化2023-04-27
- 當前最佳的YOLOv4是如何煉成的?細數那些小細節2020-06-06YOLO
- 漏洞檢測的那些事兒2020-08-19
- 系統漏洞掃描工具Nessus2017-05-31
- xp_cmdshell---MSSQL系統漏洞2008-04-28SQL
- iOS 12.4系統遭黑客破解 漏洞危及數百萬使用者2019-08-21iOS黑客
- 週六:裝系統的那些事2015-04-25
- 電腦Windows2000|XP系統DOS命令大全2011-08-10Windows
- 裝扮Windows作業系統中的DOS命令提示(轉)2007-07-27Windows作業系統
- 【Android系統】Android系統架構簡介2018-11-04Android架構
- TheBestVPN:2019年漏洞最多作業系統是Android2020-03-09作業系統Android
- 向 wmware workstation pro 的 MS-DOS 作業系統中匯入檔案(masm debug edit)(詳細圖解)2017-12-26作業系統ASM圖解
- 通用漏洞評分系統 (CVSS)系統入門指南2022-11-24
- 比特幣軟體被曝DoS漏洞:開發者緊急修補2018-09-21比特幣
- Android系統架構-----Android的系統體系架構2013-10-26Android架構
- NFT數藏系統開發詳細(邏輯功能)NFT實物數藏模式系統開發流程(原始碼搭建)2023-02-22模式原始碼
- 避坑攻略:細數買雲伺服器的那些坑,如何避免?2021-10-26伺服器
- 那些用JavaScript寫的作業系統2014-01-28JavaScript作業系統
- 公司ERP系統重構那些事2013-08-19
- 抽獎系統細節玩法2021-12-30
- 漏洞管理系統建設淺議|企業漏洞庫建模要素2020-05-28
- Ruby 1.9 現 DoS 漏洞,緊急釋出1.9.3-p327版2012-11-12