Создание или отправка намерения при активности должны соответствовать следующим правилам:
4.1.2.1 Обязательно: активность, используемая только внутри приложения, должна быть установлена как приватная.
Активность, которая используется только в одном приложении и не должна получать намерения из других приложений, часто считается приватной и должна быть явно установлена как таковая, чтобы предотвратить получение вредоносного содержимого.
Пример кода на AndroidManifest.xml:
<!-- Private activity -->
<!-- *** POINT 3 *** Explicitly set the exported attribute to false. -->
<activity
android:name=".PrivateActivity"
android:label="@string/app_name"
android:exported="false" />
4.1.2.2 Обязательно: не следует указывать taskAffinity.
В операционной системе Android активность управляется задачами. Имя задачи определяется аффинностью корня активности. С другой стороны, для активностей, отличных от корня, принадлежность к задаче зависит не только от аффинности, но и от режима запуска активности. Подробнее см. раздел «4.1.3.4 Корень активности».
По умолчанию каждая активность использует имя пакета в качестве аффинности. Таким образом, задачи распределяются по приложениям, и все активности в одном приложении принадлежат одной и той же задаче. Чтобы изменить распределение задач, можно явно объявить аффинность в файле AndroidManifest.xml или установить флаг в намерении, отправляемом активности. Однако изменение распределения задач может представлять риск, поскольку другие приложения могут считывать некоторую информацию из намерений, отправленных или полученных активностями, принадлежащими другим задачам.
Важно не указывать android:taskAffinity в файле AndroidManifest.xml и использовать настройки по умолчанию, устанавливая аффинность как имя пакета, чтобы предотвратить доступ других приложений к чтению или отправке конфиденциальной информации в намерениях.
Вот пример файла AndroidManifest.xml для создания и использования приватных активностей:
AndroidManifest.xml
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<!-- Private activity -->
<!-- *** POINT 1 *** Do not specify taskAffinity -->
<activity
android:name=".PrivateActivity"
android:label="@string/app_name"
android:exported="false"/>
</application>
Для получения дополнительной информации о задачах и аффинностях см. «Руководство по программированию Google Android» [2], руководство по API разработчика Google «Задачи и стек возврата» [3], разделы «4.1.3.3 Чтение намерений, направленных на активность» и «4.1.3.4 Корень активности».
[2] Автор Эгава, Фуджи, Асано, Фудзита, Ямада, Ямаока, Сано, Такебата, «Руководство по программированию Google Android», ASCII Media Works, июль 2009 г.
[3] http://developer.android.com/guide/components/tasks-and-back-stack.html
4.1.2.3 Обязательно: не следует задавать launchMode.
Режим запуска активности определяет настройки при запуске активности, которые используются для создания новых задач и экземпляров активности. По умолчанию он установлен на «стандартный». В настройке «стандартный» новый экземпляр всегда создаётся при запуске активности, задача соответствует вызывающей активности и невозможно создать новую задачу. При создании новой задачи другие приложения могут читать содержимое намерения, поэтому необходимо использовать настройку «стандартная» для режима запуска активности, когда конфиденциальная информация содержится в намерении. Режим запуска активности можно явно задать в свойстве android:launchMode атрибута AndroidManifest.xml, но по причинам, указанным выше, его не следует устанавливать в объявлении активности, и значение должно оставаться по умолчанию «стандартным».
См. разделы «4.1.3.3 Чтение намерений, направленных на активность» и «4.1.3.4 Корень активности» для получения дополнительной информации.
4.1.2.4 Обязательно: Не следует устанавливать FLAG_ACTIVITY_NEW_TASK для намерения запустить активность.
При выполнении startActivity() или startActivityForResult() можно изменить режим запуска Activity, и в некоторых случаях это может привести к созданию новой задачи. Поэтому важно не изменять режим запуска активности во время выполнения.
Чтобы изменить режим запуска активности, используйте методы setFlags() или addFlags(), чтобы установить флаги Intent, и используйте этот Intent в качестве параметра для startActivity() или startActivityForResult(). FLAG_ACTIVITY_NEW_TASK — это флаг, используемый для создания новой задачи. Если установлен FLAG_ACTIVITY_NEW_TASK, новая задача будет создана, если вызываемая активность не существует ни в фоновом режиме, ни на переднем плане. Можно одновременно установить FLAG_ACTIVITY_MULTIPLE_TASK. В этом случае всегда будет создаваться новая задача. Новые задачи могут быть созданы любым способом установки, поэтому не следует использовать намерения с конфиденциальной информацией для установки этих флагов.
Кроме того, даже если вы явно установите FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS для создания новой задачи, вы можете подумать, что есть способ предотвратить чтение содержимого Intent. Однако содержимое также может быть прочитано третьими сторонами, поэтому вам следует избегать использования FLAG_ACTIVITY_NEW_TASK.
См. разделы «4.1.3.1 Объединение атрибутов экспорта и настроек фильтра намерений (для активности)», «4.1.3.3 Чтение намерений, направленных на активность» и «4.1.3.4 Корень активности».
4.1.2.5 Рекомендуется: Будьте осторожны и безопасны при обработке полученных намерений.
Риск зависит от типа активности, но при обработке данных намерения первое, что вы должны сделать, это проверить ввод.
Поскольку публичные активности могут получать намерения от ненадёжных источников, они могут подвергаться атакам вредоносных программ. С другой стороны, приватные активности никогда не будут напрямую получать какие-либо намерения от других приложений, но целевое приложение может перенаправить злонамеренное намерение приватным активностям, поэтому вы не должны предполагать, что приватные активности не получат никакого вредоносного ввода. Поскольку партнёрские и внутренние активности также подвержены риску злонамеренного перенаправления намерений, необходимо проверять эти намерения.
См. раздел 3.2 4.1.2.6
После того как вы проверили полномочия для подписи внутри приложения, используйте определённые внутри приложения полномочия для подписи (обязательно).
При создании активности защитите свою внутреннюю активность с помощью определённых полномочий для подписи. Поскольку определение полномочий или объявление запроса на полномочия в файле AndroidManifest.xml не обеспечивает достаточную безопасность, обратитесь к разделу «5.2.1.2 Как использовать определённые внутри приложения полномочия для подписи при обмене данными между внутренними приложениями».
4.1.2.7
Обратите внимание на возможную утечку информации при возврате результата (обязательно).
Когда вы используете setResult() для возврата данных, надёжность целевого приложения будет зависеть от типа Activity. Когда публичная активность используется для возврата данных, целевая активность может стать вредоносным программным обеспечением, и в этом случае информация может быть использована злонамеренно. Для частных и внутренних активностей не нужно слишком беспокоиться о том, что возвращаемые данные будут использованы злонамеренно, поскольку они возвращаются в контролируемое вами приложение. В партнёрских активностях есть некоторые вещи.
Как уже говорилось, когда вы возвращаете данные из активности, вам необходимо обратить внимание на утечку информации из целевого приложения.
public void onReturnResultClick(View view) {
// *** POINT 6 *** Information that is granted to be disclosed to a partner application can be returned.
Intent intent = new Intent();
intent.putExtra("RESULT", "Sensitive Info");
setResult(RESULT_OK, intent);
finish();
}
4.1.2.8
Если целевая активность заранее определена, используйте явное намерение (обязательно).
Когда Activity используется через неявное намерение, Intent отправляется в Activity, определённую Android OS. Если намерение ошибочно отправлено вредоносному программному обеспечению, может произойти утечка информации. С другой стороны, когда Activity используется через явное намерение, только ожидаемая Activity получит Intent, поэтому это более безопасно. Если только пользователь не должен определить, куда должно быть отправлено намерение, следует использовать явное намерение и указать цель заранее.
Intent intent = new Intent(this, PictureActivity.class);
intent.putExtra("BARCODE", barcode);
startActivity(intent);
Intent intent = new Intent();
intent.setClassName(
"org.jssec.android.activity.publicactivity",
"org.jssec.android.activity.publicactivity.PublicActivity");
startActivity(intent);
Однако даже при использовании явного намерения для доступа к публичной активности другого приложения целевая активность также может быть вредоносным ПО. Это связано с тем, что даже если программное обеспечение ограничено по имени пакета, вредоносное приложение всё равно может подделать то же имя пакета, что и у реального приложения. Чтобы устранить этот риск, необходимо рассмотреть возможность использования партнёрской или внутренней активности.
См. раздел «4.1.3.1 Комбинирование экспорта атрибутов и настройки фильтров намерений (для активности)».
4.1.2.9
Будьте осторожны и безопасно обрабатывайте возвращаемые данные из запрошенной активности (обязательно).
В зависимости от типа активности, к которой вы обращаетесь, риски немного различаются, но при обработке Intent-данных, полученных в качестве возвращаемого значения, вам всегда необходимо выполнять проверку ввода для полученных данных. Публичные активности должны принимать возвращаемые намерения из недоверенных источников, поэтому при доступе к публичным активностям возвращаемое намерение фактически может быть отправлено вредоносным программным обеспечением. Люди часто ошибочно полагают, что всё содержимое, возвращаемое частными активностями, является безопасным, потому что оно исходит из одного и того же приложения. Однако, поскольку намерение может быть косвенно перенаправлено из ненадёжного источника, вы не должны слепо доверять содержимому этого намерения. Партнёрские и внутренние активности имеют определённый риск между частными и публичными активностями. Вы также должны проверить ввод этих активностей. Для получения дополнительной информации см. раздел «3.2 Тщательно и безопасно обрабатывать входные данные».
4.1.2.10
Если вы связаны с приложением другой компании, проверьте целевую активность (обязательно).
При связывании с приложением другой компании убедитесь, что белый список определён. Вы можете сохранить копию хэша сертификата компании в приложении и использовать хэш сертификата целевого приложения для проверки. Это предотвратит обман Intent. Конкретный метод реализации см. в примере кода «4.1.1.3 Создание/использование партнёрской активности». Технические детали см. в разделе «4.1.3.2 Проверка запрашивающего приложения».
4.2.11
Предоставляйте вторичные материалы с одинаковой защитой (обязательно).
Когда информация или функциональные материалы, защищённые полномочиями, предоставляются другому приложению, вы должны убедиться, что они имеют доступ к материалам с теми же полномочиями. В модели безопасности полномочий Android OS только приложение, получившее соответствующие полномочия, может напрямую обращаться к защищённым материалам. Однако существует уязвимость, поскольку приложение с материалами может действовать как прокси и разрешать доступ к ним непривилегированным приложениям. По сути, это то же самое, что повторное предоставление полномочий, поэтому его называют проблемой повторного предоставления полномочий. См. раздел «5.2.3.4 Проблема повторного предоставления полномочий».
4.2.12
Отправка чувствительной информации должна быть максимально ограничена (рекомендуется).
Вы не должны отправлять чувствительную информацию ненадёжным сторонам. Даже если вы подключаетесь к определённому приложению, существует вероятность непреднамеренной отправки Intent другому приложению или злонамеренная третья сторона может украсть ваш Intent. См. раздел «4.1.3.5 Использование журналов активности во время вывода».
Отправляя чувствительные данные при активации, вы должны учитывать риск утечки информации. Вы должны предположить, что все данные в Intent, отправленном в публичную активность, могут быть получены злонамеренной третьей стороной. Кроме того, в зависимости от реализации, существуют различные риски утечки информации при отправке Intent в партнёрскую или внутреннюю активность. Даже отправка данных в частную активность представляет риск, поскольку данные в намерении могут просочиться через LogCat. Информация, добавленная в часть дополнения Intent, не выводится в LogCat, поэтому лучше всего хранить чувствительную информацию там.
Тем не менее, единственный идеальный способ предотвратить утечку информации — не отправлять чувствительные данные в первую очередь, поэтому вы должны максимально ограничить количество отправляемой чувствительной информации. Когда необходимо отправить чувствительную информацию, лучше всего отправлять её только доверенной активности и гарантировать, что информация не просачивается через LogCat.
Кроме того, чувствительная информация не должна отправляться в корневую активность. Корневая активность — это активность, которая вызывается первой при создании задачи. Например, активность, запускаемая из средства запуска, всегда является корневой активностью.
Для получения дополнительных сведений о корневой активности см. разделы «4.1.3.3 Отправка Intent в активность» и «4.1.3.4 Корневая активность».
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )