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 Playrő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, akkor nem tesszük közzé az új verziót, és e-mailben értesítést küldünk a fejleményről.

Részletek

Ha nem megbízható intentet használsz egy összetevő elindítására (például a startActivity meghívásával) vagy adatok visszaküldésére (például a setResult meghívásával) veszélyes lehet, és lehetővé teheti, hogy a rosszindulatú alkalmazások a következő problémákat okozzák:

  1. Bizalmas fájlok vagy rendszeradatok (például SMS-ek) ellopása az alkalmazásodból
  2. Az alkalmazás privát összetevőinek elindítása mérgezett argumentumokkal.

Fontos, hogy az alkalmazás ne hívja meg a startActivity, a startService, a sendBroadcast vagy a setResult metódust nem megbízható intentek esetében, anélkül, hogy ellenőrizve vagy megtisztítva lennének az intentek.

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 érintett 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élda:

 // annak ellenőrzése, hogy az eredeti tevékenység megbízható forrásból származik-e
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // a beágyazott intent beolvasása
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // a beágyazott intent átirányítása
   startActivity(forward);
 }

Megjegyzés:

  • Annak ellenőrzése, hogy a getCallingActivity() nem null értéket ad-e vissza, nem elegendő a sebezhetőség megelőzésére. A rosszindulatú alkalmazások képesek null értéket biztosítani ehhez a függvényhez.
  • A Google Play-szolgáltatások SMS Retriever hitelesítése esetében a broadcast receiver eszköz SEND_PERMISSION paranccsal való védelme biztosítja majd, hogy az intent a Play-szolgáltatásokból származik.

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; valamint
  2. az átirányítandó intent nem kerül külső alkalmazás komponenséhez. Ha az átirányítás külső alkalmazást kíván megcélozni, gondoskodj arról, hogy az intent ne adjon meg URI-engedélyt alkalmazásod privát tartalomszolgáltatóinak vagy rendszeradatainak.

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

 Intent intent = getIntent();
 // a beágyazott intent beolvasása
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // a komponens nevének lekérése
 ComponentName name = forward.resolveActivity(getPackageManager());
 // annak ellenőrzése, hogy a csomag és az osztály neve megfelelő-e
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // a beágyazott intent átirányítása
   startActivity(forward);
 }

Többek között a getFlags metódus segítségével az alkalmazások ellenőrizni tudják, hogy az intent megad-e URI-engedélyt. Példa:

 // a beágyazott intent beolvasása
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // a jelölők lekérése
 int flags = forward.getFlags();
 // annak ellenőrzése, hogy a beágyazott intent nem ad-e meg URI-engedélyeket
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // a beágyazott intent átirányítása
   startActivity(forward);
 }

Az alkalmazások el is távolíthatják az URI-k számára biztosított engedélyeket a removeFlags metódus segítségével. Példa:

 // nem megbízható Intent
 Intent intent = getIntent();
 // a megadott URI-engedélyek eltávolítása a nem megbízható intentnél
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // a nem megbízható intent átadása
 setResult(intent);

A figyelmeztetések értelmezése és a megelőzési megoldás kiválasztása

A Play Console-értesítésből tájékozódhatsz arról, hogy hol hív meg az alkalmazásod nem megbízható intent segítségével a startActivity, a startActivityForResult, a startService, a sendBroadcast vagy a setResult metódust. Annak érdekében, hogy jobban értsd, melyik megelőzési megoldás a legmegfelelőbb, keresd vissza és tanulmányozd át a metódusok hívóinak megoldásait – így láthatod, hogy honnan származik az indítási intent. Az 1. lehetőségnél például keresd meg, hogy melyik komponenst érdemes privátként beállítani.

Örömmel segítünk

Ha technikai jellegű kérdéseid vannak a sebezhetőséggel kapcsolatban, felteheted őket a Stack Overflow webhelyén az „android-security” címke használatával. Ha tisztázni szeretnéd, hogy pontosan milyen lépéseket kell tenned a probléma megoldása érdekében, felveheted a kapcsolatot a fejlesztői ügyfélszolgálatunkkal.

false
Főmenü
9101795051207222318
true
Keresés a Súgóoldalakon
true
true
true
true
true
5016068
false
false
false