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

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

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

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

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

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

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

Дополнительные сведения

Этой уязвимости подвержены приложения, которые извлекают намерения из поля "Разное" ненадежного намерения и запускают для них компонент с помощью метода startActivity (или аналогичного startService). Злоумышленники могут обманным путем заставить эти приложения запускать произвольные закрытые компоненты. Это может привести к выполнению нежелательных действий над зараженными аргументами и/или к краже конфиденциальных файлов через предоставленные разрешения URI.

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

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

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

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

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

 // check if the originating Activity is from trusted package
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extract the nested Intent
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // redirect the nested Intent
   startActivity(forward);
 }

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

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

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

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

 Intent intent = getIntent();
 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the component name
 ComponentName name = forward.resolveActivity(getPackageManager());
 // check that the package name and class name are as intended
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // redirect the nested Intent
   startActivity(forward);
 }

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

 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the flags
 int flags = forward.getFlags();
 // check that the nested intent does not grant URI permissions
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION > 0) ||
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION > 0) {
   // redirect the nested Intent
   startActivity(forward);
 }

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

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

Эта информация оказалась полезной?
Как можно улучшить эту статью?