Отстраняване на уязвимостта от пренасочване на намерения

Тази информация е предназначена за програмисти, чиито приложения съдържат уязвимостта от пренасочване на намерения.

Какво се случва

Едно или повече от приложенията ви съдържат проблем, свързан с пренасочване на намерения (обекти Intent), който може да даде възможност на злонамерени приложения да осъществят достъп до поверителни компоненти или файлове на приложението. Моля, прегледайте подробните стъпки по-долу, за да отстраните проблема. След крайните срокове, показани в Play Console, всички приложения, които съдържат уязвимости в сигурността, ще бъдат премахнати от Google Play.

Изисква се действие​

  1. Влезте в профила си в Play Console и преминете към секцията „Сигнали“, за да видите кои приложения са засегнати и крайните срокове за решаване на тези проблеми.
  2. Актуализирайте засегнатите приложения, като изпълните долупосочените стъпки.
  3. Изпратете актуализираните версии на засегнатите приложения.

При повторно изпращане приложението ви ще бъде прегледано отново. Този процес може да отнеме няколко часа. Ако приложението премине проверката и бъде публикувано успешно, няма нужда да правите нищо повече. В противен случай новата му версия няма да бъде публикувана и ще получите известие по имейл.

Допълнителни подробности

Използването на ненадеждно намерение за стартиране на компонент (например чрез извикване на startActivity) или за връщане на данни (например чрез извикване на setResult) е опасно и може да даде възможност на злонамерените приложения да предизвикат следните проблеми:

  1. кражба на поверителни файлове или системни данни (като например SMS съобщения) от приложението ви;
  2. стартиране на частните компоненти на приложението ви чрез компрометирани аргументи.

Важно е приложението ви да не извиква startActivity, startService, sendBroadcast или setResult в ненадеждните намерения, без да потвърждава или проверява намеренията.

Препоръчваме ви да предотвратите тази уязвимост по един от следните начини:

Вариант 1: Направете частен засегнатия компонент на приложението, от който се пренасочва извлеченото намерение.

Ако засегнатият компонент на приложението няма нужда да получава намерения от други приложения, можете да го направите частен, като зададете android:exported=”false” в манифеста.

Вариант 2: Уверете се, че извлеченото намерение е от надежден източник.

Можете да проверите дали активността източник (Activity) е надеждна чрез методи като getCallingActivity. Например:

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

Забележка:

  • Проверката дали getCallingActivity() връща стойност, различна от нула, не е достатъчна за предотвратяване на уязвимостта. Злонамерените приложения могат да предоставят нулева стойност за тази функция.
  • Ако използвате 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);
 }

Приложенията могат да използват методи като getFlags, за да проверят дали дадено намерение предоставя разрешение за URI адрес. Например:

 // извличане на вложеното намерение
 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);
 }

Те могат също да премахват предоставени разрешения за URI адрес посредством removeFlags. Например:

 // ненадеждно намерение
 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
Главно меню
3007547245915306542
true
Търсене в Помощния център
true
true
true
true
true
5016068
false
false