2018-12-24AndroidManifest.xml文件安全探索

最近在做一些apk的安全檢測(cè),對(duì)AndroidManifest.xml文件進(jìn)行了研究和探討,介紹AndroidManifest.xml文件的作用和架構(gòu),并研究了AndroidManifest.xml配置文件存在的一些漏洞,在進(jìn)行安全檢測(cè)時(shí),可以對(duì)癥下藥。

0X00 AndroidManifest.xml文件作用? ?

AndroidManifest.xml文件的作用非常重要,應(yīng)該說是缺一不可。在android官方介紹文檔中(https://developer.android.com/gu ... manifest-intro.html)是這樣定義的。每個(gè)應(yīng)用程序必須在其根目錄中具有一個(gè)AndroidManifest.xml(名字必須一樣)文件。Manifest文件提供有關(guān)應(yīng)用程序到Android系統(tǒng)的基本信息,系統(tǒng)必須具有該信息才能運(yùn)行任何應(yīng)用程序的代碼。換句話說APP是跑在Android系統(tǒng)上,既然要跑在其上,就必須提供信息給Android System,這些信息就存在AndroidManifest中。AndroidManifest.xml 存放在 app/src/main/目錄下。在反編譯APK文件后,其文件是以亂碼格式存在,需要進(jìn)行轉(zhuǎn)換才能正常查看。

0X01主要功能1.命名應(yīng)用程序Java包,軟件包名稱作為應(yīng)用程序的唯一標(biāo)識(shí)符

2.描述了應(yīng)用程序的組件,其中包括構(gòu)成應(yīng)用程序的活動(dòng),服務(wù),廣播接收器和內(nèi)容提供者;它還命名實(shí)現(xiàn)每個(gè)組件并發(fā)布其功能的類,例如Intent可以處理的消息。這些聲明通知Android系統(tǒng)的組件及其可以啟動(dòng)的條件。

3. 決定哪些processes主持application

4. 宣告這個(gè)App有哪些權(quán)限,它聲明應(yīng)用程序必須擁有的權(quán)限才能訪問API的受保護(hù)部分并與其他應(yīng)用程序交互。它還聲明其他人為了與應(yīng)用程序的組件交互而需要的權(quán)限

5.它列出了Instrumentation在應(yīng)用程序運(yùn)行時(shí)提供概要分析和其他信息的類。這些聲明僅在應(yīng)用程序正在開發(fā)中才會(huì)存在,并在應(yīng)用程序發(fā)布之前被刪除。

6.它聲明了應(yīng)用程序需要的最低級(jí)別的Android API。

7.它列出了應(yīng)用程序必須鏈接的庫(kù)。

0X02?Manifest架構(gòu)??

允許的元素,藍(lán)字是預(yù)設(shè)常見的元素,其中的與是必要且只能出現(xiàn)一次。每個(gè)元素有各自的屬性,屬性數(shù)量不一定,每個(gè)屬性有其默認(rèn)值,可視需求進(jìn)行設(shè)定。

1.預(yù)設(shè)的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

????package="com.example.bmi" 名稱空間

????android:versionCode="1"?? 開發(fā)者使用流水版號(hào)

????android:versionName="1.0" >? 供使用者看的版本號(hào)

????<uses-sdk

????????android:minSdkVersion="8" 最低兼容SDK版本

????????android:targetSdkVersion="21" /> 目標(biāo)版本,若沒設(shè)定預(yù)設(shè)為最低minSdkVersion

????<application

????????android:allowBackup="true" 是否允許備份

????????android:icon="@drawable/ic_launcher" App Icon

????????android:label="@string/app_name" App名稱

????????android:theme="@style/AppTheme" > App風(fēng)格

????????<activity activity, service, receiver, provider是組成application的4個(gè)主要項(xiàng)目

????????????android:name=".MainActivity" activity名稱,可和manifest package串在一起

????????????android:label="@string/app_name" > APP開啟后,顯示在畫面上方的名稱

????????????<intent-filter> activity操作方式

????????????????<action android:name="android.intent.action.MAIN" /> .MAIN表示activity是APP進(jìn)入點(diǎn)

????????????????<category android:name="android.intent.category.LAUNCHER" /> 顯示在應(yīng)用程序行表

????????????</intent-filter>

????????</activity>

????</application>

</manifest>

2.標(biāo)準(zhǔn)的AndroidManifest.xml文件樣例。

<?xml version="1.0" encoding="utf-8"?>??

<manifest>???

????<!-- 基本配置 -->?

????<uses-permission />?

????<permission />?

????<permission-tree />?

????<permission-group />?

????<instrumentation />?

????<uses-sdk />?

????<uses-configuration />?

????<uses-feature />?

????<supports-screens />?

????<compatible-screens />?

????<supports-gl-texture />???????

????<!-- 應(yīng)用配置 -->?

????<application>???????????

????????<!-- Activity 配置 -->?

????????<activity>?

????????????<intent-filter>?

????????????????<action />?

????????????????<category />?

????????????????<data />?

????????????</intent-filter>?

????????????<meta-data />?

????????</activity>???????????

????????<activity-alias>?

????????????<intent-filter> . . . </intent-filter>?

????????????<meta-data />?

????????</activity-alias>?

???????????<!-- Service 配置 -->?

????????<service>?

????????????<intent-filter> . . . </intent-filter>?

????????????<meta-data/>?

????????</service>?

????????<!-- Receiver 配置 -->?

????????<receiver>?

????????????<intent-filter> . . . </intent-filter>?

????????????<meta-data />?

????????</receiver>???????????

????????<!-- Provider 配置 -->?

????????<provider>?

????????????<grant-uri-permission />?

????????????<meta-data />?

????????</provider>???????????

????????<!-- 所需類庫(kù)配置 -->?

????????<uses-library />???

????</application>?

??</manifest>

0x03文件約定及語法從上面的代碼中,我們可以看出Android配置文件采用XML作為描述語言,每個(gè)XML標(biāo)簽都不同的含義,大部分的配置參數(shù)都放在標(biāo)簽的屬性中,下面我們便按照以上配置文件樣例中的先后順序來學(xué)習(xí)Android配置文件中主要元素與標(biāo)簽的用法。

1.元素(Elements)

在所有的元素中只有和<application>是必需的,它們各自必須存在,且只能出現(xiàn)一次。如果一個(gè)元素包含有其他子元素,必須通過子元素的屬性來設(shè)置其值。處于同一層次的元素,這些元素的說明是沒有順序的。例如<activity>,<provider>和<service>元素可以以任何順序混合。這個(gè)規(guī)則有兩個(gè)關(guān)鍵的例外:

l一個(gè)元素必須遵循?<activity>它是一個(gè)別名。

l 元素必須是里面的最后一個(gè)元素?<manifest>?的元素。換句話說</application>結(jié)束標(biāo)簽必須在</manifest>結(jié)束標(biāo)簽之前立即出現(xiàn)。

2.屬性

正常來講,所有的屬性都是可選的,但是有些屬性是必須設(shè)置的。以便元素可以實(shí)現(xiàn)其目的,除了根元素的屬性之外,所有其他元素屬性的名字都是以android:前綴的;

定義類名:所有的元素名都對(duì)應(yīng)其在SDK中的類名,如果你自己定義類名,必須包含類的數(shù)據(jù)包名,如果類與application處于同一數(shù)據(jù)包中,可以直接簡(jiǎn)寫為“.”;

3.聲明類名

許多元素對(duì)應(yīng)于Java對(duì)象,包括應(yīng)用程序本身(<application>元素)的元素及其主要組件:活動(dòng)(<activity>),服務(wù)<service>),廣播接收器(<receiver>)和內(nèi)容提供者(<provider>))。

