Intentátirányítási sebezhetőség elhárítása

Az alábbi tudnivalók az intentátirányítási sebezhetőség (intent redirection) által érintett alkalmazások fejlesztőinek szólnak.

Mi történik?

Egy vagy több alkalmazásod intentek átirányításán alapuló sebezhetőséget tartalmaz, melynek segítségével rosszindulatú alkalmazások privát alkalmazáskomponensekhez és fájlokhoz férhetnek hozzá. Alkalmazásaid problémáinak kijavításához tekintsd át az alábbi részletes lépéseket. A Play Console felületén látható határidők után eltávolítjuk a Google Playből azokat az alkalmazásokat, amelyekben még megtalálható a sebezhetőség.

Teendők​

  1. Jelentkezz be a Play Console felületén, majd tekintsd át az Értesítések oldalon az érintett alkalmazásokat és a problémák megoldásának határidőit.
  2. Frissítsd az érintett alkalmazásokat a lent megjelölt lépésekkel.
  3. Küldd be az érintett alkalmazások frissített verzióit.

A beküldés után alkalmazásodat ismét ellenőrizzük. A folyamat több órát is igénybe vehet. Ha az alkalmazás megfelel az ellenőrzésen, és ezt követően közzétesszük, nincs más teendőd. Ha az alkalmazás nem felel meg az ellenőrzésen, nem tesszük közzé az új verziót, hanem e-mailben értesítést küldünk a fejleményről.

Részletek

Azok az alkalmazások, melyek nem megbízható Intent elem Extras mezőjét beolvasva hoznak létre új intentet, majd az új elemmel meghívott startActivity (vagy startService) segítségével indítanak el komponenst, rávehetők arra, hogy nem várt privát komponenst indítsanak el. Ez kártékony argumentumokkal végrehajtott, veszélyes műveletekre ad lehetőséget, valamint lehetővé teszi, hogy a megadott URI-engedélyek segítségével privát fájlokhoz férjenek hozzá.

Javasoljuk, hogy a sebezhetőséget az alábbi megoldások valamelyikével hárítsd el:

1. lehetőség: Legyen privát az alkalmazáskomponens, ahonnan a beolvasott intent átirányításra kerül.

Ha az érintett alkalmazáskomponens nem fogad más alkalmazásoktól származó intenteket, akkor a komponens privát láthatóságúra állítható a manifestben elhelyezett android:exported=”false” sorral. 

2. lehetőség: Ellenőrizd, hogy a beolvasott intent megbízható forrásból származik-e.

Többek között a getCallingActivity segítségével ellenőrizheted, hogy megbízható-e az a tevékenység (activity), amelyből az intentet beolvasod. Például: 

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

3. lehetőség: Ellenőrizd, hogy az átirányítandó intent megbízható-e.

Győződj meg a következőkről:

  1. Az átirányítandó intent nem kerül az alkalmazásod privát komponenseihez.
  2. Az átirányítandó intent nem ad meg URI-engedélyt az alkalmazásod privát tartalomszolgáltatóinak.

Többek között a resolveActivity metódus segítségével ellenőrizheted átirányítás előtt, hogy melyik komponens fogja kezelni az átirányítandó intentet. Például:

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

Azt, hogy az intent megad-e URI-engedélyt, többek között a getFlags metódus segítségével ellenőrizheted. Például:

 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the flags
 int flags = forward.getFlags();
 // check that the nested intent does not grant URI permissions
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION > 0) ||
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION > 0) {
   // redirect the nested Intent
   startActivity(forward);
 }

Örömmel segítünk

A sebezhetőségre vonatkozó technikai kérdéseidet felteheted a Stack Overflow webhelyén, az „android-security” címkével ellátva. Ha a probléma megoldásának lépéseire vonatkozóan szeretnél tisztázni valamit, vedd fel a kapcsolatot fejlesztőtámogatási csapatunkkal.