每個Android應用程式都包含了數個元件,其中一個稱為AndroidManifest.xml或Manifest配置文件。這個檔案中包含了應用程式的基本資訊,是系統執行應用程式程式碼必須要有的資料。我們發現一個和此檔案相關的漏洞,可能會導致受影響手機陷入重新啟動的無限迴圈,讓手機變得無法使用。
Manifest資源配置文件漏洞
這個漏洞會透過兩種不同的方式導致作業系統崩潰。
第一種牽涉到超長字串和記憶體分配。一些應用程式可能會使用DTD技術(文件類型定義,Document Type Definition)在其XML檔中包含了超長字串。當此字串被分配給AndroidManifest.xml內的標籤(如權限名稱、label、活動(Activity)名稱)引用時,PackageParser會需要記憶體來解析這XML檔。然而,如果它需要的記憶體比可使用的還多時,PackageParser會崩潰。這會觸發連鎖反應,讓所有正在執行的服務停止,整個系統會因此重新開機。
第二種方法牽涉到APK檔和intent-filter,它用來宣告服務或活動(Activity)可以做的事情。如果Manifest資源配置文件內包含一個活動(Activity)帶有這此intent-filter定義,會在桌面建立一個圖示:
<intent-filter>
<action android:name=”android.intent.action.MAIN”/>
<category android:name=”android.intent.category.LAUNCHER”/>
</intent-filter>
如果有許多活動(Activity)用此intent-filter定義,在安裝後會建立相同數量的圖示在主畫面中。如果數量太多。這APK檔 就會導致重新開機迴圈。
如果活動(Activity)的數量大於10,000:
- 在Android 4.4上,桌面管理程序會進行重開機。
- 在Android L上,PackageParser會崩潰和重開機。不正常的APK檔會被安裝,但不會顯示圖示。
如果活動(Activity)的數量超過100,000,手機會陷入重新開機迴圈。
測試漏洞第一部份
我們建立一個Manifest資源配置文件內具備超長字串的APK檔(如圖1)。在安裝過程中,手機會重新開機(可在圖2中的logcat資訊看到)。
圖1、帶有DTD超長字串的AndroidManifest檔
圖2、作業系統崩潰並在安裝過程中重開機
我們已經測試和確認此特製的APK可以導致Android OS 4.4.4、Android OS L以及舊版本作業系統的崩潰。
測試漏洞第二部
我們還特製一個應用程式,其Manifest資源配置文件如圖3。可以讓Android手機出現重新開機迴圈。一旦安裝完成,手機就會變得反應遲緩及重新開機。使用者甚至無法移除APK檔或關閉手機。它會不停地重開機,直到手機電源用完。唯一的解決方法是重刷ROM或重新安裝作業系統。
圖3、具備100,000個圖示的AndroidManifest.xml
瞭解風險
雖然此漏洞在技術上來說並非安全上的危險,但是在功能上它的確讓手機陷入危險。此漏洞基本上可以讓手機無用化。受影響的手機只有在Android Debug Bridge(ADB) 被啟動或啟用時才能夠被拯救。唯一的解決辦法是將手機連到電腦上,將手機啟動在Fastboot模式並重刷ROM。不幸的是,這些動作只能由技術性很強的使用者進行,因為任何一個步驟錯誤都可能讓手機變磚。所以針對此一問題,我們建議使用者聯絡客戶服務(如果手機仍在保固期內)或信譽良好的維修商家。
我們已經將此問題通知Google。
@原文出物:Malformed AndroidManifest.xml in Apps Can Crash Mobile Devices作者:Simon Huang(行動安全工程師)