Android Package Context created without security restrictions
Contexte de paquet Android créé sans restrictions de sécurité
Description
La vulnérabilité associée à l'utilisation de createPackageContext avec CONTEXT_INCLUDE_CODE et CONTEXT_IGNORE_SECURITY sous Android peut permettre à un attaquant d'exécuter du code arbitraire dans le contexte de l'application vulnérable en exploitant le mécanisme de communication interprocessus (IPC).
Sous Android, chaque application est mise dans un bac à sable (sandbox) pour empêcher tout accès non autorisé aux ressources et aux fonctionnalités du système. Cependant, les applications peuvent interagir entre elles via des mécanismes IPC tels que createPackageContext. Cette méthode est utilisée pour créer un objet Context pour un nom de package spécifique, permettant à une application d'accéder aux ressources ou aux composants d'une autre application.
En demandant la permission android.permission.QUERY_ALL_PACKAGES et en utilisant createPackageContext avec CONTEXT_INCLUDE_CODE et CONTEXT_IGNORE_SECURITY, l'application charge les ressources du package demandé, et dans certains cas, elle crée également un class loader pour son code, ce qui permet aux classes contenues dans le package cible d'être chargées dans le contexte de l'application actuelle sans aucune vérification de signature ni aucune restriction sur le contexte de l'application.
Le flag CONTEXT_INCLUDE_CODE permet à l'application de charger des classes à partir du package cible, tandis que le flag CONTEXT_IGNORE_SECURITY ignore les restrictions de sécurité. L'utilisation de ces flags peut exposer l'application à des risques de sécurité potentiels.
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import java.lang.reflect.Method;
import java.util.List;
public final class InsecurePackageContext {
public static void main(String[] args) {
Context context = getContext();
PackageManager packageManager = context.getPackageManager();
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
for (PackageInfo info : installedPackages) {
String packageName = info.packageName;
if (packageName.startsWith("co.ostorlab.")) {
try {
Context packageContext = context.createPackageContext(packageName,
Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
Class<?> loaderClass = packageContext.getClassLoader().loadClass("co.ostorlab.payload");
Method updateMethod = loaderClass.getMethod("Update", Context.class);
updateMethod.invoke(null, context);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
}
Recommandation
Pour atténuer la vulnérabilité associée à la création d'un contexte de package non sécurisé à l'aide de createPackageContext avec les flags CONTEXT_INCLUDE_CODE et CONTEXT_IGNORE_SECURITY, les développeurs doivent :
1- Éviter d'utiliser createPackageContext en intégrant tous les composants nécessaires directement dans l'application elle-même plutôt que d'utiliser des fichiers APK séparés.
2- Si l'utilisation de createPackageContext est nécessaire, éviter d'utiliser les flags CONTEXT_INCLUDE_CODE et CONTEXT_IGNORE_SECURITY ; utiliser plutôt CONTEXT_RESTRICTED, qui peut désactiver certaines fonctionnalités mais rend l'application plus robuste face aux attaques d'applications tierces.
3- Lors de la vérification de la présence du package dans la liste des packages installés, éviter les comparaisons approximatives comme startsWith ou endsWith ; essayez plutôt de faire correspondre le nom du package de manière exacte.
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import java.lang.reflect.Method;
import java.util.List;
public final class InsecurePackageContext {
public static void main(String[] args) {
Context context = getContext();
PackageManager packageManager = context.getPackageManager();
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
for (PackageInfo info : installedPackages) {
String packageName = info.packageName;
if (packageName.equals("co.ostorlab.plugins.camera")) {
try {
Context packageContext = context.createPackageContext(packageName,
Context.CONTEXT_RESTRICTED);
Class<?> loaderClass = packageContext.getClassLoader().loadClass("co.ostorlab.plugins.camera.Main");
Method updateMethod = loaderClass.getMethod("Update", Context.class);
updateMethod.invoke(null, context);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
}
Liens
Normes
- OWASP_MASVS_L1:
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- CWE_TOP_25:
- GDPR:
- ART_5
- ART_25
- ART_32
- ART_35
- PCI_STANDARDS:
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_4
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY221
- SECURITY212
- SECURITY213