Ez az információ az olyan alkalmazások fejlesztőinek szól, amelyekben megtalálható a Path Traversal sebezhetőség.
Mi történik?
2018. január 16-tól kezdődően a Google Play elkezdte tiltani minden olyan új alkalmazás és frissítés közzétételét, amelyben megtalálható a Path Traversal sebezhetőség. A Play Console felületén lévő értesítésben további információt találhatsz. 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
- 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.
- Készíts olyan frissítést az érintett alkalmazásokhoz, amely elhárítja a sebezhetőséget.
- 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
Az openFile exportált ContentProvider osztályokban található megvalósításai sebezhetők lehetnek, amennyiben nem ellenőrzik megfelelően a beérkező Uri paramétereket. A rosszindulatú alkalmazások átalakított (például a „/../” részt tartalmazó) URI-t küldhetnek, és ezzel rávehetik az alkalmazásodat a ParcelFileDescriptor visszaküldésére egy olyan fájl esetében, amelyik kívül van a szándékolt könyvtáron, és ezáltal lehetővé tehetik a rosszindulatú alkalmazásnak, hogy hozzáférjen az alkalmazásod által elérhető bármely fájlhoz.
Két stratégiát ajánlunk a Path Traversal sebezhetőség megszüntetésére a ContentProvider osztályban.
1. Ha a ContentProvider elemet nem kell látniuk más alkalmazásoknak:
- Módosíthatod az érintett ContentProvider <provider> címkéjét a Manifest fájlban az android:exported=”false” érték beállításával. Ezzel megakadályozhatod, hogy más alkalmazások „intent” elemeket küldjenek az érintett ContentProvider felé.
- Továbbá beállíthatod az android:permission attribútumot úgy, hogy a permission értéke android:protectionLevel=“signature” legyen, ezzel ugyanis megakadályozhatod, hogy az idegen fejlesztők által írt alkalmazások Intent elemeket küldjenek az érintett ContentProvider számára.
2. Ha más alkalmazásoknak is látniuk kell a ContentProvider elemedet:
Megfelelően biztosítanod kell, hogy az openFile útvonalbejárás-karaktereket tartalmazó bemenetei ne vehessék rá az alkalmazásodat arra, hogy az váratlan fájlokat adjon vissza. Ezt a fájl kanonikus elérési útjának ellenőrzésével teheted meg. Például:
public ParcelFileDescriptor openFile (Uri uri, String mode)
throws FileNotFoundException {
File f = new File(DIR, uri.getLastPathSegment());
if (!f.getCanonicalPath().startsWith(DIR)) {
throw new IllegalArgumentException();
}
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
Figyelmeztetések: Ne feledd, hogy a getLastPathSegment meghívása az Uri paraméterben nem biztonságos. Egy rosszindulatú alkalmazás kódolt URI-útvonalat biztosíthat, mint például %2F..%2F..path%2Fto%2Fsecret.txt, és ennek eredményeként a getLastPathSegment eredménye /../../path/to/secret.txt lesz. A következő megvalósítás például még mindig sebezhető egy esetleges támadás esetén.
public ParcelFileDescriptor openFile(Uri uri, String mode){
File f = new File(DIR, uri.getLastPathSegment());
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
Ö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.