Tavoitteen uudelleenohjaus ‑haavoittuvuuden korjaaminen

Nämä tiedot on tarkoitettu kehittäjille, joiden sovellukset sisältävät tavoitteen uudelleenohjaus ‑haavoittuvuuden.

Mistä on kyse?

Yhdessä tai useammassa sovelluksessasi on tavoitteen uudelleenohjausongelma, joka voi sallia haitallisten sovellusten käyttää yksityisiä sovellusosia tai tiedostoja. Korjaa sovellustesi ongelma alla olevien yksityiskohtaisten ohjeiden mukaisesti. Play Consolessa näytettyjen määräaikojen päätyttyä korjaamattomia tietosuojahaavoittuvuuksia sisältävät sovellukset poistetaan Google Playsta.

Edellyttää toimia​

  1. Kirjaudu sisään Play Consoleen ja siirry ilmoitusosioon, niin näet sovellukset, joihin ongelmat vaikuttavat, ja määräajat niiden korjaamiselle.
  2. Päivitä kyseiset sovellukset alla olevien ohjeiden avulla.
  3. Lähetä sovellusten päivitetyt versiot.

Sovellus tarkastetaan lähetyksen yhteydessä uudelleen. Tässä voi kestää useita tunteja. Jos sovellus läpäisee tarkastuksen ja sen julkaisu onnistuu, lisätoimia ei tarvita. Jos sovellus ei läpäise tarkastusta, uutta sovellusversiota ei julkaista ja sinulle ilmoitetaan tästä sähköpostilla.

Lisätietoja

Komponentin käynnistäminen (esim. startActivity-kutsu) tai datan palauttaminen (esim. setResult-kutsu) ei-luotetun tavoitteen avulla on vaarallista ja voi sallia haitallisten sovellusten aiheuttaa seuraavia ongelmia: 

  1. Arkaluontoisten tiedostojen tai järjestelmädatan (kuten tekstiviestien) varastaminen sovelluksestasi
  2. Sovelluksen yksityisten osien käynnistäminen vahingollisilla argumenteilla

On tärkeää, ettei sovellus kutsu startActivity-, startService-, sendBroadcast- tai setResult-komentoja ei-luotettujen tavoitteiden avulla tarkistamatta niitä tai poistamatta niistä haitallista sisältöä.

Suosittelemme estämään tämän haavoittuvuuden jollakin seuraavista tavoista:

Vaihtoehto 1: Muuta yksityiseksi ongelmallinen sovellusosa, josta poimittu tavoite on uudelleenohjattu.

Jos ongelmallisen sovellusosan ei tarvitse vastaanottaa tavoitteita muilta sovelluksilta, voit tehdä sovellusosasta yksityisen valitsemalla sille luettelossa arvon android:exported="false".

Vaihtoehto 2: Varmista, että poimittu tavoite on luotettavasta lähteestä.

Voit varmistaa, että alkuperäiseen toimintoon voi luottaa, metodilla getCallingActivity tai muulla vastaavalla. Esimerkki:

 // 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);
 }

Huom.

  • Sen tarkistaminen, palauttaako getCallingActivity() muun arvon kuin nolla, ei riitä haavoittuvuuden estämiseen. Haitalliset sovellukset voivat lisätä tälle toiminnolle nolla-arvon.
  • Jos kyseessä on Google Play Services SMS Retriever Auth, lähetysvastaanottimen suojaaminen SEND_PERMISSION-komennolla varmistaa, että tavoite on peräisin Play Palveluista.

Vaihtoehto 3: Varmista, ettei uudelleenohjattava tavoite ole haitallinen.

Sinun täytyy varmistaa seuraavat seikat uudelleenohjattavasta tavoitteesta:

  1. Sitä ei lähetetä sovelluksesi yksityisiin osiin.
  2. Sitä ei lähetetä ulkoisen sovelluksen osaan. Jos uudelleenohjaus on tarkoitettu kohdistettavaksi ulkoiseen sovellukseen, varmista, että tavoite ei myönnä URI-lupaa sovelluksesi yksityisille sisällön tarjoajille tai järjestelmädatalle.

Sovellukset voivat tarkistaa, mitä osia tavoitteen käsittelyyn käytetään ennen sen uudelleenohjausta, resolveActivity-metodilla tai muulla vastaavalla. Esimerkki:

 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);
 }

Sovellukset voivat tarkistaa, myöntääkö tavoite URI-luvan, getFlags-metodilla tai vastaavalla. Esimerkki:

 // poimi sisällytetty tavoite
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // hae merkinnät
 int flags = forward.getFlags();
 // varmista että sisällytetty tavoite ei myönnä URI-lupia
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // uudelleenohjaa sisällytetty tavoite
   startActivity(forward);
 }

Sovellukset voivat myös poistaa URI-lupia removeFlags-metodilla. Esimerkki:

 // ei-luotettu tavoite
 Intent intent = getIntent();
 // poista ei-luotetusta tavoitteesta myönnetyt URI-luvat
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // ohita ei-luotettu tavoite
 setResult(intent);

Varoitusten tulkitseminen ja estovaihtoehdon valitseminen 

Play Console varoittaa, jos sovellus kutsuu startActivity-, startActivityForConversion-, startService-, sendBroadcast- tai set results-komentoa ei-luotetun tavoitteen avulla. Saat apua sopivan estovaihtoehdon valintaan jäljittämällä ja tutkimalla metodien kutsutapoja nähdäksesi, mistä ei-luotettu tavoite on peräisin. Esimerkiksi vaihtoehdon 1 tapauksessa selvitä jäljittämällä, mistä osasta kannattaa tehdä yksityinen.

Autamme mielellämme

Voit esittää teknisiä kysymyksiä haavoittuvuudesta Stack Overflow ‑sivustolla. Merkitse kysymyksesi android-security-tagilla. Jos tarvitset lisätietoja ongelman ratkaisun vaiheista, voit ottaa yhteyttä kehittäjien tukitiimiimme.

false
Päävalikko
36947608835918639
true
Ohjekeskushaku
true
true
true
true
true
5016068
false
false