細數Android系統那些DOS漏洞

wyzsk發表於2020-08-19
作者: Guardian · 2015/03/20 9:57

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()函式引起的。

enter image description here

scnprintf() API說明見1。作用是格式化一個字串並把它放在buffer裡,返回值是寫進buffer的字元數量。

在網上找到這個檔案的兩個版本,舊版本2如下:

enter image description here

漏洞可能是因為MSM_PC_NUM_COUNTERS 值等於4,而counter_name長度為3,迴圈中j最大取值為3,陣列下標越界,counter_name[j]取不到值導致的。

新的版本3如下,發現新檔案在迴圈中做了處理。

enter image description here

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這個方法,可以看到這個方法裡會使用序列化物件裡的兩個欄位值,並把這兩個值傳給了指標。

enter image description here

如果攻擊者可以在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

enter image description here

修復後:

https://android.googlesource.com/platform/frameworks/native/+/38803268570f90e97452cd9a30ac831661829091/libs/ui/GraphicBuffer.cpp

enter image description here

如果有興趣,讀者也可以自行編譯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

enter image description here

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。

enter image description here

一些Android裝置在處理探測響應幀時,如果WiFi-Direct(p2p)資訊元素裡包含device name屬性和一些特定的位元組生成的異常的supplicant event字串,那麼就會丟擲IllegalArgumentException。然而WiFiMonitor這個系統程式並沒有處理這個異常,導致裝置重啟。

Nexus 5上的部分logcat內容如下:

enter image description here

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/

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章