Šī 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
- Pierakstieties savā Play Console kontā un sadaļā “Brīdinājumi” skatiet ietekmētās lietotnes un termiņus šo problēmu novēršanai.
- Atjauniniet savas ietekmētās lietotnes, veicot tālāk norādītās darbības.
- 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.
- Nozagt sensitīvus failus vai sistēmas datus (piemēram, īsziņas) no jūsu lietotnes
- 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:
- netiktu nosūtīts uz jūsu lietotnes privātajiem komponentiem;
- 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.