如果你定義一個(gè)子類,如同你總是會(huì)為組件類(Activity,Service,?BroadcastReceiver和ContentProvider)子類是通過name屬性來聲明,該名稱必須包括完整的包裝名稱。例如,一個(gè)Service子類可能被聲明如下:

<manifest . . . >

? ? <application . . . >

? ?? ???<service android:name="com.example.project.SecretService" . . . >

? ?? ?? ?? ?. . .

? ?? ???</service>

? ?? ???. . .

? ? </application>

</manifest>? ?? ?

4.多個(gè)值

如果某個(gè)元素有超過一個(gè)數(shù)值,這個(gè)元素必須通過重復(fù)的方式來說明其某個(gè)屬性具有多個(gè)數(shù)值項(xiàng),且不能將多個(gè)數(shù)值項(xiàng)一次性說明在一個(gè)屬性中;例如一個(gè)intent-filter 可以保護(hù)多個(gè)action:

<intent-filter . . . >

? ? <action android:name="android.intent.action.EDIT" />

? ? <action android:name="android.intent.action.INSERT" />

? ? <action android:name="android.intent.action.DELETE" />

? ? . . .

</intent-filter>

5.資源值

某些屬性具有可顯示給用戶的值,例如一個(gè)活動(dòng)的標(biāo)簽和圖標(biāo)。這些屬性的值應(yīng)該從資源或主題進(jìn)行本地化和設(shè)置。資源值以下列格式表示:

@[package:]type/name

如果資源與應(yīng)用程序在同一個(gè)軟件包中,則可以省略軟件包名稱。該類型是一種資源,例如字符串或可畫的對(duì)象,名稱是特定資源的標(biāo)識(shí)名稱。例如:

<activity android:icon="@drawable/smallPic" . . . >

主題的值使用類似地表達(dá),但以初始值“??”代替“@”:

?[package:]type/name

注意:資源或主題包的值必須是“android”或應(yīng)用程序包的名稱。

6.字符串值

在屬性值為字符串的地方,必須使用雙反斜杠(\\)來轉(zhuǎn)義字符,例如\\n換行符或\\uxxxx?表示Unicode字符。

7.意圖過濾器

應(yīng)用程序的核心組件,如活動(dòng),服務(wù)和廣播接收器由意圖(Intent)激活。意圖是Intent描述所需動(dòng)作的一組信息(對(duì)象),包括要執(zhí)行的數(shù)據(jù),應(yīng)該執(zhí)行該操作的組件的類別以及其他相關(guān)指令。Android系統(tǒng)找到一個(gè)可以響應(yīng)意圖的適當(dāng)組件,如果需要,則啟動(dòng)組件的新實(shí)例,并將其傳遞給?Intent對(duì)象。

組件通過意圖過濾器通知他們可以響應(yīng)的意圖類型。由于Android系統(tǒng)必須了解組件在啟動(dòng)組件之前可以處理的意圖,因此在清單中將intent過濾器指定為?<intent-filter>?元素。組件可以具有任意數(shù)量的過濾器,每個(gè)過濾器描述不同的功能。顯式命名目標(biāo)組件的意圖激活該組件,因此過濾器不起作用。沒有通過名稱指定目標(biāo)的意圖可以僅在組件可以通過組件的過濾器之一時(shí)激活組件。

8.圖標(biāo)和標(biāo)簽

