最近在做一些apk的安全檢測,對AndroidManifest.xml文件進行了研究和探討,介紹AndroidManifest.xml文件的作用和架構,並研究了AndroidManifest.xml配置文件存在的一些漏洞,在進行安全檢測時,可以對症下藥。
0X00 AndroidManifest.xml文件作用AndroidManifest.xml文件的作用非常重要,應該說是缺一不可。在android官方介紹文檔中(https://developer.android.com/guide/topics/manifest/manifest-intro.html)是這樣定義的。每個應用程式必須在其根目錄中具有一個AndroidManifest.xml(名字必須一樣)文件。Manifest文件提供有關應用程式到Android系統的基本信息,系統必須具有該信息才能運行任何應用程式的代碼。換句話說APP是跑在Android系統上,既然要跑在其上,就必須提供信息給Android System,這些信息就存在AndroidManifest中。AndroidManifest.xml 存放在 app/src/main/ 目錄下。在反編譯APK文件後,其文件是以亂碼格式存在,需要進行轉換才能正常查看。
0X01 主要功能命名應用程式Java包,軟體包名稱作為應用程式的唯一標識符
描述了應用程式的組件,其中包括構成應用程式的活動,服務,廣播接收器和內容提供者;它還命名實現每個組件並發布其功能的類,例如Intent可以處理的消息。這些聲明通知Android系統的組件及其可以啟動的條件。
決定哪些processes主持pplication
宣告這個App有哪些權限,它聲明應用程式必須擁有的權限才能訪問API的受保護部分並與其他應用程式交互。它還聲明其他人為了與應用程式的組件交互而需要的權限
它列出了Instrumentation在應用程式運行時提供概要分析和其他信息的類。這些聲明僅在應用程式正在開發中才會存在,並在應用程式發布之前被刪除。
它聲明了應用程式需要的最低級別的Android API。
它列出了應用程式必須連結的庫。
0X02 Manifest架構允許的元素,藍字是預設常見的元素,其中的<manifest>與<application>是必要且只能出現一次。每個元素有各自的屬性,屬性數量不一定,每個屬性有其默認值,可視需求進行設定。
1.預設的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" 開發者使用流水版號 android:versionName="1.0" > 供使用者看的版本號 <uses-sdk android:minSdkVersion="8" 最低兼容SDK版本 android:targetSdkVersion="21" /> 目標版本,若沒設定預設為最低minSdkVersion <application android:allowBackup="true" 是否允許備份 android:icon="@drawable/ic_launcher" App Icon android:label="@string/app_name" App名稱 android:theme="@style/AppTheme" > App風格 <activity activity, service, receiver, provider是組成application的4個主要項目 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進入點 <category android:name="android.intent.category.LAUNCHER" /> 顯示在應用程式行表 </intent-filter> </activity> </application></manifest>
2.標準的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 /> <application> <activity> <intent-filter> <action /> <category /> <data /> </intent-filter> <meta-data /> </activity> <activity-alias> <intent-filter> . . . </intent-filter> <meta-data /> </activity-alias> <service> <intent-filter> . . . </intent-filter> <meta-data/> </service> <receiver> <intent-filter> . . . </intent-filter> <meta-data /> </receiver> <provider> <grant-uri-permission /> <meta-data /> </provider> <uses-library /> </application> </manifest>
0x03 文件約定及語法從上面的代碼中,我們可以看出Android配置文件採用XML作為描述語言,每個XML標籤都不同的含義,大部分的配置參數都放在標籤的屬性中,下面我們便按照以上配置文件樣例中的先後順序來學習Android配置文件中主要元素與標籤的用法。
1.元素(Elements)
在所有的元素中只有<manifest>和<application>是必需的,它們各自必須存在,且只能出現一次。如果一個元素包含有其他子元素,必須通過子元素的屬性來設置其值。處於同一層次的元素,這些元素的說明是沒有順序的。例如<activity>,<provider>和<service>元素可以以任何順序混合。這個規則有兩個關鍵的例外:
一個<activity-alias> 元素必須遵循 <activity>它是一個別名。
<application>元素必須是裡面的最後一個元素 <manifest> 的元素。換句話說</application>結束標籤必須在</manifest>結束標籤之前立即出現。
2.屬性
正常來講,所有的屬性都是可選的,但是有些屬性是必須設置的。以便元素可以實現其目的,除了根元素<manifest>的屬性之外,所有其他元素屬性的名字都是以android:前綴的;
定義類名:所有的元素名都對應其在SDK中的類名,如果你自己定義類名,必須包含類的數據包名,如果類與application處於同一數據包中,可以直接簡寫為「.」;
3.聲明類名
許多元素對應於Java對象,包括應用程式本身(<application>元素)的元素及其主要組件:活動(<activity>),服務<service>),廣播接收器(<receiver>)和內容提供者(<provider>))。
如果你定義一個子類,如同你總是會為組件類(Activity,Service, BroadcastReceiver和ContentProvider)子類是通過name屬性來聲明,該名稱必須包括完整的包裝名稱。例如,一個Service子類可能被聲明如下:
<manifest . . . > <application . . . > <service android:name="com.example.project.SecretService" . . . > . . . </service> . . . </application></manifest>
4.多個值
如果某個元素有超過一個數值,這個元素必須通過重複的方式來說明其某個屬性具有多個數值項,且不能將多個數值項一次性說明在一個屬性中;例如一個intent-filter 可以保護多個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.資源值
某些屬性具有可顯示給用戶的值,例如一個活動的標籤和圖標。這些屬性的值應該從資源或主題進行本地化和設置。資源值以下列格式表示:
@[package:]type/name
如果資源與應用程式在同一個軟體包中,則可以省略軟體包名稱。該類型是一種資源,例如字符串或可畫的對象,名稱是特定資源的標識名稱。例如:
<activity android:icon="@drawable/smallPic" . . . >
主題的值使用類似地表達,但以初始值「? 」代替「@」:
?[package:]type/name
注意:資源或主題包的值必須是「android」或應用程式包的名稱。
6.字符串值
在屬性值為字符串的地方,必須使用雙反斜槓(\)來轉義字符,例如\n換行符或\uxxxx表示Unicode字符。
7.意圖過濾器
應用程式的核心組件,如活動,服務和廣播接收器由意圖(Intent)激活。意圖是Intent描述所需動作的一組信息(對象),包括要執行的數據,應該執行該操作的組件的類別以及其他相關指令。Android系統找到一個可以響應意圖的適當組件,如果需要,則啟動組件的新實例,並將其傳遞給 Intent對象。
組件通過意圖過濾器通知他們可以響應的意圖類型。由於Android系統必須了解組件在啟動組件之前可以處理的意圖,因此在清單中將intent過濾器指定為<intent-filter>元素。組件可以具有任意數量的過濾器,每個過濾器描述不同的功能。顯式命名目標組件的意圖激活該組件,因此過濾器不起作用。沒有通過名稱指定目標的意圖可以僅在組件可以通過組件的過濾器之一時激活組件。
8.圖標和標籤
許多元素都有圖標和標籤屬性,可以向用戶顯示一個小圖標和文本。一些還有一個更長的描述屬性,也可以在屏幕上顯示。例如,該<permission>元素具有所有這三個屬性,以便當詢問用戶是否授予已請求它的應用程式的權限時,一個圖標代表權限,許可的名稱以及它所需要的描述都會呈現給用戶。
在每種情況下,在包含元素中設置的圖標和標籤將成為所有容器的子元素的默認值 icon和label設置。因此,<application>元素中設置的圖標和標籤是每個應用程式組件的默認圖標和標籤。類似地,為組件(如<activity>元素)設置的圖標和標籤是每個組件<intent-filter>元素的默認設置 。如果一個 <application> 元素設置了一個標籤,但是一個活動和它的意圖過濾器沒有,應用程式標籤將被視為活動和意圖過濾器的標籤。
為意圖過濾器設置的圖標和標籤表示當組件呈現給用戶並滿足由過濾器發布的功能時的組件。例如,帶有android.intent.action.MAIN和 android.intent.category.LAUNCHER設置的過濾器將活動通告為啟動應用程式的活動。也就是說,應該在應用程式啟動器中顯示。在過濾器中設置的圖標和標籤顯示在啟動器中。
9.權限
權限是限制的代碼的一部分,或者在設備上的數據的訪問的限制。限制是為了保護可能被誤用以扭曲或損壞用戶體驗的關鍵數據和代碼。
每個權限都由唯一標籤標識。標籤通常表示限制的動作。以下是Android定義的一些權限:
android.permission.CALL_EMERGENCY_NUMBERSandroid.permission.READ_OWNER_DATAandroid.permission.SET_WALLPAPERandroid.permission.DEVICE_POWER
功能只能通過一個權限來保護。如果應用程式需要訪問受權限保護的功能,則它必須聲明它需要使用<uses-permission>清單中的元素的權限 。當應用程式安裝在設備上時,安裝程序將通過檢查籤署應用程式證書的機構以及在某些情況下詢問用戶來確定是否授予所請求的權限。如果許可被授予,應用程式就可以使用受保護的功能。如果沒有,則嘗試訪問這些功能失敗,而不通知用戶。
應用程式也可以通過權限保護自己的組件。它可以使用由Android定義的任何權限,如android.Manifest.permission由其他應用程式列出 或聲明的。它也可以自己定義。<permission>元素聲明了新的權限 。例如,活動可以如下保護:
<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>
請注意,在這個例子中,DEBIT_ACCT權限不僅僅是使用<permission>元素來聲明的 ,所以它也使用了<uses-permission>元素。為了啟動受保護的活動,您必須要求使用該應用程式的其他組件,即使應用程式本身也施加了保護。
0x04 權限屬性值意義ACCESS_CHECKIN_PROPERTIES:允許對checkin資料庫中的表「properties」進行讀/寫訪問,以更改上傳的值。
ACCESS_COARSE_LOCATION:允許應用訪問大概位置。
ACCESS_FINE_LOCATION:允許應用訪問精確位置。
ACCESS_LOCATION_EXTRA_COMMANDS:允許應用程式訪問額外的位置提供程序命令。
ACCESS_NETWORK_STATE:允許應用程式訪問有關網絡的信息。
ACCESS_NOTIFICATION_POLICY:希望訪問通知政策的應用程式的標記權限。
ACCESS_WIFI_STATE:允許應用程式訪問有關Wi-Fi網絡的信息。
ACCOUNT_MANAGER:允許應用程式調用AccountAuthenticator。
ADD_VOICEMAIL:允許應用程式將語音郵件添加到系統中。
ANSWER_PHONE_CALLS:允許應用接聽來電。
BATTERY_STATS:允許應用程式收集電池統計信息
BIND_ACCESSIBILITY_SERVICE:必須由a要求AccessibilityService,以確保只有系統可以綁定到它。
BIND_APPWIDGET:允許應用程式告訴AppWidget服務哪個應用程式可以訪問AppWidget的數據。
BIND_AUTOFILL_SERVICE:必須由a要求AutofillService,以確保只有系統可以綁定到它。
BIND_CARRIER_MESSAGING_SERVICE:這個常量是在API層面棄用23. BIND_CARRIER_SERVICES代替
BIND_CARRIER_SERVICES:允許綁定到運營商應用程式中的服務的系統進程將具有此權限。
BIND_CHOOSER_TARGET_SERVICE:必須由a要求ChooserTargetService,以確保只有系統可以綁定到它。
BIND_CONDITION_PROVIDER_SERVICE:必須由a要求ConditionProviderService,以確保只有系統可以綁定到它。
BIND_DEVICE_ADMIN:必須由設備管理接收器要求,以確保只有系統可以與其進行交互。
BIND_DREAM_SERVICE:必須由a要求DreamService,以確保只有系統可以綁定到它。
BIND_INCALL_SERVICE:必須由a要求InCallService,以確保只有系統可以綁定到它。
BIND_INPUT_METHOD:必須由a要求InputMethodService,以確保只有系統可以綁定到它。
BIND_MIDI_DEVICE_SERVICE:必須由a要求MidiDeviceService,以確保只有系統可以綁定到它。
BIND_NFC_SERVICE:必須要求HostApduService 或OffHostApduService確保只有系統可以綁定到它。
BIND_NOTIFICATION_LISTENER_SERVICE:必須由a要求NotificationListenerService,以確保只有系統可以綁定到它。
BIND_PRINT_SERVICE:必須由a要求PrintService,以確保只有系統可以綁定到它。
BIND_QUICK_SETTINGS_TILE:允許應用程式綁定到第三方快速設置圖塊。
BIND_REMOTEVIEWS:必須由a要求RemoteViewsService,以確保只有系統可以綁定到它。
BIND_SCREENING_SERVICE:必須由a要求CallScreeningService,以確保只有系統可以綁定到它。
BIND_TELECOM_CONNECTION_SERVICE:必須由a要求ConnectionService,以確保只有系統可以綁定到它。
BIND_TEXT_SERVICE:必須由TextService要求
BIND_TV_INPUT:必須通過a TvInputService 來確保只有系統可以綁定它。
BIND_VISUAL_VOICEMAIL_SERVICE:連結必須要求,VisualVoicemailService以確保只有系統可以綁定到它。
BIND_VOICE_INTERACTION:必須由a要求VoiceInteractionService,以確保只有系統可以綁定到它。
BIND_VPN_SERVICE:必須由a要求VpnService,以確保只有系統可以綁定到它。
BIND_VR_LISTENER_SERVICE:必須由a要求VrListenerService,以確保只有系統可以綁定到它。
BIND_WALLPAPER:必須由a要求WallpaperService,以確保只有系統可以綁定到它。
BLUETOOTH:允許應用程式連接到配對的藍牙設備。
BLUETOOTH_ADMIN:允許應用程式發現和配對藍牙設備。
BLUETOOTH_PRIVILEGED:允許應用程式在沒有用戶交互的情況下配對藍牙設備,並允許或禁止電話簿訪問或消息訪問。
BODY_SENSORS:允許應用程式訪問用戶用來衡量身體內發生的情況的傳感器的數據,例如心率。
BROADCAST_PACKAGE_REMOVED:允許應用程式廣播應用程式包已被刪除的通知。
BROADCAST_SMS:允許應用程式廣播簡訊收據通知。
BROADCAST_STICKY:允許應用程式廣播粘性意圖。
BROADCAST_WAP_PUSH:允許應用程式廣播WAP PUSH收據通知。
CALL_PHONE:允許應用程式發起電話而不通過撥號器用戶界面供用戶確認通話。
CALL_PRIVILEGED:允許應用程式呼叫任何電話號碼,包括緊急號碼,而無需通過Dialer用戶界面,用戶確認呼叫正在被放置。
CAMERA:需要能夠訪問相機設備。
CAPTURE_AUDIO_OUTPUT:允許應用程式捕獲音頻輸出。
CAPTURE_SECURE_VIDEO_OUTPUT:允許應用程式捕獲安全視頻輸出。
CAPTURE_VIDEO_OUTPUT:允許應用程式捕獲視頻輸出。
CHANGE_COMPONENT_ENABLED_STATE:允許應用程式更改應用程式組件(不是自己的)是否啟用。
CHANGE_CONFIGURATION:允許應用程式修改當前配置,如區域設置。
CHANGE_NETWORK_STATE:允許應用程式更改網絡連接狀態。
CHANGE_WIFI_MULTICAST_STATE:允許應用程式進入Wi-Fi組播模式。
CHANGE_WIFI_STATE:允許應用程式更改Wi-Fi連接狀態。
CLEAR_APP_CACHE:允許應用程式清除設備上所有已安裝應用程式的緩存。
CONTROL_LOCATION_UPDATES:允許啟用/禁用收音機的位置更新通知。
DELETE_CACHE_FILES:允許應用程式刪除緩存文件。
DELETE_PACKAGES:允許應用程式刪除軟體包。
DIAGNOSTIC:允許應用程式RW到診斷資源。
DISABLE_KEYGUARD:允許應用程式禁用鍵盤保護程序,如果它不安全。
DUMP:允許應用程式從系統服務檢索狀態轉儲信息。
EXPAND_STATUS_BAR:允許應用程式展開或摺疊狀態欄。
FACTORY_TEST:作為製造商測試應用程式運行,以root用戶身份運行。
GET_ACCOUNTS:允許訪問帳戶服務中的帳戶列表。
GET_ACCOUNTS_PRIVILEGED:允許訪問帳戶服務中的帳戶列表。
GET_PACKAGE_SIZE:允許應用程式找出任何包使用的空間。
GET_TASKS:這個常數在API級別21中已被棄用。不再強制執行。
GLOBAL_SEARCH:該權限可用於內容提供商,以允許全局搜索系統訪問其數據。
INSTALL_LOCATION_PROVIDER:允許應用程式將位置提供程序安裝到位置管理器中。
INSTALL_PACKAGES:允許應用程式安裝軟體包。
INSTALL_SHORTCUT:允許應用程式在Launcher中安裝快捷方式。
INSTANT_APP_FOREGROUND_SERVICE:允許即時應用創建前臺服務。
INTERNET:允許應用程式打開網絡套接字。
KILL_BACKGROUND_PROCESSES:允許應用程式調用 killBackgroundProcesses(String)。
LOCATION_HARDWARE:允許應用程式在硬體中使用位置功能,例如geofencing api。
MANAGE_DOCUMENTS:允許應用程式管理對文檔的訪問,通常是文檔選擇器的一部分。
MANAGE_OWN_CALLS:允許通過自我管理的ConnectionServiceAPI 管理自己的呼叫的呼叫應用程式 。
MASTER_CLEAR:不適用於第三方應用程式。
MEDIA_CONTENT_CONTROL:允許應用程式知道正在播放哪些內容並控制其播放。
MODIFY_AUDIO_SETTINGS:允許應用程式修改全局音頻設置。
MODIFY_PHONE_STATE:允許修改電話狀態 - 開機,mmi等
MOUNT_FORMAT_FILESYSTEMS:允許將文件系統格式化為可移動存儲。
MOUNT_UNMOUNT_FILESYSTEMS:允許安裝和卸載文件系統以進行可移動存儲。
NFC:允許應用程式通過NFC執行I / O操作。
PACKAGE_USAGE_STATS:允許應用程式收集組件使用統計信息,聲明權限意味著使用API,設備的用戶可以通過「設置」應用程式授予權限。
PERSISTENT_ACTIVITY:此常數在API級別9中已被棄用。此功能將在以後刪除; 請不要使用。允許應用程式使其活動持續。
PROCESS_OUTGOING_CALLS:允許應用程式在呼出期間查看正在撥打的電話號碼,並選擇將呼叫重定向到其他號碼或完全中止呼叫。
READ_CALENDAR:允許應用程式讀取用戶的日曆數據。
READ_CALL_LOG:允許應用程式讀取用戶的通話記錄。
READ_CONTACTS:允許應用程式讀取用戶的聯繫人數據。
READ_EXTERNAL_STORAGE:允許應用程式從外部存儲器讀取。
READ_FRAME_BUFFER:允許應用程式進行屏幕截圖,更一般地,可以訪問幀緩衝區數據。
READ_INPUT_STATE:此常數在API級別16中已被棄用。使用此權限的API已被刪除。
READ_LOGS:允許應用程式讀取低級別的系統日誌文件。
READ_PHONE_NUMBERS:允許讀取設備的電話號碼。
READ_PHONE_STATE:允許只讀訪問電話狀態,包括設備的電話號碼,當前的蜂窩網絡信息,任何正在進行的呼叫的狀態以及PhoneAccount在設備上註冊的任何列表 。
READ_SMS:允許應用程式讀取簡訊。
READ_SYNC_SETTINGS:允許應用程式讀取同步設置。
READ_SYNC_STATS:允許應用程式讀取同步統計信息。
READ_VOICEMAIL:允許應用程式讀取系統中的語音信箱。
REBOOT:需要重新啟動設備。
RECEIVE_BOOT_COMPLETED:允許應用程式收到ACTION_BOOT_COMPLETED在系統完成啟動後廣播的應用程式 。
RECEIVE_MMS:允許應用程式監視傳入的彩信。
RECEIVE_SMS:允許應用程式接收簡訊。
RECEIVE_WAP_PUSH:允許應用程式接收WAP推送消息。
RECORD_AUDIO:允許應用程式錄製音頻。
REORDER_TASKS:允許應用程式更改任務的Z順序。
REQUEST_COMPANION_RUN_IN_BACKGROUND:允許隨播應用在後臺運行。REQUEST_COMPANION_USE_DATA_IN_BACKGROUND:允許隨播應用在後臺使用數據。
REQUEST_DELETE_PACKAGES:允許應用程式請求刪除包。
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS:許可申請必須持有才能使用 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。
REQUEST_INSTALL_PACKAGES:允許應用程式請求安裝軟體包。
RESTART_PACKAGES:此常數在API級別8中已棄用restartPackage(String) 。不再支持API。
SEND_RESPOND_VIA_MESSAGE:允許應用程式(電話)向其他應用程式發送請求,以處理來電期間的響應通過消息動作。
SEND_SMS:允許應用程式發送簡訊。
SET_ALARM:允許應用程式廣播Intent為用戶設置鬧鐘。
SET_ALWAYS_FINISH:允許應用程式控制是否在後臺放置活動時立即完成。
SET_ANIMATION_SCALE:修改全局動畫縮放因子。
SET_DEBUG_APP:配置應用程式進行調試。
SET_PREFERRED_APPLICATIONS:這個常數在API級別7中已被棄用。不再有用, addPackageToPreferred(String) 有關詳細信息。
SET_PROCESS_LIMIT:允許應用程式設置可以運行的最大數量(不需要的)應用程式進程。
SET_TIME:允許應用程式設置系統時間。
SET_TIME_ZONE:允許應用程式設置系統時區。
SET_WALLPAPER:允許應用設置壁紙。
SET_WALLPAPER_HINTS:允許應用程式設置壁紙提示。SIGNAL_PERSISTENT_PROCESSES:允許應用程式請求將信號發送到所有持久進程。
STATUS_BAR:允許應用程式打開,關閉或禁用狀態欄及其圖標。
SYSTEM_ALERT_WINDOW:允許應用使用類型創建窗口 TYPE_APPLICATION_OVERLAY,顯示在所有其他應用程式的頂部。
TRANSMIT_IR:允許使用設備的紅外發射器(如果有的話)。
UNINSTALL_SHORTCUT:不再支持此權限。
UPDATE_DEVICE_STATS:允許應用程式更新設備統計信息。
USE_FINGERPRINT:允許應用使用指紋硬體。
USE_SIP:允許應用程式使用SIP服務。
VIBRATE:允許訪問振動器。
WAKE_LOCK:允許使用PowerManager WakeLock來防止處理器進入睡眠狀態或屏幕變暗。
WRITE_APN_SETTINGS:允許應用程式寫入apn設置。
WRITE_CALENDAR:允許應用程式寫入用戶的日曆數據。
WRITE_CALL_LOG:允許應用程式寫入(而不是讀取)用戶的通話記錄數據。
WRITE_CONTACTS:允許應用程式寫入用戶的聯繫人數據。
WRITE_EXTERNAL_STORAGE:允許應用程式寫入外部存儲。
WRITE_GSERVICES:允許應用修改Google服務地圖。
WRITE_SECURE_SETTINGS:允許應用程式讀取或寫入安全系統設置。
WRITE_SETTINGS:允許應用程式讀取或寫入系統設置。
WRITE_SYNC_SETTINGS:允許應用程式寫入同步設置。
WRITE_VOICEMAIL:允許應用程式修改和刪除系統中現有的語音信箱。
0x05 apk文件獲取AndroidManifest.xml文件1.解壓apk文件
首先需要下載apk文件,使用壓縮軟體直接解壓縮即可,解壓成功後會在apk目錄中生存一個AndroidManifest.xml文件,如圖1所示。使用記事本或者IE等打開該文件後,其內容為亂碼,如圖2所示。
圖1 AndroidManifest.xml文件
圖2文件內容為亂碼
2.使用androguard進行轉碼
androguard可以下載最新版本,也可以下載1.9版本。
https://github.com/androguard/androguard/archive/1.9.zip
將AndroidManifest.xml文件複製到androguard目錄,我使用的是PentestBox-with-Metasploit-v2.2平臺。到E:\Tools\測試平臺\PentestBox-with-Metasploit-v2.2\bin\androidsecurity\androguard目錄下使用命令:
androaxml.py -i AndroidManifest.xml -o new.WoCloud.AndroidManifest.xml
即可解碼內容。
0x06 apktool反編譯apk前面通過壓縮文件直接解壓會導致部分文件未經過編碼,因此會出現亂碼,經過編譯的文件可以很好的進行查看,下面介紹使用apktool進行反編譯apk程序,執行效果如下圖所示。
1.下載apktool.jar
https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.2.4.jar
2.將一下腳本保存為apktool.bat
@echo offif "%PATH_BASE%" == "" set PATH_BASE=%PATH%set PATH=%CD%;%PATH_BASE%;java -jar -Duser.language=en "%~dp0\apktool.jar" %*
3.反編譯程序
(1)直接用java進行反編譯:java -jar apktool.jar d test.apk
(2)使用bat腳本進行編譯:apktool -f d test.apk //覆蓋已有的反編譯程序及其目錄
apktool d test.apk
注意:apktool.bat和apktool_2.2.4.jar在同一個目錄,且下載的apktool_2.2.4.jar需要重命名為apktool.jar
0x07 AndroidManifest.xml 默認設置漏洞1.配置文件中的默認設置allowBackup風險
(1)安全風險描述
Android API Level 8及其以上Android系統提供了為應用程式數據的備份和恢復功能,此功能的開關決定於該應用程式中 AndroidManifest.xml文件中的 allowBackup屬性值,其屬性值默認是True。當allowBackup標誌為true時,用戶即可通過adb backup和adb restore來進行對應用數據的備份和恢復,這可能會帶來一定的安全風險。當設置該屬性值為true,adb backup容許任何一個能夠打開USB調試開關的人從Android手機中複製應用數據到外設,一旦應用數據被備份之後,所有應用數據都可被讀取;同時adb restore 容許用戶指定一個恢復的數據來源(即備份的應用數據)來恢復應用程式數據的創建。因此,當一個應用數據被備份之後,用戶即可在其他 Android 手機或模擬器上安裝同一個應用,以及通過恢復該備份的應用數據到該設備上,在該設備上打開該應用即可恢復到被備份的應用程式的狀態。
對於目前大多數手機來說,一旦存在該漏洞,容易導致個人通訊錄、微信、QQ聊天信息、簡訊等敏感信息洩露;通過將備份程序在模擬手機上恢復後,可以直接進行店家掃描支付(店家掃描支付不需要支付密碼)容易造成財產損失。
(2)影響範圍
Android API 等級8(Android 2.2 - 2.2.3)以及以上系統,目前絕大部分系統都受影響。下面給出Android API等級對應按照系統以及名稱對應的圖標名稱:
API等級1: Android 1.0
API等級2: Android 1.1 Petit Four 花式小蛋糕
API等級3: Android 1.5 Cupcake 紙杯蛋糕
API等級4: Android 1.6 Donut 甜甜圈
API等級5: Android 2.0 Éclair 鬆餅
API等級6: Android 2.0.1 Éclair 鬆餅
API等級7: Android 2.1 Éclair 鬆餅
API等級8: Android 2.2 - 2.2.3 Froyo 凍酸奶
API等級9: Android 2.3 - 2.3.2 Gingerbread 薑餅
API等級10:Android 2.3.3-2.3.7 Gingerbread 薑餅
API等級11:Android 3.0 Honeycomb 蜂巢
API等級12:Android 3.1 Honeycomb 蜂巢
API等級13:Android 3.2 Honeycomb 蜂巢
API等級14:Android 4.0 - 4.0.2 Ice Cream Sandwich 冰激凌三明治
API等級15:Android 4.0.3 - 4.0.4 Ice Cream Sandwich 冰激凌三明治
API等級16:Android 4.1 Jelly Bean 糖豆
API等級17:Android 4.2 Jelly Bean 糖豆
API等級18:Android 4.3 Jelly Bean 糖豆
API等級19:Android 4.4 KitKat 奇巧巧克力棒
API等級20 : Android 4.4W KitKat with wearable extensions 奇巧巧克力棒
API等級21:Android 5.0-5.0.2 Lollipop 棒棒糖
(3)測試流程(以sina.weibo為例)
測試環境:Windows 7,ADB 調試工具;物理接觸目標手機1,連接手機1到 PC 端
手機1和手機2均未被 ROOT,開啟 USB 調試;不用安裝其它應用,不啟動被測試的應用。連接安裝開啟USB調試手機1 到PC端,在PC自動(也可以提前)安裝好手機驅動後,啟動命令行界面輸入以下命令:
adb devices
#顯示已連接的設備列表,測試手機是否正常連接
adb backup -nosystem -noshared -apk -f com.sina.weibo.abcom.sina.weibo
#-nosystem表示不備份系統應用,-noshared表示不備份應用存儲在SD中的數據,-apk表示備份應用APK安裝包, -f表示備份的.ab文件路徑和文件名,最後是要備份應用的packageName
點擊手機1確認備份界面的「備份我的數據」
等待備份完成,至此微博客戶端數據成功備份為 com.sina.weibo.ab 文件
斷開手機1的連接
連接手機2 ,在命令行界面下輸入以下命令:
adb kill-server #關閉ADB
adb devices #重新啟動ADB,檢測手機2是否成功連接
點擊手機2確認恢復界面的「恢復我的數據」
等待恢復完成
打開手機2中新安裝的微博客戶端,測試可正常登錄手機1中帳號執行各種操作,且長期有效。
(4)安全防護
顯示設置android:allowBackup=false,使用android:restoreAnyVersion的默認值。
(5)檢測漏洞
使用apktool等工具反編譯apk後,查看AndroidManifest.xml文件,查找allowBackup,如果其值為ture,則表示存在漏洞,如下圖所示。
2.Debuggable默認設置風險
原理:android:debuggable屬性用於指定應用程式是否能夠被調試,如果設置其為true,那麼其將能夠被java調試工具(jdb)調試,信息和代碼都將可能會被獲取和修改。
防護:系統默認其為false,使用系統默認設置。