Решавање пропуста у вези са преусмеравањем намере

Ове информације су намењене програмерима са апликацијама које садрже пропуст у вези са преусмеравањем намере.

Шта се дешава

Једна или више апликација садржe проблем у вези са преусмеравањем намере, што злонамерним апликацијама може да омогући да приступају приватним компонентама или датотекама апликација. Прегледајте детаљне кораке у наставку да бисте решили проблем са апликацијама. Уклонићемо из Google Play-а све апликације које и после датума наведених у Play конзоли буду садржале безбедносне пропусте.

Треба да реагујете​

  1. Пријавите се у Play конзолу и идите до одељка Обавештења да бисте видели које апликације су угрожене и рокове за решавање тих проблема.
  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 услуге, заштитом broadcast receiver-а помоћу ставке SEND_PERMISSION обезбедићете да намера потиче из 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);
 }

Апликације могу и да уклањају одобравања дозвола за 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 конзоле пријављује када апликација позива startActivity, startActivityForResult, startService, sendBroadcast или setResult помоћу непоуздане намере. Да бисте боље разумели која опција за спречавање је најприкладнија, откријте порекло и погледајте позиваоце метода да бисте открили одакле потиче непоуздана намера. На пример, за 1. опцију откријте порекло да бисте одредили коју компоненту ћете учинити приватном.

Ту смо да помогнемо

Ако имате техничких питања у вези са пропустом, можете да их поставите на Stack Overflow помоћу ознаке „android-security“. Да бисте боље разумели кораке које треба да предузмете за решавање овог проблема, обратите се тиму подршке за програмере.

false
Главни мени
17588399673380046451
true
Центар за помоћ за претрагу
true
true
true
true
true
5016068
false
false