許多元素都有圖標(biāo)和標(biāo)簽屬性,可以向用戶顯示一個(gè)小圖標(biāo)和文本。一些還有一個(gè)更長(zhǎng)的描述屬性,也可以在屏幕上顯示。例如,該元素具有所有這三個(gè)屬性,以便當(dāng)詢問用戶是否授予已請(qǐng)求它的應(yīng)用程序的權(quán)限時(shí),一個(gè)圖標(biāo)代表權(quán)限,許可的名稱以及它所需要的描述都會(huì)呈現(xiàn)給用戶。

在每種情況下,在包含元素中設(shè)置的圖標(biāo)和標(biāo)簽將成為所有容器的子元素的默認(rèn)值icon和label設(shè)置。因此,?<application>元素中設(shè)置的圖標(biāo)和標(biāo)簽是每個(gè)應(yīng)用程序組件的默認(rèn)圖標(biāo)和標(biāo)簽。類似地,為組件(如<activity>?元素)設(shè)置的圖標(biāo)和標(biāo)簽是每個(gè)組件<intent-filter>?元素的默認(rèn)設(shè)置 。如果一個(gè)?<application>?元素設(shè)置了一個(gè)標(biāo)簽,但是一個(gè)活動(dòng)和它的意圖過濾器沒有,應(yīng)用程序標(biāo)簽將被視為活動(dòng)和意圖過濾器的標(biāo)簽。

為意圖過濾器設(shè)置的圖標(biāo)和標(biāo)簽表示當(dāng)組件呈現(xiàn)給用戶并滿足由過濾器發(fā)布的功能時(shí)的組件。例如,帶有android.intent.action.MAIN和?android.intent.category.LAUNCHER設(shè)置的過濾器將活動(dòng)通告為啟動(dòng)應(yīng)用程序的活動(dòng)。也就是說,應(yīng)該在應(yīng)用程序啟動(dòng)器中顯示。在過濾器中設(shè)置的圖標(biāo)和標(biāo)簽顯示在啟動(dòng)器中。

9.權(quán)限

權(quán)限是限制的代碼的一部分,或者在設(shè)備上的數(shù)據(jù)的訪問的限制。限制是為了保護(hù)可能被誤用以扭曲或損壞用戶體驗(yàn)的關(guān)鍵數(shù)據(jù)和代碼。

每個(gè)權(quán)限都由唯一標(biāo)簽標(biāo)識(shí)。標(biāo)簽通常表示限制的動(dòng)作。以下是Android定義的一些權(quán)限:

android.permission.CALL_EMERGENCY_NUMBERS

android.permission.READ_OWNER_DATA

android.permission.SET_WALLPAPER

android.permission.DEVICE_POWER

功能只能通過一個(gè)權(quán)限來保護(hù)。如果應(yīng)用程序需要訪問受權(quán)限保護(hù)的功能,則它必須聲明它需要使用 清單中的元素的權(quán)限 。當(dāng)應(yīng)用程序安裝在設(shè)備上時(shí),安裝程??序?qū)⑼ㄟ^檢查簽署應(yīng)用程序證書的機(jī)構(gòu)以及在某些情況下詢問用戶來確定是否授予所請(qǐng)求的權(quán)限。如果許可被授予,應(yīng)用程序就可以使用受保護(hù)的功能。如果沒有,則嘗試訪問這些功能失敗,而不通知用戶。

應(yīng)用程序也可以通過權(quán)限保護(hù)自己的組件。它可以使用由Android定義的任何權(quán)限,如android.Manifest.permission由其他應(yīng)用程序列出 或聲明的。它也可以自己定義。<permission>?元素聲明了新的權(quán)限 。例如,活動(dòng)可以如下保護(hù):

<manifest . . . >

? ? <permission android:name="com.example.project.DEBIT_ACCT" . . . />

? ? <uses-permission android:name="com.example.project.DEBIT_ACCT" />

? ? . . .

? ? <application . . .>

? ?? ???<activity android:name="com.example.project.FreneticActivity"

? ?? ?? ?? ?? ?? ?android:permission="com.example.project.DEBIT_ACCT"

? ?? ?? ?? ?? ?? ?. . . >

? ?? ?? ?? ?. . .

? ?? ???</activity>

? ? </application>

</manifest>? ?

請(qǐng)注意,在這個(gè)例子中,DEBIT_ACCT權(quán)限不僅僅是使用<permission>?元素來聲明的 ,所以它也使用了?<uses-permission>?元素。為了啟動(dòng)受保護(hù)的活動(dòng),您必須要求使用該應(yīng)用程序的其他組件,即使應(yīng)用程序本身也施加了保護(hù)。

0x04權(quán)限屬性值意義ACCESS_CHECKIN_PROPERTIES:允許對(duì)checkin數(shù)據(jù)庫(kù)中的表“properties”進(jìn)行讀/寫訪問,以更改上傳的值。

ACCESS_COARSE_LOCATION:允許應(yīng)用訪問大概位置。

ACCESS_FINE_LOCATION:允許應(yīng)用訪問精確位置。

ACCESS_LOCATION_EXTRA_COMMANDS:允許應(yīng)用程序訪問額外的位置提供程序命令。

ACCESS_NETWORK_STATE:允許應(yīng)用程序訪問有關(guān)網(wǎng)絡(luò)的信息。

ACCESS_NOTIFICATION_POLICY:希望訪問通知政策的應(yīng)用程序的標(biāo)記權(quán)限。

ACCESS_WIFI_STATE:允許應(yīng)用程序訪問有關(guān)Wi-Fi網(wǎng)絡(luò)的信息。

