Rīcība nolūka novirzīšanas ievainojamības gadījumā

Šī informācija ir paredzēta tādu lietotņu izstrādātājiem, kurās ir nolūka novirzīšanas ievainojamība.

Problēma

Vienā vai vairākās jūsu lietotnēs ir nolūka novirzīšanas problēma, kas ļauj ļaunprātīgām lietotnēm piekļūt privātiem lietotņu komponentiem vai failiem. Lai novērstu lietotnēs radušās problēmas, pārskatiet tālāk norādītās detalizētās darbības. Pēc jūsu Play Console kontā norādīto termiņu beigām visas lietotnes, kurās nav novērsta drošības ievainojamība, tiks noņemtas no pakalpojuma Google Play.

Nepieciešamā rīcība​

  1. Pierakstieties savā Play Console kontā un sadaļā “Brīdinājumi” skatiet ietekmētās lietotnes un termiņus šo problēmu novēršanai.
  2. Atjauniniet savas ietekmētās lietotnes, veicot tālāk norādītās darbības.
  3. Iesniedziet savu ietekmēto lietotņu atjauninātās versijas.

Pēc atkārtotas iesniegšanas jūsu lietotne tiks vēlreiz pārskatīta. Šis process var ilgt vairākas stundas. Ja pēc pārskatīšanas lietotne tiek apstiprināta un veiksmīgi publicēta, vairs nav jāveic nekādas darbības. Ja pēc pārskatīšanas lietotne netiek apstiprināta, tās jaunā versija netiek publicēta un jums tiek nosūtīts paziņojums pa e-pastu.

Papildinformācija

Neuzticama nolūka izmantošana komponenta palaišanai (piemēram, izsaucot metodi startActivity) vai datu atgriešanai (piemēram, izsaucot metodi setResult) ir bīstama un ļaunprātīgām lietotnēm var ļaut radīt tālāk norādītās problēmas. 

  1. Nozagt sensitīvus failus vai sistēmas datus (piemēram, īsziņas) no jūsu lietotnes
  2. Palaist jūsu lietotnes privātos komponentus, izmantojot kaitīgus argumentus

Ir svarīgi, lai jūsu lietotnē neuzticamiem nolūkiem netiktu izsaukta metode startActivity, startService, sendBroadcast vai setResult, neveicot šo nolūku validēšanu vai desensitivizēšanu.

Ieteicams šo ievainojamību novērst kādā no tālāk norādītajiem veidiem.

1. iespēja: padariet privātu ietekmēto lietotnes komponentu, no kura tiek novirzīts izvilktais nolūks.

Ja ietekmētajam lietotnes komponentam nav jāsaņem nolūki no citām lietotnēm, varat padarīt attiecīgo lietotnes komponentu privātu, savā manifestā iestatot vērtību android:exported=”false”.

2. iespēja: nodrošiniet, lai izvilktais nolūks būtu no uzticama avota.

Varat pārliecināties par sākotnējās darbības uzticamību, izmantojot tādas metodes kā getCallingActivity. Tālāk ir sniegts piemērs.

 // pārbaudiet, vai sākotnējā darbība ir no uzticamas pakotnes
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // izvelciet ligzdoto nolūku
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // novirziet ligzdoto nolūku
   startActivity(forward);
 }

Piezīmes.

  • Lai novērstu ievainojamību, nepietiek ar pārbaudi, vai getCallingActivity() nosūta vērtību, kas nav nulle. Ļaunprātīgas lietotnes šai funkcijai var sniegt nulles vērtību.
  • Ja tiek izmantota Google Play pakalpojumu saskarne SMS Retriever Auth, apraides uztvērēju var aizsargāt ar atļauju SEND_PERMISSION, lai nodrošinātu, ka nolūks tiek iegūts no Play pakalpojumiem.

3. iespēja: nodrošiniet, lai novirzīšanai paredzētais nolūks nebūtu kaitīgs.

Nodrošiniet, lai pārsūtītais nolūks:

  1. netiktu nosūtīts uz jūsu lietotnes privātajiem komponentiem;
  2. netiktu nosūtīts uz ārēju lietotnes komponentu. Ja novirzīšanas galamērķis ir ārēja lietotne, gādājiet, lai nolūks nepiešķirtu URI atļauju nevienam no jūsu lietotnes privātajiem satura nodrošinātājiem vai sistēmas datiem.

Lietotnēs var pārbaudīt, kurš komponents tiks izmantots nolūka apstrādei pirms tā novirzīšanas, izmantojot tādas metodes kā resolveActivity. Tālāk ir sniegts piemērs.

 Intent intent = getIntent();
 // izvelciet ligzdoto nolūku
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // iegūstiet komponenta nosaukumu
 ComponentName name = forward.resolveActivity(getPackageManager());
 // pārbaudiet, vai pakotnes nosaukums un klases nosaukums atbilst plānotajam
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // novirziet ligzdoto nolūku
   startActivity(forward);
 }

Lietotnēs var pārbaudīt, vai nolūks piešķir URI atļauju, izmantojot tādas metodes kā getFlags. Tālāk ir sniegts piemērs.

 // izvelciet ligzdoto nolūku
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // iegūstiet karodziņus
 int flags = forward.getFlags();
 // pārbaudiet, vai ligzdotais nolūks nepiešķir URI atļaujas
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // novirziet ligzdoto nolūku
   startActivity(forward);
 }

Lietotnes var arī noņemt piešķirtās URI atļaujas, izmantojot metodi removeFlags. Tālāk ir sniegts piemērs.

 // neuzticams nolūks
 Intent intent = getIntent();
 // noņemiet piešķirtās URI atļaujas neuzticamajā nolūkā
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // novirziet neuzticamo nolūku
 setResult(intent);

Izpratne par brīdinājumiem un novēršanas iespējas izvēli 

Play Console brīdinājums norāda, kur jūsu lietotne izsauc metodi startActivity, startActivityForResult, startService, sendBroadcast vai setResult, izmantojot neuzticamu nolūku. Lai labāk izprastu, kura iespēja ir vispiemērotākā, izpētiet metožu izsaucējus un uzziniet, kur tiek iegūts neuzticamais nolūks. Piemēram, izvēloties 1. iespēju, izpētiet, kuru komponentu padarīt privātu.

Mēs jums palīdzēsim

Ja jums ir tehniski jautājumi par ievainojamību, varat tos publicēt vietnē Stack Overflow, izmantojot atzīmi “android-security”. Lai uzzinātu, kā novērst šo problēmu, varat sazināties ar mūsu izstrādātāju atbalsta komandu.

false
Galvenā izvēlne
17985394132743146365
true
Meklēšanas palīdzības centrs
true
true
true
true
true
5016068
false
false