Android Class Loading Hijacking
Détournement de chargement de classe Android
Description
Le Android Class Loading Hijacking (Détournement du chargement de classes Android) est une vulnérabilité de sécurité qui permet à un attaquant d'exécuter du code malveillant sur un appareil Android en exploitant le mécanisme de chargement de classes d'Android. Cela se produit en trompant le système Android pour qu'il charge une classe malveillante au lieu de celle prévue. L'attaquant peut alors utiliser cette classe malveillante pour obtenir un accès non autorisé à des données sensibles, manipuler les fonctionnalités de l'appareil ou même en prendre le contrôle total. Cette vulnérabilité est particulièrement dangereuse car elle peut être exploitée à l'insu de l'utilisateur et peut affecter toute application qui ne sécurise pas correctement son processus de chargement de classes.
public final class DexClassLoaderCall {
private static final String TAG = DexClassLoaderCall.class.toString();
@Override
public String getDescription() {
return "Use of dex class load";
}
@Override
public void run() throws Exception {
/*
Dex class loading from external storage
*/
String apkFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/app.apk";
DexClassLoader classLoader1 = new DexClassLoader(
apkFile,
apkFile,
apkFile,
ClassLoader.getSystemClassLoader());
classLoader1.loadClass("a.b.c");
/*
Dex class loading from hard-coded sdcard path
*/
DexClassLoader classLoader2 = new DexClassLoader(
"/sdcard/test.apk",
"/sdcard/test.apk",
"/sdcard/test.apk",
ClassLoader.getSystemClassLoader());
classLoader2.loadClass("a.b.c");
}
}
Recommandation
Pour atténuer le risque lié au Android Class Loading Hijacking, les développeurs doivent :
- Éviter d'utiliser des méthodes de chargement dynamique de classes, sauf en cas d'absolue nécessité.
- S'assurer que les classes chargées proviennent d'une source de confiance.
- Garantir que les classes chargées ne sont pas modifiables par d'autres applications.
public final class DexClassLoaderCall {
private static final String TAG = DexClassLoaderCall.class.toString();
@Override
public String getDescription() {
return "Use of dex class load";
}
@Override
public void run() throws Exception {
Context context = getContext();
File apkFile = new File(context.getFilesDir(), "app.apk");
DexClassLoader classLoader1 = new DexClassLoader(
apkFile.getAbsolutePath(),
context.getCacheDir().getAbsolutePath(),
null,
context.getClassLoader());
classLoader1.loadClass("a.b.c");
DexClassLoader classLoader2 = new DexClassLoader(
context.getPackageCodePath(),
context.getCacheDir().getAbsolutePath(),
null,
context.getClassLoader());
classLoader2.loadClass("a.b.c");
}
}
Liens
Normes
- OWASP_MASVS_L2:
- MSTG_PLATFORM_9
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_11_3
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY251
- SECURITY212
- SECURITY213