ACCOUNT_MANAGER:允許應(yīng)用程序調(diào)用AccountAuthenticator。

ADD_VOICEMAIL:允許應(yīng)用程序?qū)⒄Z音郵件添加到系統(tǒng)中。

ANSWER_PHONE_CALLS:允許應(yīng)用接聽來電。

BATTERY_STATS:允許應(yīng)用程序收集電池統(tǒng)計(jì)信息

BIND_ACCESSIBILITY_SERVICE:必須由a要求AccessibilityService,以確保只有系統(tǒng)可以綁定到它。

BIND_APPWIDGET:允許應(yīng)用程序告訴AppWidget服務(wù)哪個(gè)應(yīng)用程序可以訪問AppWidget的數(shù)據(jù)。

BIND_AUTOFILL_SERVICE:必須由a要求AutofillService,以確保只有系統(tǒng)可以綁定到它。

BIND_CARRIER_MESSAGING_SERVICE:這個(gè)常量是在API層面棄用23. BIND_CARRIER_SERVICES代替

BIND_CARRIER_SERVICES:允許綁定到運(yùn)營(yíng)商應(yīng)用程序中的服務(wù)的系統(tǒng)進(jìn)程將具有此權(quán)限。

BIND_CHOOSER_TARGET_SERVICE:必須由a要求ChooserTargetService,以確保只有系統(tǒng)可以綁定到它。

BIND_CONDITION_PROVIDER_SERVICE:必須由a要求ConditionProviderService,以確保只有系統(tǒng)可以綁定到它。

BIND_DEVICE_ADMIN:必須由設(shè)備管理接收器要求,以確保只有系統(tǒng)可以與其進(jìn)行交互。

BIND_DREAM_SERVICE:必須由a要求DreamService,以確保只有系統(tǒng)可以綁定到它。

BIND_INCALL_SERVICE:必須由a要求InCallService,以確保只有系統(tǒng)可以綁定到它。

BIND_INPUT_METHOD:必須由a要求InputMethodService,以確保只有系統(tǒng)可以綁定到它。

BIND_MIDI_DEVICE_SERVICE:必須由a要求MidiDeviceService,以確保只有系統(tǒng)可以綁定到它。

BIND_NFC_SERVICE:必須要求HostApduService或OffHostApduService確保只有系統(tǒng)可以綁定到它。

BIND_NOTIFICATION_LISTENER_SERVICE:必須由a要求NotificationListenerService,以確保只有系統(tǒng)可以綁定到它。

BIND_PRINT_SERVICE:必須由a要求PrintService,以確保只有系統(tǒng)可以綁定到它。

BIND_QUICK_SETTINGS_TILE:允許應(yīng)用程序綁定到第三方快速設(shè)置圖塊。

BIND_REMOTEVIEWS:必須由a要求RemoteViewsService,以確保只有系統(tǒng)可以綁定到它。

BIND_SCREENING_SERVICE:必須由a要求CallScreeningService,以確保只有系統(tǒng)可以綁定到它。

BIND_TELECOM_CONNECTION_SERVICE:必須由a要求ConnectionService,以確保只有系統(tǒng)可以綁定到它。

BIND_TEXT_SERVICE:必須由TextService要求

BIND_TV_INPUT:必須通過a TvInputService來確保只有系統(tǒng)可以綁定它。

BIND_VISUAL_VOICEMAIL_SERVICE:鏈接必須要求,VisualVoicemailService以確保只有系統(tǒng)可以綁定到它。

BIND_VOICE_INTERACTION:必須由a要求VoiceInteractionService,以確保只有系統(tǒng)可以綁定到它。

BIND_VPN_SERVICE:必須由a要求VpnService,以確保只有系統(tǒng)可以綁定到它。

BIND_VR_LISTENER_SERVICE:必須由a要求VrListenerService,以確保只有系統(tǒng)可以綁定到它。

BIND_WALLPAPER:必須由a要求WallpaperService,以確保只有系統(tǒng)可以綁定到它。

BLUETOOTH:允許應(yīng)用程序連接到配對(duì)的藍(lán)牙設(shè)備。

BLUETOOTH_ADMIN:允許應(yīng)用程序發(fā)現(xiàn)和配對(duì)藍(lán)牙設(shè)備。

BLUETOOTH_PRIVILEGED:允許應(yīng)用程序在沒有用戶交互的情況下配對(duì)藍(lán)牙設(shè)備,并允許或禁止電話簿訪問或消息訪問。

BODY_SENSORS:允許應(yīng)用程序訪問用戶用來衡量身體內(nèi)發(fā)生的情況的傳感器的數(shù)據(jù),例如心率。

BROADCAST_PACKAGE_REMOVED:允許應(yīng)用程序廣播應(yīng)用程序包已被刪除的通知。

BROADCAST_SMS:允許應(yīng)用程序廣播短信收據(jù)通知。

BROADCAST_STICKY:允許應(yīng)用程序廣播粘性意圖。

BROADCAST_WAP_PUSH:允許應(yīng)用程序廣播WAP PUSH收據(jù)通知。

CALL_PHONE:允許應(yīng)用程序發(fā)起電話而不通過撥號(hào)器用戶界面供用戶確認(rèn)通話。

CALL_PRIVILEGED:允許應(yīng)用程序呼叫任何電話號(hào)碼,包括緊急號(hào)碼,而無需通過Dialer用戶界面,用戶確認(rèn)呼叫正在被放置。

CAMERA:需要能夠訪問相機(jī)設(shè)備。

