Содержание статьи
Почитать
Ошибки работы с разрешениями
Common mistakes when using permissions in Android — статья об ошибках, которые допускают разработчики при декларации собственных разрешений.
Преамбула: в Android есть система разрешений (permissions). Разрешения могут быть уровня normal (они предоставляются без вопросов), dangerous (приложение обязано запросить разрешение у пользователя), signature (приложение должно быть подписано тем же ключом, что и компонент, предоставляемый по разрешению) и нескольких других системных типов, используемых только приложениями из комплекта прошивки.
Кроме того, приложения могут декларировать свои собственные разрешения, которые должны использовать другие приложения для доступа к возможностям этого приложения (запускать активности, получать данные из content provider’ов и так далее). Декларация таких разрешений в манифесте выглядит примерно так:
<permission android:name="com.mycoolcam.USE_COOL_CAMERA" android:protectionLevel="dangerous" /><activity android:name=".CoolCamActivity" android:exported="true" android:permission="com.mycoolcam.USE_COOL_CAMERA"> <intent-filter> <action android:name="com.mycoolcam.LAUNCH_COOL_CAM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter></activity>
Сейчас доступ к активности CoolCamActivity
защищен с помощью разрешения com.
.
А теперь ошибки, которые совершают разработчики, когда декларируют свои разрешения и защищают ими компоненты:
Уровень разрешения не указан. Если в предыдущем примере не указать уровень разрешения (
android:
), он станет normal и в итоге доступ к защищенной активности сможет получить какое угодно приложение (достаточно указать в манифесте, что оно использует это разрешение).protectionLevel="dangerous" -
Уровень разрешения signature не определен во всех приложениях. Допустим, у тебя есть два приложения, которые должны обмениваться данными. Чтобы защитить их от несанкционированного доступа, ты добавляешь в приложение 1 определение разрешения:
<permission android:name="com.mycoolcam.USE_COOL_CAMERA" android:protectionLevel="signature" />При этом в приложении 1 такого определения нет, так как оно только использует это разрешение. В итоге если на устройство установить только второе приложение, то Android, ничего не знающий о разрешении
com.
, автоматически назначит ему уровень normal вместо определенного в приложении 1 уровня signature.mycoolcam. USE_COOL_CAMERA Добавляй определение разрешения во все приложения.
Отсутствие каких‑либо разрешений. Допустим, есть приложение, которое использует системное разрешение
android.
. У этого приложения есть content provider, который предоставляет доступ к базе данных приложения, включая контакты пользователей. И этот content provider не защищен никаким разрешением. В итоге сторонние приложения могут получить доступ к контактам пользователя опосредованно, через это приложение.permission. READ_CONTACTS
Разработчику
Библиотека Security-App-Authenticator
Hands on with Jetpack’s Security App Authenticator library — небольшая заметка о новой библиотеке в комплекте Android Jetpack.
Библиотека нужна для проверки подлинности сертификатов приложений, с которыми будет контактировать твое приложение. Делается это с помощью сверки контрольной суммы сертификата приложения и его сравнения с уже сохраненным списком контрольных сумм. Этакий SSL Pinning для приложений.
Перед тем как использовать библиотеку, в подкаталоге xml
ресурсов приложения необходимо поместить XML-файл с произвольным именем и примерно следующим содержимым:
<?xml version="1.0" encoding="utf-8"?><app-authenticator> <expected-identity> <package name="com.example.app"> <cert-digest>7d5ac0f764d5ae47a051777bb5fc9a96f30b6b4d3bbb95cddb1c32932fb28b10</cert-digest> </package> </expected-identity></app-authenticator>
Этот файл говорит, что приложение с именем пакета com.
должно иметь сертификат с указанной контрольной суммой SHA-256.
Далее можно начать использовать библиотеку:
// Создаем экземпляр аутентификатора из описанного выше XML-файлаval authenticator = AppAuthenticator.createFromResource(context, R.xml.expected_app_identities)// Первый способ проверки сертификатаval result = when (authenticator.checkAppIdentity("com.example.app")) { AppAuthenticator.SIGNATURE_MATCH -> "Signature matches" AppAuthenticator.SIGNATURE_NO_MATCH -> "Signature does not match" else -> return}// Второй способ проверки с выбросом исключенияtry { authenticator.enforceAppIdentity("com.example.app) // ...работаем с приложением} catch (e: SecurityException) { // ...не стоит доверять этому приложению}
Как видно, есть несколько способов проверки. Первый удобно использовать для простых проверок. Второй удобен для использования в функциях работы с проверяемым приложением. Просто добавляем в их начало проверку, и все остальное сделает система обработки исключений.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»