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
- Kirjaudu sisään Play Consoleen ja siirry ilmoitusosioon, niin näet sovellukset, joihin ongelmat vaikuttavat, ja määräajat niiden korjaamiselle.
- Päivitä kyseiset sovellukset alla olevien ohjeiden avulla.
- 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:
- Arkaluontoisten tiedostojen tai järjestelmädatan (kuten tekstiviestien) varastaminen sovelluksestasi
- 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:
- Sitä ei lähetetä sovelluksesi yksityisiin osiin.
- 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.