CAPTURE_AUDIO_OUTPUT:允許應(yīng)用程序捕獲音頻輸出。

CAPTURE_SECURE_VIDEO_OUTPUT:允許應(yīng)用程序捕獲安全視頻輸出。

CAPTURE_VIDEO_OUTPUT:允許應(yīng)用程序捕獲視頻輸出。

CHANGE_COMPONENT_ENABLED_STATE:允許應(yīng)用程序更改應(yīng)用程序組件(不是自己的)是否啟用。

CHANGE_CONFIGURATION:允許應(yīng)用程序修改當(dāng)前配置,如區(qū)域設(shè)置。

CHANGE_NETWORK_STATE:允許應(yīng)用程序更改網(wǎng)絡(luò)連接狀態(tài)。

CHANGE_WIFI_MULTICAST_STATE:允許應(yīng)用程序進(jìn)入Wi-Fi組播模式。

CHANGE_WIFI_STATE:允許應(yīng)用程序更改Wi-Fi連接狀態(tài)。

CLEAR_APP_CACHE:允許應(yīng)用程序清除設(shè)備上所有已安裝應(yīng)用程序的緩存。

CONTROL_LOCATION_UPDATES:允許啟用/禁用收音機(jī)的位置更新通知。

DELETE_CACHE_FILES:允許應(yīng)用程序刪除緩存文件。

DELETE_PACKAGES:允許應(yīng)用程序刪除軟件包。

DIAGNOSTIC:允許應(yīng)用程序RW到診斷資源。

DISABLE_KEYGUARD:允許應(yīng)用程序禁用鍵盤保護(hù)程序,如果它不安全。

DUMP:允許應(yīng)用程序從系統(tǒng)服務(wù)檢索狀態(tài)轉(zhuǎn)儲(chǔ)信息。

EXPAND_STATUS_BAR:允許應(yīng)用程序展開或折疊狀態(tài)欄。

FACTORY_TEST:作為制造商測(cè)試應(yīng)用程序運(yùn)行,以root用戶身份運(yùn)行。

GET_ACCOUNTS:允許訪問帳戶服務(wù)中的帳戶列表。

GET_ACCOUNTS_PRIVILEGED:允許訪問帳戶服務(wù)中的帳戶列表。

GET_PACKAGE_SIZE:允許應(yīng)用程序找出任何包使用的空間。

GET_TASKS:這個(gè)常數(shù)在API級(jí)別21中已被棄用。不再?gòu)?qiáng)制執(zhí)行。

GLOBAL_SEARCH:該權(quán)限可用于內(nèi)容提供商,以允許全局搜索系統(tǒng)訪問其數(shù)據(jù)。

INSTALL_LOCATION_PROVIDER:允許應(yīng)用程序?qū)⑽恢锰峁┏绦虬惭b到位置管理器中。

INSTALL_PACKAGES:允許應(yīng)用程序安裝軟件包。

INSTALL_SHORTCUT:允許應(yīng)用程序在Launcher中安裝快捷方式。

INSTANT_APP_FOREGROUND_SERVICE:允許即時(shí)應(yīng)用創(chuàng)建前臺(tái)服務(wù)。

INTERNET:允許應(yīng)用程序打開網(wǎng)絡(luò)套接字。

KILL_BACKGROUND_PROCESSES:允許應(yīng)用程序調(diào)用killBackgroundProcesses(String)。

LOCATION_HARDWARE:允許應(yīng)用程序在硬件中使用位置功能,例如geofencing api。

MANAGE_DOCUMENTS:允許應(yīng)用程序管理對(duì)文檔的訪問,通常是文檔選擇器的一部分。

MANAGE_OWN_CALLS:允許通過自我管理的ConnectionServiceAPI管理自己的呼叫的呼叫應(yīng)用程序 。

MASTER_CLEAR:不適用于第三方應(yīng)用程序。

MEDIA_CONTENT_CONTROL:允許應(yīng)用程序知道正在播放哪些內(nèi)容并控制其播放。

MODIFY_AUDIO_SETTINGS:允許應(yīng)用程序修改全局音頻設(shè)置。

MODIFY_PHONE_STATE:允許修改電話狀態(tài)-開機(jī),mmi等

MOUNT_FORMAT_FILESYSTEMS:允許將文件系統(tǒng)格式化為可移動(dòng)存儲(chǔ)。

MOUNT_UNMOUNT_FILESYSTEMS:允許安裝和卸載文件系統(tǒng)以進(jìn)行可移動(dòng)存儲(chǔ)。

NFC:允許應(yīng)用程序通過NFC執(zhí)行I / O操作。

PACKAGE_USAGE_STATS:允許應(yīng)用程序收集組件使用統(tǒng)計(jì)信息,聲明權(quán)限意味著使用API??,設(shè)備的用戶可以通過“設(shè)置”應(yīng)用程序授予權(quán)限。

PERSISTENT_ACTIVITY:此常數(shù)在API級(jí)別9中已被棄用。此功能將在以后刪除;?請(qǐng)不要使用。允許應(yīng)用程序使其活動(dòng)持續(xù)。

PROCESS_OUTGOING_CALLS:允許應(yīng)用程序在呼出期間查看正在撥打的電話號(hào)碼,并選擇將呼叫重定向到其他號(hào)碼或完全中止呼叫。

READ_CALENDAR:允許應(yīng)用程序讀取用戶的日歷數(shù)據(jù)。

READ_CALL_LOG:允許應(yīng)用程序讀取用戶的通話記錄。

