Aller au contenu

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 :

  1. Usurpation d'intention (Intent Spoofing) :
  2. Les attaquants peuvent tenter d'envoyer de fausses intentions qui correspondent aux critères du PendingIntent implicite. Cela pourrait entraîner l'exécution d'actions non souhaitées par l'application, provoquant potentiellement des failles de sécurité.

  3. Filtres d'intention malveillants :

  4. 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 PendingIntent implicite. Cela peut amener des composants non prévus à exécuter des actions sensibles.

  5. Escalade des privilèges :

  6. Un PendingIntent implicite 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é.

  7. Exposition des données :

  8. Si des données sensibles sont transmises via un PendingIntent implicite, 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.

  9. Enregistrement dynamique du Broadcast Receiver :

  10. Un PendingIntent implicite 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.

  11. Composants non sécurisés :

  12. Si le composant cible (Activity, Service, Broadcast Receiver) spécifié par le PendingIntent implicite 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.

  13. Utilisation d'entrées non fiables :

  14. Si le PendingIntent implicite 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é.

  15. Extras non protégés :

  16. Transmettre des informations sensibles via des extras dans un PendingIntent implicite 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.

  17. Filtres d'intention trop larges :

  18. 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.

  19. Échec de la vérification de l'identité de l'appelant :

    • Les composants lancés par un PendingIntent implicite 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é.
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 PendingIntent n'est livré qu'à des composants de confiance ;
  • Utiliser FLAG_IMMUTABLE (ajouté dans le SDK 23) pour créer des PendingIntents. Cela empêche les applications qui reçoivent le PendingIntent de 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 du PendingIntent avec le modèle suivant :
  • Être prudent avec les données incluses dans les intentions.
  • Annuler les PendingIntents lorsqu'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