14.03.2016 @ 12:36 Android Application Security, часть 7. Разбираемся с файлом AndroidManifest.xml. android Данная статья является переводом соответствующей статьи Aditya Agrawal. Оригинал доступен по ссылке. Файл AndroidManifest.xml является достаточно важной частью файла APK (особенно когда речь идёт о безопасности). В файле AndroidManifest.xml должен быть упомянут каждый Service, ContentProvider, Activity, Broadcast Receiver. Давайте разберёмся поподробнее в AndroidManifest.xml. Но сначала я хотел бы рассказать о нескольких важных методах просмотра декомпилированного файла AndroidManifest.xml. Метод #1: с использованием Drozer. В Drozer есть модуль, который называется app.package.manifest, который показывает содержимое файла AndroidManifest.xml указанного приложения в консоли Drozer. Введите в консоль Drozer run app.package.manifest org.owasp.goatdroid.fourgoats, и на экран выведется информация, приведённая ниже. AndroidManifest.xml <manifest versionCode="1" versionName="1.0" package="org.owasp.goatdroid.fourgoats"> <uses-sdk minSdkVersion="9" targetSdkVersion="15"> </uses-sdk> <application theme="@2131361870" label="@2131296266" icon="@2130837632" debuggable="true"> <activity label="@2131296266" name=".activities.Main"> <intent-filter> <action name="android.intent.action.MAIN"> </action> <category name="android.intent.category.LAUNCHER"> </category> </intent-filter> </activity> <activity label="@2131296267" name=".activities.Login"> </activity> <activity label="@2131296268" name=".activities.Register"> </activity> <activity label="@2131296284" name=".activities.Home"> </activity> <activity label="@2131296285" name=".fragments.DoCheckin"> </activity> <activity label="@2131296269" name=".activities.Checkins"> </activity> <activity label="@2131296271" name=".activities.Friends"> </activity> <activity label="@2131296272" name=".fragments.HistoryFragment"> </activity> <activity label="@2131296272" name=".activities.History"> </activity> <activity label="@2131296270" name=".activities.Rewards"> </activity> <activity label="@2131296287" name=".activities.AddVenue"> </activity> <activity label="@2131296291" name=".activities.ViewCheckin" exported="true"> </activity> <activity label="@2131296292" name=".fragments.MyFriends"> </activity> <activity label="@2131296294" name=".fragments.SearchForFriends"> </activity> <activity label="@2131296274" name=".activities.ViewProfile" exported="true"> </activity> <activity label="@2131296296" name=".fragments.PendingFriendRequests"> </activity> <activity label="@2131296297" name=".activities.ViewFriendRequest"> </activity> <activity label="@2131296301" name=".fragments.MyRewards"> </activity> <activity label="@2131296302" name=".fragments.AvailableRewards"> </activity> <activity label="@2131296303" name=".activities.Preferences"> </activity> <activity label="@2131296306" name=".activities.About"> </activity> <activity label="@2131296310" name=".activities.SendSMS"> </activity> <activity label="@2131296313" name=".activities.DoComment"> </activity> <activity label="@2131296272" name=".activities.UserHistory"> </activity> <activity label="@2131296316" name=".activities.DestinationInfo"> </activity> <activity label="@2131296328" name=".activities.AdminHome"> </activity> <activity label="@2131296330" name=".activities.AdminOptions"> </activity> <activity label="@2131296326" name=".fragments.ResetUserPasswords"> </activity> <activity label="@2131296327" name=".fragments.DeleteUsers"> </activity> <activity label="@2131296325" name=".activities.DoAdminPasswordReset"> </activity> <activity label="@2131296327" name=".activities.DoAdminDeleteUser"> </activity> <activity label="@2131296329" name=".activities.SocialAPIAuthentication" exported="true"> </activity> <activity label="@2131296266" name=".activities.GenericWebViewActivity"> </activity> <service name=".services.LocationService"> <intent-filter> <action name="org.owasp.goatdroid.fourgoats.services.LocationService"> </action> </intent-filter> </service> <receiver label="Send SMS" name=".broadcastreceivers.SendSMSNowReceiver"> <intent-filter> <action name="org.owasp.goatdroid.fourgoats.SOCIAL_SMS"> </action> </intent-filter> > </receiver> </application> <uses-permission name="android.permission.SEND_SMS"> </uses-permission> <uses-permission name="android.permission.CALL_PHONE"> </uses-permission> <uses-permission name="android.permission.ACCESS_COARSE_LOCATION"> </uses-permission> <uses-permission name="android.permission.ACCESS_FINE_LOCATION"> </uses-permission> <uses-permission name="android.permission.INTERNET"> </uses-permission> </manifest> Метод #2: после декомпиляции APK-файла с использованием apktool. Введите в консоль apktool d «OWASP GoatDroid-FourGoats Android App.apk», после чего указанный APK-файл приложения FourGoats будет декомпилирован. Теперь вы можете просто открыть файл AndroidManifest.xml из созданной программой папки. Метод #3: с использованием AndroGuard. Используется плагин AndroGuard в Sublime Text, который который производит все действия намного проще, чем работая с файлами androguard. Ниже приведена анимация, которая описывает данный процесс: Я бы посоветовал придерживаться метода #1, т.к. остальные методы имеют ограниченную область применения. Я не отрицаю тот факт, что apktool и AndroGuard — тоже хорошие инструменты, но не полностью подходят для этой цели. В Android компонент считается открытым, если атрибут exported (в AndroidManifest.xml) установлен в true. Но он также является открытым, если для него установлен атрибут intent-filter (intent-фильтр, «фильтр назначения»). Однако разработчики могут в явном виде делать компоненты закрытыми (несмотря ни на какие intent-фильтры), устанавливая атрибут exported в false. Разработчики могут также устанавливать значения атрибута permission («разрешения») для получения некоторых разрешений для отдельных компонентов, таким образом ограничивая их права. AndroidManifest.xml (с пояснениями) <manifest versionCode="1" versionName="1.0" package="org.owasp.goatdroid.fourgoats"> ## minSdkversion говорит от уровне API, ниже которого приложение не запустится. ## У каждого релиза Android есть свой уровень API. У Android 4.4.4 уровень API равен 19. <uses-sdk minSdkVersion="9" targetSdkVersion="15"> </uses-sdk> ## Тег "application" рассказывает детальнее о ресурсах. <application theme="@2131361870" label="@2131296266" icon="@2130837632" debuggable="true"> ## Здесь тегами "activity" определены несколько Activity с разным значением поля "name". ##Это Activity экспортируется, т.к. используется intent-filter. <activity label="@2131296266" name=".activities.Main"> <intent-filter> <action name="android.intent.action.MAIN"> </action> <category name="android.intent.category.LAUNCHER"> </category> </intent-filter> </activity> <activity label="@2131296267" name=".activities.Login"> </activity> <activity label="@2131296268" name=".activities.Register"> </activity> <activity label="@2131296284" name=".activities.Home"> </activity> <activity label="@2131296285" name=".fragments.DoCheckin"> </activity> <activity label="@2131296269" name=".activities.Checkins"> </activity> <activity label="@2131296271" name=".activities.Friends"> </activity> <activity label="@2131296272" name=".fragments.HistoryFragment"> </activity> <activity label="@2131296272" name=".activities.History"> </activity> <activity label="@2131296270" name=".activities.Rewards"> </activity> <activity label="@2131296287" name=".activities.AddVenue"> </activity> ## Экспортируемое Activity <activity label="@2131296291" name=".activities.ViewCheckin" exported="true"> </activity> <activity label="@2131296292" name=".fragments.MyFriends"> </activity> <activity label="@2131296294" name=".fragments.SearchForFriends"> </activity> ## Экспортируемое Activity <activity label="@2131296274" name=".activities.ViewProfile" exported="true"> </activity> <activity label="@2131296296" name=".fragments.PendingFriendRequests"> </activity> <activity label="@2131296297" name=".activities.ViewFriendRequest"> </activity> <activity label="@2131296301" name=".fragments.MyRewards"> </activity> <activity label="@2131296302" name=".fragments.AvailableRewards"> </activity> <activity label="@2131296303" name=".activities.Preferences"> </activity> <activity label="@2131296306" name=".activities.About"> </activity> <activity label="@2131296310" name=".activities.SendSMS"> </activity> <activity label="@2131296313" name=".activities.DoComment"> </activity> <activity label="@2131296272" name=".activities.UserHistory"> </activity> <activity label="@2131296316" name=".activities.DestinationInfo"> </activity> <activity label="@2131296328" name=".activities.AdminHome"> </activity> <activity label="@2131296330" name=".activities.AdminOptions"> </activity> <activity label="@2131296326" name=".fragments.ResetUserPasswords"> </activity> <activity label="@2131296327" name=".fragments.DeleteUsers"> </activity> <activity label="@2131296325" name=".activities.DoAdminPasswordReset"> </activity> <activity label="@2131296327" name=".activities.DoAdminDeleteUser"> </activity> ## Для этого Activity был установлен флаг "exported", т.е. другие приложения могут получать доступ к этому Activity приложения FourGoats. <activity label="@2131296329" name=".activities.SocialAPIAuthentication" exported="true"> </activity> <activity label="@2131296266" name=".activities.GenericWebViewActivity"> </activity> ## Здесь указан Service, который тоже экспортируется, т.к. используется intent-filter. <service name=".services.LocationService"> <intent-filter> <action name="org.owasp.goatdroid.fourgoats.services.LocationService"> </action> </intent-filter> </service> ## Здесь тегом "receiver" указан Receiver, который также экспортируется, т.к. используется intent-filter. <receiver label="Send SMS" name=".broadcastreceivers.SendSMSNowReceiver"> <intent-filter> <action name="org.owasp.goatdroid.fourgoats.SOCIAL_SMS"> </action> </intent-filter> </receiver> </application> ## Здесь указаны разрешения, требуемые приложением. <uses-permission name="android.permission.SEND_SMS"> </uses-permission> <uses-permission name="android.permission.CALL_PHONE"> </uses-permission> <uses-permission name="android.permission.ACCESS_COARSE_LOCATION"> </uses-permission> <uses-permission name="android.permission.ACCESS_FINE_LOCATION"> </uses-permission> <uses-permission name="android.permission.INTERNET"> </uses-permission> </manifest> Надеюсь, что я доступно объяснил, что из себя представляет файл AndroidManifest.xml. div 7479 Mobile security Читать дальше >>