READ_CONTACTS:允許應(yīng)用程序讀取用戶的聯(lián)系人數(shù)據(jù)。

READ_EXTERNAL_STORAGE:允許應(yīng)用程序從外部存儲(chǔ)器讀取。

READ_FRAME_BUFFER:允許應(yīng)用程序進(jìn)行屏幕截圖,更一般地,可以訪問幀緩沖區(qū)數(shù)據(jù)。

READ_INPUT_STATE:此常數(shù)在API級(jí)別16中已被棄用。使用此權(quán)限的API已被刪除。

READ_LOGS:允許應(yīng)用程序讀取低級(jí)別的系統(tǒng)日志文件。

READ_PHONE_NUMBERS:允許讀取設(shè)備的電話號(hào)碼。

READ_PHONE_STATE:允許只讀訪問電話狀態(tài),包括設(shè)備的電話號(hào)碼,當(dāng)前的蜂窩網(wǎng)絡(luò)信息,任何正在進(jìn)行的呼叫的狀態(tài)以及PhoneAccount在設(shè)備上注冊(cè)的任何列表 。

READ_SMS:允許應(yīng)用程序讀取短信。

READ_SYNC_SETTINGS:允許應(yīng)用程序讀取同步設(shè)置。

READ_SYNC_STATS:允許應(yīng)用程序讀取同步統(tǒng)計(jì)信息。

READ_VOICEMAIL:允許應(yīng)用程序讀取系統(tǒng)中的語音信箱。

REBOOT:需要重新啟動(dòng)設(shè)備。

RECEIVE_BOOT_COMPLETED:允許應(yīng)用程序收到ACTION_BOOT_COMPLETED在系統(tǒng)完成啟動(dòng)后廣播的應(yīng)用程序 。

RECEIVE_MMS:允許應(yīng)用程序監(jiān)視傳入的彩信。

RECEIVE_SMS:允許應(yīng)用程序接收短信。

RECEIVE_WAP_PUSH:允許應(yīng)用程序接收WAP推送消息。

RECORD_AUDIO:允許應(yīng)用程序錄制音頻。

REORDER_TASKS:允許應(yīng)用程序更改任務(wù)的Z順序。

REQUEST_COMPANION_RUN_IN_BACKGROUND:允許隨播應(yīng)用在后臺(tái)運(yùn)行。REQUEST_COMPANION_USE_DATA_IN_BACKGROUND:允許隨播應(yīng)用在后臺(tái)使用數(shù)據(jù)。

REQUEST_DELETE_PACKAGES:允許應(yīng)用程序請(qǐng)求刪除包。

REQUEST_IGNORE_BATTERY_OPTIMIZATIONS:許可申請(qǐng)必須持有才能使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。

REQUEST_INSTALL_PACKAGES:允許應(yīng)用程序請(qǐng)求安裝軟件包。

RESTART_PACKAGES:此常數(shù)在API級(jí)別8中已棄用restartPackage(String)?。不再支持API。

SEND_RESPOND_VIA_MESSAGE:允許應(yīng)用程序(電話)向其他應(yīng)用程序發(fā)送請(qǐng)求,以處理來電期間的響應(yīng)通過消息動(dòng)作。

SEND_SMS:允許應(yīng)用程序發(fā)送短信。

SET_ALARM:允許應(yīng)用程序廣播Intent為用戶設(shè)置鬧鐘。

SET_ALWAYS_FINISH:允許應(yīng)用程序控制是否在后臺(tái)放置活動(dòng)時(shí)立即完成。

SET_ANIMATION_SCALE:修改全局動(dòng)畫縮放因子。

SET_DEBUG_APP:配置應(yīng)用程序進(jìn)行調(diào)試。

SET_PREFERRED_APPLICATIONS:這個(gè)常數(shù)在API級(jí)別7中已被棄用。不再有用,?addPackageToPreferred(String)?有關(guān)詳細(xì)信息。

SET_PROCESS_LIMIT:允許應(yīng)用程序設(shè)置可以運(yùn)行的最大數(shù)量(不需要的)應(yīng)用程序進(jìn)程。

SET_TIME:允許應(yīng)用程序設(shè)置系統(tǒng)時(shí)間。

SET_TIME_ZONE:允許應(yīng)用程序設(shè)置系統(tǒng)時(shí)區(qū)。

SET_WALLPAPER:允許應(yīng)用設(shè)置壁紙。

SET_WALLPAPER_HINTS:允許應(yīng)用程序設(shè)置壁紙?zhí)崾?。SIGNAL_PERSISTENT_PROCESSES:允許應(yīng)用程序請(qǐng)求將信號(hào)發(fā)送到所有持久進(jìn)程。

STATUS_BAR:允許應(yīng)用程序打開,關(guān)閉或禁用狀態(tài)欄及其圖標(biāo)。

SYSTEM_ALERT_WINDOW:允許應(yīng)用使用類型創(chuàng)建窗口TYPE_APPLICATION_OVERLAY,顯示在所有其他應(yīng)用程序的頂部。

TRANSMIT_IR:允許使用設(shè)備的紅外發(fā)射器(如果有的話)。

UNINSTALL_SHORTCUT:不再支持此權(quán)限。

UPDATE_DEVICE_STATS:允許應(yīng)用程序更新設(shè)備統(tǒng)計(jì)信息。

USE_FINGERPRINT:允許應(yīng)用使用指紋硬件。

USE_SIP:允許應(yīng)用程序使用SIP服務(wù)。

VIBRATE:允許訪問振動(dòng)器。

WAKE_LOCK:允許使用PowerManager WakeLock來防止處理器進(jìn)入睡眠狀態(tài)或屏幕變暗。

