AndroidManifest.xml文件安全探索
secbang.com
simeon
最近在做一些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系統(tǒng)的基本信息帘皿,系統(tǒng)必須具有該信息才能運行任何應用程序的代碼鹰溜。換句話說APP是跑在Android系統(tǒng)上曹动,既然要跑在其上,就必須提供信息給Android System恶守,這些信息就存在AndroidManifest中兔港。AndroidManifest.xml存放在app/src/main/目錄下衫樊。在反編譯APK文件后科侈,其文件是以亂碼格式存在炒事,需要進行轉換才能正常查看挠乳。
0X01主要功能
1.命名應用程序Java包欲侮,軟件包名稱作為應用程序的唯一標識符
2.描述了應用程序的組件威蕉,其中包括構成應用程序的活動韧涨,服務,廣播接收器和內容提供者宪哩;它還命名實現(xiàn)每個組件并發(fā)布其功能的類锁孟,例如Intent可以處理的消息茁瘦。這些聲明通知Android系統(tǒng)的組件及其可以啟動的條件甜熔。
3.決定哪些processes主持application
4.宣告這個App有哪些權限腔稀,它聲明應用程序必須擁有的權限才能訪問API的受保護部分并與其他應用程序交互焊虏。它還聲明其他人為了與應用程序的組件交互而需要的權限
5.它列出了Instrumentation在應用程序運行時提供概要分析和其他信息的類炕淮。這些聲明僅在應用程序正在開發(fā)中才會存在涂圆,并在應用程序發(fā)布之前被刪除润歉。
6.它聲明了應用程序需要的最低級別的Android API踩衩。
7.它列出了應用程序必須鏈接的庫驱富。
0X02 Manifest架構
允許的元素褐鸥,藍字是預設常見的元素赐稽,其中的與是必要且只能出現(xiàn)一次。每個元素有各自的屬性寓落,屬性數(shù)量不一定伶选,每個屬性有其默認值考蕾,可視需求進行設定肖卧。
1.預設的AndroidManifest.xml
version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.bmi"名稱空間
android:versionCode="1"開發(fā)者使用流水版號
android:versionName="1.0">供使用者看的版本號
android:minSdkVersion="8"最低兼容SDK版本
android:targetSdkVersion="21"/>目標版本塞帐,若沒設定預設為最低minSdkVersion
android:allowBackup="true"是否允許備份
android:icon="@drawable/ic_launcher" App Icon
android:label="@string/app_name" App名稱
android:theme="@style/AppTheme" > App風格
android:name=".MainActivity" activity名稱葵姥,可和manifest
package串在一起
android:label="@string/app_name" > APP開啟后榔幸,顯示在畫面上方的名稱
activity操作方式
.MAIN表示activity是APP進入點
顯示在應用程序行表
2.標準的AndroidManifest.xml文件樣例削咆。
. . .
. . .
. . .
0x03文件約定及語法
從上面的代碼中,我們可以看出Android配置文件采用XML作為描述語言瞻惋,每個XML標簽都不同的含義援岩,大部分的配置參數(shù)都放在標簽的屬性中享怀,下面我們便按照以上配置文件樣例中的先后順序來學習Android配置文件中主要元素與標簽的用法。
1.元素(Elements)
在所有的元素中只有和是必需的忍啸,它們各自必須存在,且只能出現(xiàn)一次玫霎。如果一個元素包含有其他子元素庶近,必須通過子元素的屬性來設置其值鼻种。處于同一層次的元素叉钥,這些元素的說明是沒有順序的投队。例如,和元素可以以任何順序混合息楔。這個規(guī)則有兩個關鍵的例外:
l一個元素必須遵循它是一個別名值依。
l元素必須是里面的最后一個元素的元素。換句話說結束標簽必須在結束標簽之前立即出現(xiàn)。
2.屬性
正常來講熔任,所有的屬性都是可選的疑苔,但是有些屬性是必須設置的惦费。以便元素可以實現(xiàn)其目的薪贫,除了根元素的屬性之外瞧省,所有其他元素屬性的名字都是以android:前綴的鞍匾;
定義類名:所有的元素名都對應其在SDK中的類名橡淑,如果你自己定義類名梁棠,必須包含類的數(shù)據(jù)包名掰茶,如果類與application處于同一數(shù)據(jù)包中濒蒋,可以直接簡寫為“.”沪伙;
3.聲明類名
許多元素對應于Java對象围橡,包括應用程序本身(元素)的元素及其主要組件:活動()翁授,服務)收擦,廣播接收器()和內容提供者())泪勒。
如果你定義一個子類圆存,如同你總是會為組件類(Activity沦辙,Service怕轿,BroadcastReceiver和ContentProvider)子類是通過name屬性來聲明撞羽,該名稱必須包括完整的包裝名稱诀紊。例如邻奠,一個Service子類可能被聲明如下:
. . . >
. . .
. . .
4.多個值
如果某個元素有超過一個數(shù)值杀狡,這個元素必須通過重復的方式來說明其某個屬性具有多個數(shù)值項呜象,且不能將多個數(shù)值項一次性說明在一個屬性中恭陡;例如一個intent-filter可以保護多個action:
. . . >
. . .
5.資源值
某些屬性具有可顯示給用戶的值休玩,例如一個活動的標簽和圖標。這些屬性的值應該從資源或主題進行本地化和設置遥赚。資源值以下列格式表示:
@[package:]type/name
如果資源與應用程序在同一個軟件包中,則可以省略軟件包名稱孕惜。該類型是一種資源毫炉,例如字符串或可畫的對象辩块,名稱是特定資源的標識名稱。例如:
android:icon="@drawable/smallPic" . . . >
主題的值使用類似地表達趾疚,但以初始值“?”代替“@”:
?[package:]type/name
注意:資源或主題包的值必須是“android”或應用程序包的名稱。
6.字符串值
在屬性值為字符串的地方赡磅,必須使用雙反斜杠(\\)來轉義字符焚廊,例如\\n換行符或\\uxxxx表示Unicode字符节值。
7.意圖過濾器
應用程序的核心組件,如活動榜聂,服務和廣播接收器由意圖(Intent)激活搞疗。意圖是Intent描述所需動作的一組信息(對象),包括要執(zhí)行的數(shù)據(jù)须肆,應該執(zhí)行該操作的組件的類別以及其他相關指令匿乃。Android系統(tǒng)找到一個可以響應意圖的適當組件,如果需要豌汇,則啟動組件的新實例,并將其傳遞給Intent對象拒贱。
組件通過意圖過濾器通知他們可以響應的意圖類型宛徊。由于Android系統(tǒng)必須了解組件在啟動組件之前可以處理的意圖佛嬉,因此在清單中將intent過濾器指定為元素。組件可以具有任意數(shù)量的過濾器闸天,每個過濾器描述不同的功能暖呕。顯式命名目標組件的意圖激活該組件,因此過濾器不起作用苞氮。沒有通過名稱指定目標的意圖可以僅在組件可以通過組件的過濾器之一時激活組件湾揽。
8.圖標和標簽
許多元素都有圖標和標簽屬性,可以向用戶顯示一個小圖標和文本笼吟。一些還有一個更長的描述屬性库物,也可以在屏幕上顯示。例如贷帮,該元素具有所有這三個屬性戚揭,以便當詢問用戶是否授予已請求它的應用程序的權限時,一個圖標代表權限皿桑,許可的名稱以及它所需要的描述都會呈現(xiàn)給用戶毫目。
在每種情況下,在包含元素中設置的圖標和標簽將成為所有容器的子元素的默認值icon和label設置诲侮。因此镀虐,元素中設置的圖標和標簽是每個應用程序組件的默認圖標和標簽。類似地沟绪,為組件(如元素)設置的圖標和標簽是每個組件元素的默認設置刮便。如果一個元素設置了一個標簽,但是一個活動和它的意圖過濾器沒有绽慈,應用程序標簽將被視為活動和意圖過濾器的標簽恨旱。
為意圖過濾器設置的圖標和標簽表示當組件呈現(xiàn)給用戶并滿足由過濾器發(fā)布的功能時的組件。例如坝疼,帶有android.intent.action.MAIN和android.intent.category.LAUNCHER設置的過濾器將活動通告為啟動應用程序的活動搜贤。也就是說,應該在應用程序啟動器中顯示钝凶。在過濾器中設置的圖標和標簽顯示在啟動器中仪芒。
9.權限
權限是限制的代碼的一部分,或者在設備上的數(shù)據(jù)的訪問的限制耕陷。限制是為了保護可能被誤用以扭曲或損壞用戶體驗的關鍵數(shù)據(jù)和代碼掂名。
每個權限都由唯一標簽標識。標簽通常表示限制的動作哟沫。以下是Android定義的一些權限:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
功能只能通過一個權限來保護饺蔑。如果應用程序需要訪問受權限保護的功能,則它必須聲明它需要使用清單中的元素的權限嗜诀。當應用程序安裝在設備上時猾警,安裝程??序將通過檢查簽署應用程序證書的機構以及在某些情況下詢問用戶來確定是否授予所請求的權限孔祸。如果許可被授予,應用程序就可以使用受保護的功能肿嘲。如果沒有融击,則嘗試訪問這些功能失敗筑公,而不通知用戶雳窟。
應用程序也可以通過權限保護自己的組件。它可以使用由Android定義的任何權限匣屡,如android.Manifest.permission由其他應用程序列出或聲明的封救。它也可以自己定義。元素聲明了新的權限捣作。例如誉结,活動可以如下保護:
. . . >
. . .
android:permission="com.example.project.DEBIT_ACCT"
. . . >
. . .
請注意,在這個例子中券躁,DEBIT_ACCT權限不僅僅是使用元素來聲明的惩坑,所以它也使用了元素。為了啟動受保護的活動也拜,您必須要求使用該應用程序的其他組件以舒,即使應用程序本身也施加了保護。
0x04權限屬性值意義
ACCESS_CHECKIN_PROPERTIES:允許對checkin數(shù)據(jù)庫中的表“properties”進行讀/寫訪問慢哈,以更改上傳的值蔓钟。
ACCESS_COARSE_LOCATION:允許應用訪問大概位置。
ACCESS_FINE_LOCATION:允許應用訪問精確位置卵贱。
ACCESS_LOCATION_EXTRA_COMMANDS:允許應用程序訪問額外的位置提供程序命令滥沫。
ACCESS_NETWORK_STATE:允許應用程序訪問有關網(wǎng)絡的信息。
ACCESS_NOTIFICATION_POLICY:希望訪問通知政策的應用程序的標記權限键俱。
ACCESS_WIFI_STATE:允許應用程序訪問有關Wi-Fi網(wǎng)絡的信息兰绣。
ACCOUNT_MANAGER:允許應用程序調用AccountAuthenticator。
ADD_VOICEMAIL:允許應用程序將語音郵件添加到系統(tǒng)中编振。
ANSWER_PHONE_CALLS:允許應用接聽來電缀辩。
BATTERY_STATS:允許應用程序收集電池統(tǒng)計信息
BIND_ACCESSIBILITY_SERVICE:必須由a要求AccessibilityService,以確保只有系統(tǒng)可以綁定到它党觅。
BIND_APPWIDGET:允許應用程序告訴AppWidget服務哪個應用程序可以訪問AppWidget的數(shù)據(jù)雌澄。
BIND_AUTOFILL_SERVICE:必須由a要求AutofillService,以確保只有系統(tǒng)可以綁定到它杯瞻。
BIND_CARRIER_MESSAGING_SERVICE:這個常量是在API層面棄用23.
BIND_CARRIER_SERVICES代替
BIND_CARRIER_SERVICES:允許綁定到運營商應用程序中的服務的系統(tǒng)進程將具有此權限镐牺。
BIND_CHOOSER_TARGET_SERVICE:必須由a要求ChooserTargetService,以確保只有系統(tǒng)可以綁定到它魁莉。
BIND_CONDITION_PROVIDER_SERVICE:必須由a要求ConditionProviderService睬涧,以確保只有系統(tǒng)可以綁定到它募胃。
BIND_DEVICE_ADMIN:必須由設備管理接收器要求,以確保只有系統(tǒng)可以與其進行交互畦浓。
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:允許應用程序綁定到第三方快速設置圖塊。
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:允許應用程序連接到配對的藍牙設備。
BLUETOOTH_ADMIN:允許應用程序發(fā)現(xiàn)和配對藍牙設備尚卫。
BLUETOOTH_PRIVILEGED:允許應用程序在沒有用戶交互的情況下配對藍牙設備归榕,并允許或禁止電話簿訪問或消息訪問。
BODY_SENSORS:允許應用程序訪問用戶用來衡量身體內發(fā)生的情況的傳感器的數(shù)據(jù)吱涉,例如心率刹泄。
BROADCAST_PACKAGE_REMOVED:允許應用程序廣播應用程序包已被刪除的通知外里。
BROADCAST_SMS:允許應用程序廣播短信收據(jù)通知。
BROADCAST_STICKY:允許應用程序廣播粘性意圖特石。
BROADCAST_WAP_PUSH:允許應用程序廣播WAP
PUSH收據(jù)通知盅蝗。
CALL_PHONE:允許應用程序發(fā)起電話而不通過撥號器用戶界面供用戶確認通話。
CALL_PRIVILEGED:允許應用程序呼叫任何電話號碼姆蘸,包括緊急號碼墩莫,而無需通過Dialer用戶界面,用戶確認呼叫正在被放置乞旦。
CAMERA:需要能夠訪問相機設備贼穆。
CAPTURE_AUDIO_OUTPUT:允許應用程序捕獲音頻輸出。
CAPTURE_SECURE_VIDEO_OUTPUT:允許應用程序捕獲安全視頻輸出兰粉。
CAPTURE_VIDEO_OUTPUT:允許應用程序捕獲視頻輸出。
CHANGE_COMPONENT_ENABLED_STATE:允許應用程序更改應用程序組件(不是自己的)是否啟用顶瞳。
CHANGE_CONFIGURATION:允許應用程序修改當前配置玖姑,如區(qū)域設置。
CHANGE_NETWORK_STATE:允許應用程序更改網(wǎng)絡連接狀態(tài)慨菱。
CHANGE_WIFI_MULTICAST_STATE:允許應用程序進入Wi-Fi組播模式焰络。
CHANGE_WIFI_STATE:允許應用程序更改Wi-Fi連接狀態(tài)。
CLEAR_APP_CACHE:允許應用程序清除設備上所有已安裝應用程序的緩存符喝。
CONTROL_LOCATION_UPDATES:允許啟用/禁用收音機的位置更新通知闪彼。
DELETE_CACHE_FILES:允許應用程序刪除緩存文件。
DELETE_PACKAGES:允許應用程序刪除軟件包协饲。
DIAGNOSTIC:允許應用程序RW到診斷資源畏腕。
DISABLE_KEYGUARD:允許應用程序禁用鍵盤保護程序,如果它不安全茉稠。
DUMP:允許應用程序從系統(tǒng)服務檢索狀態(tài)轉儲信息描馅。
EXPAND_STATUS_BAR:允許應用程序展開或折疊狀態(tài)欄。
FACTORY_TEST:作為制造商測試應用程序運行而线,以root用戶身份運行铭污。
GET_ACCOUNTS:允許訪問帳戶服務中的帳戶列表。
GET_ACCOUNTS_PRIVILEGED:允許訪問帳戶服務中的帳戶列表膀篮。
GET_PACKAGE_SIZE:允許應用程序找出任何包使用的空間嘹狞。
GET_TASKS:這個常數(shù)在API級別21中已被棄用。不再強制執(zhí)行誓竿。
GLOBAL_SEARCH:該權限可用于內容提供商磅网,以允許全局搜索系統(tǒng)訪問其數(shù)據(jù)。
INSTALL_LOCATION_PROVIDER:允許應用程序將位置提供程序安裝到位置管理器中烤黍。
INSTALL_PACKAGES:允許應用程序安裝軟件包知市。
INSTALL_SHORTCUT:允許應用程序在Launcher中安裝快捷方式傻盟。
INSTANT_APP_FOREGROUND_SERVICE:允許即時應用創(chuàng)建前臺服務。
INTERNET:允許應用程序打開網(wǎng)絡套接字嫂丙。
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:允許修改電話狀態(tài)-開機泛啸,mmi等
MOUNT_FORMAT_FILESYSTEMS:允許將文件系統(tǒng)格式化為可移動存儲。
MOUNT_UNMOUNT_FILESYSTEMS:允許安裝和卸載文件系統(tǒng)以進行可移動存儲秃症。
NFC:允許應用程序通過NFC執(zhí)行I / O操作候址。
PACKAGE_USAGE_STATS:允許應用程序收集組件使用統(tǒng)計信息,聲明權限意味著使用API??种柑,設備的用戶可以通過“設置”應用程序授予權限岗仑。
PERSISTENT_ACTIVITY:此常數(shù)在API級別9中已被棄用。此功能將在以后刪除;請不要使用聚请。允許應用程序使其活動持續(xù)荠雕。
PROCESS_OUTGOING_CALLS:允許應用程序在呼出期間查看正在撥打的電話號碼,并選擇將呼叫重定向到其他號碼或完全中止呼叫驶赏。
READ_CALENDAR:允許應用程序讀取用戶的日歷數(shù)據(jù)炸卑。
READ_CALL_LOG:允許應用程序讀取用戶的通話記錄。
READ_CONTACTS:允許應用程序讀取用戶的聯(lián)系人數(shù)據(jù)母市。
READ_EXTERNAL_STORAGE:允許應用程序從外部存儲器讀取矾兜。
READ_FRAME_BUFFER:允許應用程序進行屏幕截圖,更一般地患久,可以訪問幀緩沖區(qū)數(shù)據(jù)椅寺。
READ_INPUT_STATE:此常數(shù)在API級別16中已被棄用。使用此權限的API已被刪除蒋失。
READ_LOGS:允許應用程序讀取低級別的系統(tǒng)日志文件返帕。
READ_PHONE_NUMBERS:允許讀取設備的電話號碼。
READ_PHONE_STATE:允許只讀訪問電話狀態(tài)篙挽,包括設備的電話號碼荆萤,當前的蜂窩網(wǎng)絡信息,任何正在進行的呼叫的狀態(tài)以及PhoneAccount在設備上注冊的任何列表。
READ_SMS:允許應用程序讀取短信链韭。
READ_SYNC_SETTINGS:允許應用程序讀取同步設置偏竟。
READ_SYNC_STATS:允許應用程序讀取同步統(tǒng)計信息。
READ_VOICEMAIL:允許應用程序讀取系統(tǒng)中的語音信箱敞峭。
REBOOT:需要重新啟動設備踊谋。
RECEIVE_BOOT_COMPLETED:允許應用程序收到ACTION_BOOT_COMPLETED在系統(tǒng)完成啟動后廣播的應用程序。
RECEIVE_MMS:允許應用程序監(jiān)視傳入的彩信旋讹。
RECEIVE_SMS:允許應用程序接收短信殖蚕。
RECEIVE_WAP_PUSH:允許應用程序接收WAP推送消息。
RECORD_AUDIO:允許應用程序錄制音頻沉迹。
REORDER_TASKS:允許應用程序更改任務的Z順序睦疫。
REQUEST_COMPANION_RUN_IN_BACKGROUND:允許隨播應用在后臺運行。REQUEST_COMPANION_USE_DATA_IN_BACKGROUND:允許隨播應用在后臺使用數(shù)據(jù)鞭呕。
REQUEST_DELETE_PACKAGES:允許應用程序請求刪除包蛤育。
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS:許可申請必須持有才能使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。
REQUEST_INSTALL_PACKAGES:允許應用程序請求安裝軟件包琅拌。
RESTART_PACKAGES:此常數(shù)在API級別8中已棄用restartPackage(String)缨伊。不再支持API。
SEND_RESPOND_VIA_MESSAGE:允許應用程序(電話)向其他應用程序發(fā)送請求进宝,以處理來電期間的響應通過消息動作。
SEND_SMS:允許應用程序發(fā)送短信枷恕。
SET_ALARM:允許應用程序廣播Intent為用戶設置鬧鐘党晋。
SET_ALWAYS_FINISH:允許應用程序控制是否在后臺放置活動時立即完成。
SET_ANIMATION_SCALE:修改全局動畫縮放因子徐块。
SET_DEBUG_APP:配置應用程序進行調試未玻。
SET_PREFERRED_APPLICATIONS:這個常數(shù)在API級別7中已被棄用。不再有用胡控,addPackageToPreferred(String)有關詳細信息扳剿。
SET_PROCESS_LIMIT:允許應用程序設置可以運行的最大數(shù)量(不需要的)應用程序進程。
SET_TIME:允許應用程序設置系統(tǒng)時間昼激。
SET_TIME_ZONE:允許應用程序設置系統(tǒng)時區(qū)庇绽。
SET_WALLPAPER:允許應用設置壁紙。
SET_WALLPAPER_HINTS:允許應用程序設置壁紙?zhí)崾境壤АIGNAL_PERSISTENT_PROCESSES:允許應用程序請求將信號發(fā)送到所有持久進程瞧掺。
STATUS_BAR:允許應用程序打開,關閉或禁用狀態(tài)欄及其圖標凡傅。
SYSTEM_ALERT_WINDOW:允許應用使用類型創(chuàng)建窗口TYPE_APPLICATION_OVERLAY辟狈,顯示在所有其他應用程序的頂部。
TRANSMIT_IR:允許使用設備的紅外發(fā)射器(如果有的話)。
UNINSTALL_SHORTCUT:不再支持此權限哼转。
UPDATE_DEVICE_STATS:允許應用程序更新設備統(tǒng)計信息明未。
USE_FINGERPRINT:允許應用使用指紋硬件。
USE_SIP:允許應用程序使用SIP服務壹蔓。
VIBRATE:允許訪問振動器趟妥。
WAKE_LOCK:允許使用PowerManager
WakeLock來防止處理器進入睡眠狀態(tài)或屏幕變暗。
WRITE_APN_SETTINGS:允許應用程序寫入apn設置庶溶。
WRITE_CALENDAR:允許應用程序寫入用戶的日歷數(shù)據(jù)煮纵。
WRITE_CALL_LOG:允許應用程序寫入(而不是讀取)用戶的通話記錄數(shù)據(jù)偏螺。
WRITE_CONTACTS:允許應用程序寫入用戶的聯(lián)系人數(shù)據(jù)行疏。
WRITE_EXTERNAL_STORAGE:允許應用程序寫入外部存儲。
WRITE_GSERVICES:允許應用修改Google服務地圖套像。
WRITE_SECURE_SETTINGS:允許應用程序讀取或寫入安全系統(tǒng)設置酿联。
WRITE_SETTINGS:允許應用程序讀取或寫入系統(tǒng)設置。
WRITE_SYNC_SETTINGS:允許應用程序寫入同步設置夺巩。
WRITE_VOICEMAIL:允許應用程序修改和刪除系統(tǒng)中現(xiàn)有的語音信箱贞让。
0x05apk文件獲取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 -iAndroidManifest.xml-onew.WoCloud.AndroidManifest.xml
即可解碼內容擂涛。
0x06.apktool反編譯apk
前面通過壓縮文件直接解壓會導致部分文件未經(jīng)過編碼,因此會出現(xiàn)亂碼聊记,經(jīng)過編譯的文件可以很好的進行查看撒妈,下面介紹使用apktool進行反編譯apk程序,執(zhí)行效果如下圖所示甥雕。
1.下載apktool.jar
https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.2.4.jar
2.將一下腳本保存為apktool.bat
@echo off
if "%PATH_BASE%" == "" setPATH_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系統(tǒng)提供了為應用程序數(shù)據(jù)的備份和恢復功能,此功能的開關決定于該應用程序中AndroidManifest.xml文件中的allowBackup屬性值社露,其屬性值默認是True挟阻。當allowBackup標志為true時,用戶即可通過adb backup和adb restore來進行對應用數(shù)據(jù)的備份和恢復,這可能會帶來一定的安全風險附鸽。當設置該屬性值為true脱拼,adb backup容許任何一個能夠打開USB調試開關的人從Android手機中復制應用數(shù)據(jù)到外設,一旦應用數(shù)據(jù)被備份之后坷备,所有應用數(shù)據(jù)都可被讀认ㄅā;同時adb restore容許用戶指定一個恢復的數(shù)據(jù)來源(即備份的應用數(shù)據(jù))來恢復應用程序數(shù)據(jù)的創(chuàng)建省撑。因此赌蔑,當一個應用數(shù)據(jù)被備份之后,用戶即可在其他Android手機或模擬器上安裝同一個應用竟秫,以及通過恢復該備份的應用數(shù)據(jù)到該設備上娃惯,在該設備上打開該應用即可恢復到被備份的應用程序的狀態(tài)。
對于目前大多數(shù)手機來說肥败,一旦存在該漏洞趾浅,容易導致個人通訊錄、微信馒稍、QQ聊天信息皿哨、短信等敏感信息泄露;通過將備份程序在模擬手機上恢復后纽谒,可以直接進行店家掃描支付(店家掃描支付不需要支付密碼)容易造成財產(chǎn)損失证膨。
(2)影響范圍
Android API等級8(Android 2.2
- 2.2.3)以及以上系統(tǒng),目前絕大部分系統(tǒng)都受影響鼓黔。下面給出Android API等級對應按照系統(tǒng)以及名稱對應的圖標名稱:
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:Android2.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:Android4.0.3 - 4.0.4 Ice Cream Sandwich冰激凌三明治
API等級16:Android 4.1Jelly Bean糖豆
API等級17:Android 4.2Jelly Bean糖豆
API等級18:Android 4.3Jelly Bean糖豆
API等級19:Android 4.4
KitKat奇巧巧克力棒
API等級20 :
Android 4.4W KitKat with wearable extensions奇巧巧克力棒
API等級21:Android5.0-5.0.2 Lollipop棒棒糖
(3)測試流程(以sina.weibo為例)
測試環(huán)境:Windows 7椎例,ADB調試工具;物理接觸目標手機1请祖,連接手機1到PC端
手機1和手機2均未被ROOT,開啟USB調試脖祈;不用安裝其它應用肆捕,不啟動被測試的應用。連接安裝開啟USB調試手機1到PC端盖高,在PC自動(也可以提前)安裝好手機驅動后慎陵,啟動命令行界面輸入以下命令:
ladb devices
#顯示已連接的設備列表,測試手機是否正常連接
ladb backup -nosystem -noshared -apk -f
com.sina.weibo.abcom.sina.weibo
#-nosystem表示不備份系統(tǒng)應用喻奥,-noshared表示不備份應用存儲在SD中的數(shù)據(jù)席纽,-apk表示備份應用APK安裝包,-f表示備份的.ab文件路徑和文件名撞蚕,最后是要備份應用的packageName
l點擊手機1確認備份界面的“備份我的數(shù)據(jù)”
l等待備份完成润梯,至此微博客戶端數(shù)據(jù)成功備份為com.sina.weibo.ab文件
l斷開手機1的連接
l連接手機2,在命令行界面下輸入以下命令:
ladb kill-server#關閉ADB
ladb devices #重新啟動ADB,檢測手機2是否成功連接
ladb restore com.sina.weibo.ab
l點擊手機2確認恢復界面的“恢復我的數(shù)據(jù)”
l等待恢復完成
l打開手機2中新安裝的微博客戶端纺铭,測試可正常登錄手機1中帳號執(zhí)行各種操作寇钉,且長期有效。
(4)安全防護
顯示設置android:allowBackup=false舶赔,使用android:restoreAnyVersion的默認值扫倡。
(5)檢測漏洞
使用apktool等工具反編譯apk后,查看AndroidManifest.xml文件竟纳,查找allowBackup撵溃,如果其值為ture,則表示存在漏洞锥累,如下圖所示缘挑。
2.Debuggable默認設置風險
原理:android:debuggable屬性用于指定應用程序是否能夠被調試,如果設置其為true揩悄,那么其將能夠被java調試工具(jdb)調試卖哎,信息和代碼都將可能會被獲取和修改。
防護:系統(tǒng)默認其為false删性,使用系統(tǒng)默認設置亏娜。
參考文章:
1. android常見漏洞總結,http://blog.sina.com.cn/s/blog_83f3c04c0102xeow.html
2.https://developer.android.com/guide/topics/manifest/manifest-intro.html
3.http://blog.csdn.net/shuaishenkkk/article/details/18400711
4.https://segmentfault.com/a/1190000002590577