Janus, une vulnérabilité Android utilisée pour contourner la vérification de signatures des applications

Une vulnérabilité importante (CVE-2017-13156) dans Android, corrigée en Décembre 2017, permet aux pirates de modifier le code dans les applications sans affecter leurs signatures. La racine du problème est qu'un fichier peut être un fichier APK valide et un fichier DEX1 (Dalvik Executable Format) valide en même temps. Cette dualité lui a inspiré le nom de Janus, en référence au dieu Romain.

Lorsqu'un fichier est signé à l'aide du modèle de signature JAR (Java Archive) traditionnel, la signature est uniquement appliquée aux entrées de fichier définies dans le répertoire central du ZIP. Si l'un de ces fichiers est modifié ultérieurement, la signature n’est plus valide.

Dans l'écosystème Android, les signatures sont importantes pour les mises à jour des applications car seuls les fichiers APK correctement signés sont autorisés à remplacer une application déjà installée. Si les pirates parviennent à contourner la vérification de l'intégrité des signatures, ils peuvent remplacer les applications existantes sur le téléphone d'un utilisateur par des versions malveillantes, accédant ainsi à leurs autorisations et données sensibles censées être protégées par le modèle de sécurité Android.

Ladite faille permet de modifier les applications sans casser leurs signatures numériques et provient de la façon dont Android Runtime (ART) charge les fichiers DEX.

Il s'avère que lorsqu’Android Runtime analyse un fichier APK pour installation, il recherche des octets magiques pour déterminer s'il contient un bytecode Dalvik compilé par DEX. Si un tel fichier est rencontré, il est exécuté et le reste de l'APK est ignoré. Néanmoins, le fichier en entier est reconnu comme fichier APK valide.

Par conséquent, les attaquants peuvent injecter un fichier DEX dans l'en-tête d'un APK légitime et tromper le compilateur ART pour l'exécuter sans casser la signature du fichier APK, car la signature s'applique uniquement aux fichiers définis dans le répertoire central de l'archive.

Google a introduit un nouveau système de signature (version 2) dans Android 7.0 (Nougat) qui empêche de telles attaques, mais la plupart des développeurs utilisent les deux systèmes de signature dans leurs applications pour des raisons de compatibilité descendante. Si un fichier a une signature version 2 et est installé sur Android 7 ou version ultérieure, l'attaque ne fonctionnera pas car la signature sera également appliquée à l'en-tête. Cependant, si l'APK est installé sur une ancienne version d'Android, qui est toujours utilisée sur un très grand nombre d'appareils, la version 1 du schéma de signature sera utilisée.