WRITE_APN_SETTINGS:允許應(yīng)用程序?qū)懭隺pn設(shè)置。

WRITE_CALENDAR:允許應(yīng)用程序?qū)懭胗脩舻娜諝v數(shù)據(jù)。

WRITE_CALL_LOG:允許應(yīng)用程序?qū)懭耄ǘ皇亲x?。┯脩舻耐ㄔ捰涗洈?shù)據(jù)。

WRITE_CONTACTS:允許應(yīng)用程序?qū)懭胗脩舻穆?lián)系人數(shù)據(jù)。

WRITE_EXTERNAL_STORAGE:允許應(yīng)用程序?qū)懭胪獠看鎯?chǔ)。

WRITE_GSERVICES:允許應(yīng)用修改Google服務(wù)地圖。

WRITE_SECURE_SETTINGS:允許應(yīng)用程序讀取或?qū)懭氚踩到y(tǒng)設(shè)置。

WRITE_SETTINGS:允許應(yīng)用程序讀取或?qū)懭胂到y(tǒng)設(shè)置。

WRITE_SYNC_SETTINGS:允許應(yīng)用程序?qū)懭胪皆O(shè)置。

WRITE_VOICEMAIL:允許應(yīng)用程序修改和刪除系統(tǒng)中現(xiàn)有的語音信箱。

0x05apk文件獲取AndroidManifest.xml文件1.解壓apk文件

首先需要下載apk文件,使用壓縮軟件直接解壓縮即可,解壓成功后會(huì)在apk目錄中生存一個(gè)AndroidManifest.xml文件,如圖1所示。使用記事本或者IE等打開該文件后,其內(nèi)容為亂碼,如圖2所示。


2.使用androguard進(jìn)行轉(zhuǎn)碼

androguard可以下載最新版本,也可以下載1.9版本。

https://github.com/androguard/androguard/archive/1.9.zip

將AndroidManifest.xml文件復(fù)制到androguard目錄,我使用的是PentestBox-with-Metasploit-v2.2平臺(tái)。到E:\Tools\測(cè)試平臺(tái)\PentestBox-with-Metasploit-v2.2\bin\androidsecurity\androguard目錄下使用命令:

androaxml.py -i??AndroidManifest.xml -o??new.WoCloud.AndroidManifest.xml

即可解碼內(nèi)容。

0x06.apktool反編譯apk前面通過壓縮文件直接解壓會(huì)導(dǎo)致部分文件未經(jīng)過編碼,因此會(huì)出現(xiàn)亂碼,經(jīng)過編譯的文件可以很好的進(jìn)行查看,下面介紹使用apktool進(jìn)行反編譯apk程序,執(zhí)行效果如下圖所示。

1.下載apktool.jar

https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.2.4.jar

2.將一下腳本保存為apktool.bat

@echooff

if "%PATH_BASE%" == "" set PATH_BASE=%PATH%

set PATH=%CD%;%PATH_BASE%;

java -jar -Duser.language=en "%~dp0\apktool.jar" %*

3.反編譯程序

(1)直接用java進(jìn)行反編譯:java -jar apktool.jar d test.apk

(2)使用bat腳本進(jìn)行編譯:apktool -f d test.apk //覆蓋已有的反編譯程序及其目錄

apktool d test.apk

注意:apktool.bat和apktool_2.2.4.jar在同一個(gè)目錄,且下載的apktool_2.2.4.jar需要重命名為apktool.jar


0x07.AndroidManifest.xml默認(rèn)設(shè)置漏洞1.配置文件中的默認(rèn)設(shè)置allowBackup風(fēng)險(xiǎn)

(1)安全風(fēng)險(xiǎn)描述

Android API Level 8及其以上Android系統(tǒng)提供了為應(yīng)用程序數(shù)據(jù)的備份和恢復(fù)功能,此功能的開關(guān)決定于該應(yīng)用程序中?AndroidManifest.xml文件中的?allowBackup屬性值,其屬性值默認(rèn)是True。當(dāng)allowBackup標(biāo)志為true時(shí),用戶即可通過adb backup和adb restore來進(jìn)行對(duì)應(yīng)用數(shù)據(jù)的備份和恢復(fù),這可能會(huì)帶來一定的安全風(fēng)險(xiǎn)。當(dāng)設(shè)置該屬性值為true,adb backup容許任何一個(gè)能夠打開USB調(diào)試開關(guān)的人從Android手機(jī)中復(fù)制應(yīng)用數(shù)據(jù)到外設(shè),一旦應(yīng)用數(shù)據(jù)被備份之后,所有應(yīng)用數(shù)據(jù)都可被讀取;同時(shí)adb restore?容許用戶指定一個(gè)恢復(fù)的數(shù)據(jù)來源(即備份的應(yīng)用數(shù)據(jù))來恢復(fù)應(yīng)用程序數(shù)據(jù)的創(chuàng)建。因此,當(dāng)一個(gè)應(yīng)用數(shù)據(jù)被備份之后,用戶即可在其他?Android?手機(jī)或模擬器上安裝同一個(gè)應(yīng)用,以及通過恢復(fù)該備份的應(yīng)用數(shù)據(jù)到該設(shè)備上,在該設(shè)備上打開該應(yīng)用即可恢復(fù)到被備份的應(yīng)用程序的狀態(tài)。

