Android Class Loading Hijacking
Secuestro de carga de clases en Android
Descripción
Android Class Loading Hijacking es una vulnerabilidad de seguridad que permite a un atacante ejecutar código malicioso en un dispositivo Android aprovechando la forma en que el sistema operativo carga las clases. Esto se logra engañando al sistema Android para que cargue una clase maliciosa en lugar de la legítima. El atacante puede utilizar esta clase maliciosa para obtener acceso no autorizado a datos confidenciales, manipular la funcionalidad del dispositivo o, incluso, tomar el control total del mismo. Esta vulnerabilidad es especialmente crítica porque puede explotarse sin el conocimiento del usuario y puede afectar a cualquier aplicación que no proteja adecuadamente su proceso de carga de clases.
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");
}
}
Recomendación
Para mitigar el riesgo de Android Class Loading Hijacking, los desarrolladores deben:
- Evitar el uso de métodos de carga dinámica de clases a menos que sea estrictamente necesario.
- Asegurarse de que las clases cargadas provengan de una fuente confiable.
- Garantizar que las clases cargadas no puedan ser modificadas por otras aplicaciones.
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");
}
}
Enlaces
Estándares
- 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