Как устранить уязвимость, связанную с перенаправлением намерений

Эта информация предназначена для разработчиков, чьи приложения уязвимы для перенаправления намерений.

Что происходит

Одно или несколько ваших приложений содержат уязвимость, связанную с перенаправлением намерений. Вредоносные приложения могут воспользоваться этим и получить доступ к закрытым компонентам или файлам приложений. Чтобы решить проблему, выполните описанные ниже действия до даты, указанной в Play Console. После нее приложения, содержащие уязвимость, будут удалены из Google Play.

Что нужно сделать

  1. Чтобы узнать, какие приложения уязвимы и в какой срок нужно решить проблему, войдите в Play Console и откройте раздел "Оповещения".
  2. Обновите приложения, следуя приведенным ниже инструкциям.
  3. Опубликуйте обновленные версии приложений.

После этого мы проведем повторную проверку, которая может занять несколько часов. Если мы убедимся, что уязвимость устранена, то опубликуем приложение и дополнительных действий с вашей стороны не потребуется. В противном случае новая версия не будет опубликована, а вы получите уведомление по электронной почте.

Сведения об уязвимости

Использовать ненадежные намерения для запуска компонента (например, с помощью метода startActivity) или показа результатов (например, с помощью метода setResult) опасно, потому что вредоносные приложения могут:

  1. Украсть из приложения конфиденциальные файлы и системные данные (например, SMS).
  2. Запустить закрытые компоненты приложения с измененными аргументами.

Приложение не должно вызывать методы startActivity, startService, sendBroadcast и setResult для ненадежных намерений без подтверждения таких намерений или обеспечения безопасности их использования.

Вы можете устранить уязвимость одним из приведенных ниже способов.

Вариант 1. Сделайте уязвимый компонент приложения, из которого перенаправляется извлеченное намерение, закрытым.

Если уязвимому компоненту не нужно получать намерения от других приложений, вы можете сделать его закрытым, указав в манифесте значение android:exported="false".

Вариант 2. Настройте проверку надежности источника.

Чтобы убедиться, что исходному действию можно доверять, используйте метод getCallingActivity. Пример:

 // проверка надежности пакета исходного действия
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // извлечение вложенного намерения
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // перенаправление вложенного намерения
   startActivity(forward);
 }

Примечание.

  • Для устранения уязвимости недостаточно просто проверить, что метод getCallingActivity() возвращает не нулевое значение. Вредоносные программы могут предоставить нулевое значение для этой функции.
  • Если активен API SMS Retriever Auth сервисов Google Play, защита широковещательного приемника с помощью разрешения SEND_PERMISSION позволит получать намерение от сервисов Google Play.

Вариант 3. Настройте проверку перенаправляемого намерения.

Необходимо убедиться в следующем:

  1. После перенаправления намерение не попадет в закрытые компоненты приложения.
  2. Намерение не будет отправлено во внешний компонент приложения. Если перенаправление осуществляется на внешнее приложение, убедитесь, что намерение не будет предоставлять разрешение URI частным поставщикам контента в приложении или системным данным.

Чтобы узнать, какой компонент приложения будет обрабатывать намерение до его перенаправления, используйте метод resolveActivity. Пример:

 Intent intent = getIntent();
 // извлечение вложенного намерения
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // получение имени компонента
 ComponentName name = forward.resolveActivity(getPackageManager());
 // проверка имени пакета и класса
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // перенаправление вложенного намерения
   startActivity(forward);
 }

Чтобы проверять, предоставляет ли намерение разрешения URI, используйте такие методы, как getFlags. Пример:

 // извлечение вложенного намерения
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // получение флагов
 int flags = forward.getFlags();
 // проверка того, не предоставляет ли вложенное намерение разрешения URI
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // перенаправление вложенного намерения
   startActivity(forward);
 }

С помощью метода removeFlags можно удалять разрешения URI. Пример:

 // ненадежное намерение
 Intent intent = getIntent();
 // удаление разрешений URI ненадежного намерения
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // передача ненадежного намерения
 setResult(intent);

Для чего нужны оповещения, и как выбрать способ предотвращения

Благодаря оповещениям в Play Console вы можете узнавать, когда приложение вызывает методы startActivity, startActivityForResult, startService, sendBroadcast или setResult с использованием ненадежного намерения. Чтобы понимать, какой способ предотвращения больше подходит в вашей ситуации, определите, какие фрагменты кода вызывают методы. Это позволит понять, откуда появилось ненадежное намерение. Например, в случае варианта 1 необходимо определить, какой компонент нужно сделать закрытым.

Мы всегда готовы помочь

Если у вас есть вопросы об уязвимости, задайте их на Stack Overflow, используя тег "android-security". Чтобы получить более подробные разъяснения, свяжитесь с командой поддержки для разработчиков.

Эта информация оказалась полезной?

Как можно улучшить эту статью?
false
Главное меню
847580048526597715
true
Поиск по Справочному центру
true
true
true
true
true
5016068
false
false