對(duì)于目前大多數(shù)手機(jī)來說,一旦存在該漏洞,容易導(dǎo)致個(gè)人通訊錄、微信、QQ聊天信息、短信等敏感信息泄露;通過將備份程序在模擬手機(jī)上恢復(fù)后,可以直接進(jìn)行店家掃描支付(店家掃描支付不需要支付密碼)容易造成財(cái)產(chǎn)損失。

(2)影響范圍

Android API等級(jí)8(Android 2.2 - 2.2.3)以及以上系統(tǒng),目前絕大部分系統(tǒng)都受影響。下面給出Android API等級(jí)對(duì)應(yīng)按照系統(tǒng)以及名稱對(duì)應(yīng)的圖標(biāo)名稱:

API等級(jí)1:??Android 1.0

API等級(jí)2:??Android 1.1 Petit Four??花式小蛋糕

API等級(jí)3:??Android 1.5 Cupcake??紙杯蛋糕

API等級(jí)4:??Android 1.6 Donut??甜甜圈

API等級(jí)5:??Android 2.0 éclair? ?松餅

API等級(jí)6:??Android 2.0.1 éclair??松餅

API等級(jí)7:??Android 2.1 éclair? ?松餅

API等級(jí)8:??Android 2.2 - 2.2.3 Froyo??凍酸奶

API等級(jí)9:??Android 2.3 - 2.3.2 Gingerbread??姜餅

API等級(jí)10:Android 2.3.3-2.3.7 Gingerbread? ?姜餅

API等級(jí)11:Android 3.0 Honeycomb?蜂巢

API等級(jí)12:Android 3.1 Honeycomb?蜂巢

API等級(jí)13:Android 3.2 Honeycomb?蜂巢

API等級(jí)14:Android 4.0 - 4.0.2 Ice Cream Sandwich??冰激凌三明治

API等級(jí)15:Android 4.0.3 - 4.0.4 Ice Cream Sandwich??冰激凌三明治

API等級(jí)16:Android 4.1 Jelly Bean??糖豆

API等級(jí)17:Android 4.2 Jelly Bean??糖豆

API等級(jí)18:Android 4.3 Jelly Bean??糖豆

API等級(jí)19:Android 4.4 KitKat?奇巧巧克力棒

API等級(jí)20 : Android 4.4W KitKat with wearable extensions?奇巧巧克力棒

API等級(jí)21:Android 5.0-5.0.2 Lollipop??棒棒糖

(3)測(cè)試流程(以sina.weibo為例)

測(cè)試環(huán)境:Windows 7,ADB?調(diào)試工具;物理接觸目標(biāo)手機(jī)1,連接手機(jī)1到?PC?端

手機(jī)1和手機(jī)2均未被?ROOT,開啟?USB?調(diào)試;不用安裝其它應(yīng)用,不啟動(dòng)被測(cè)試的應(yīng)用。連接安裝開啟USB調(diào)試手機(jī)1?到PC端,在PC自動(dòng)(也可以提前)安裝好手機(jī)驅(qū)動(dòng)后,啟動(dòng)命令行界面輸入以下命令:

l adb devices

#顯示已連接的設(shè)備列表,測(cè)試手機(jī)是否正常連接

l adb backup -nosystem -noshared -apk -f com.sina.weibo.abcom.sina.weibo

#-nosystem表示不備份系統(tǒng)應(yīng)用,-noshared表示不備份應(yīng)用存儲(chǔ)在SD中的數(shù)據(jù),-apk表示備份應(yīng)用APK安裝包,?-f表示備份的.ab文件路徑和文件名,最后是要備份應(yīng)用的packageName

l點(diǎn)擊手機(jī)1確認(rèn)備份界面的“備份我的數(shù)據(jù)”

l等待備份完成,至此微博客戶端數(shù)據(jù)成功備份為com.sina.weibo.ab文件

l斷開手機(jī)1的連接

l連接手機(jī)2,在命令行界面下輸入以下命令:

l adb kill-server??#關(guān)閉ADB

l adb devices #重新啟動(dòng)ADB,檢測(cè)手機(jī)2是否成功連接

l adb restore com.sina.weibo.ab

l點(diǎn)擊手機(jī)2確認(rèn)恢復(fù)界面的“恢復(fù)我的數(shù)據(jù)”

l 等待恢復(fù)完成

l打開手機(jī)2中新安裝的微博客戶端,測(cè)試可正常登錄手機(jī)1中帳號(hào)執(zhí)行各種操作,且長(zhǎng)期有效。

(4)安全防護(hù)

顯示設(shè)置android:allowBackup=false,使用android:restoreAnyVersion的默認(rèn)值。

(5)檢測(cè)漏洞

使用apktool等工具反編譯apk后,查看AndroidManifest.xml文件,查找allowBackup,如果其值為ture,則表示存在漏洞,如下圖所示。


2.Debuggable默認(rèn)設(shè)置風(fēng)險(xiǎn)

原理:android:debuggable屬性用于指定應(yīng)用程序是否能夠被調(diào)試,如果設(shè)置其為true,那么其將能夠被java調(diào)試工具(jdb)調(diào)試,信息和代碼都將可能會(huì)被獲取和修改。

防護(hù):系統(tǒng)默認(rèn)其為false,使用系統(tǒng)默認(rèn)設(shè)置。

參考文章:

1. android常見漏洞總結(jié),http://blog.sina.com.cn/s/blog_83f3c04c0102xeow.html

2.https://developer.android.com/gu ... manifest-intro.html

3.http://blog.csdn.net/shuaishenkkk/article/details/18400711

4.https://segmentfault.com/a/1190000002590577

注意:http://www.cnblogs.com/ichunqiu/p/7479897.html ?原文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容