Implicit PendingIntent
PendingIntent implicite
Description
Les vulnérabilités d'intention implicite (implicit intent) dans les applications Android, en particulier les PendingIntent implicites, posent des risques de sécurité importants. Ces vulnérabilités surviennent lorsque les développeurs utilisent des intentions implicites sans spécifier explicitement le composant cible, s'appuyant sur les filtres d'intention pour déterminer le destinataire. Les attaquants peuvent exploiter cela en envoyant des intentions malveillantes qui correspondent aux critères des intentions implicites, conduisant à des actions ou des accès non autorisés. Les problèmes courants incluent l'usurpation d'intention (intent spoofing), où de fausses intentions sont créées, et la possibilité pour des applications malveillantes d'enregistrer des filtres d'intention qui correspondent aux critères de l'intention implicite. L'escalade des privilèges, l'exposition des données et les composants non sécurisés sont d'autres préoccupations. Voici une liste des problèmes de sécurité potentiels qui peuvent découler d'un PendingIntent implicite :
- Usurpation d'intention (Intent Spoofing) :
-
Les attaquants peuvent tenter d'envoyer de fausses intentions qui correspondent aux critères du
PendingIntentimplicite. Cela pourrait entraîner l'exécution d'actions non souhaitées par l'application, provoquant potentiellement des failles de sécurité. -
Filtres d'intention malveillants :
-
Si les filtres d'intention ne sont pas soigneusement configurés, des applications malveillantes pourraient enregistrer des filtres d'intention qui correspondent aux critères du
PendingIntentimplicite. Cela peut amener des composants non prévus à exécuter des actions sensibles. -
Escalade des privilèges :
-
Un
PendingIntentimplicite peut conduire à une escalade des privilèges si le composant cible nécessite certaines autorisations. Un attaquant pourrait exploiter cela pour déclencher des actions nécessitant des privilèges plus élevés, conduisant à un accès non autorisé. -
Exposition des données :
-
Si des données sensibles sont transmises via un
PendingIntentimplicite, il y a un risque d'exposition des données si l'intention est interceptée ou manipulée. Les développeurs doivent s'assurer du chiffrement et de la validation appropriés des données envoyées via les intentions. -
Enregistrement dynamique du Broadcast Receiver :
-
Un
PendingIntentimplicite déclenchant un Broadcast Receiver peut être vulnérable aux attaques si les récepteurs peuvent être enregistrés dynamiquement. Les attaquants pourraient enregistrer leurs propres récepteurs pour intercepter les diffusions et effectuer des actions malveillantes. -
Composants non sécurisés :
-
Si le composant cible (Activity, Service, Broadcast Receiver) spécifié par le
PendingIntentimplicite n'est pas correctement sécurisé, il peut être vulnérable à diverses attaques, y compris l'escalade des privilèges ou la falsification des données. -
Utilisation d'entrées non fiables :
-
Si le
PendingIntentimplicite implique l'utilisation d'entrées non fiables, telles que des données reçues de sources externes, cela peut introduire des vulnérabilités telles que les attaques par injection. Validez et assainissez les entrées pour prévenir de tels risques de sécurité. -
Extras non protégés :
-
Transmettre des informations sensibles via des extras dans un
PendingIntentimplicite sans protection appropriée peut entraîner une fuite de données. Les développeurs doivent être prudents quant aux informations incluses dans les extras et s'assurer qu'elles sont correctement sécurisées. -
Filtres d'intention trop larges :
-
Si les filtres d'intention sont trop larges, ils pourraient correspondre à des composants non souhaités, augmentant la surface d'attaque et permettant potentiellement aux attaquants de déclencher des actions qui n'étaient pas prévues.
-
Échec de la vérification de l'identité de l'appelant :
- Les composants lancés par un
PendingIntentimplicite doivent vérifier l'identité de l'appelant pour empêcher tout accès non autorisé. Le fait de ne pas le faire peut entraîner des vulnérabilités de sécurité.
- Les composants lancés par un
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create an implicit base Intent and wrap it in a PendingIntent
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, 0);
}
}
Recommandation
Les développeurs peuvent corriger la vulnérabilité en appliquant l'une (ou mieux, toutes) des méthodes suivantes :
- S'assurer que les champs action, package et component de l'intention de base sont définis (Intent explicite) ;
- S'assurer que le
PendingIntentn'est livré qu'à des composants de confiance ; - Utiliser
FLAG_IMMUTABLE(ajouté dans le SDK 23) pour créer desPendingIntents. Cela empêche les applications qui reçoivent lePendingIntentde remplir les propriétés non renseignées. Dans le cas où l'application fonctionne également sur des appareils exécutant le SDK 22 ou des versions antérieures, nous recommandons aux développeurs d'appliquer les options précédentes tout en renforçant la création duPendingIntentavec le modèle suivant : - Être prudent avec les données incluses dans les intentions.
- Annuler les
PendingIntentslorsqu'ils ne sont plus nécessaires. - Maintenir votre application à jour avec les dernières pratiques de sécurité Android.
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT >= 23) {
// Create a PendingIntent using FLAG_IMMUTABLE
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, PendingIntent.FLAG_IMMUTABLE);
} else {
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, 0);
}
}
}
Liens
Normes
- OWASP_MASVS_L1:
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- PCI_STANDARDS:
- REQ_2_2
- 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
- CC_9_1
- HIPAA_CONTROLS:
- SECURITY221
- SECURITY212
- SECURITY213