
androidqf (Android Quick Forensics) aide à rassembler rapidement des preuves médico-légales à partir d'appareils Android, afin d'identifier des traces potentielles de compromission.
androidqf (Android Quick Forensics) est un outil portable conçu pour simplifier l'acquisition de données forensiques pertinentes depuis les appareils Android.
androidqf se veut un utilitaire simple et portable, multiplateforme, permettant d'acquérir rapidement des données à partir d'appareils Android. Ses fonctionnalités sont similaires à celles de mvt-android. Cependant, contrairement à MVT, androidqf est conçu pour être facilement utilisé même par des utilisateurs non techniques. Les données extraites par androidqf peuvent être analysées avec MVT.
Ce dépôt est un fork de androidqf maintenu par le Laboratoire de sécurité d'Amnesty International. L'outil androidqf a été initialement développé par Claudio Guarnieri.

Les binaires exécutables pour Linux, Windows et Mac devraient être disponibles dans la dernière version. Si vous rencontrez des problèmes pour exécuter le binaire, vous pouvez le compiler vous-même.
Ce projet utilise GoReleaser pour les compilations et les publications automatisées. Pour compiler localement :
Installez GoReleaser :
go install github.com/goreleaser/goreleaser@latest
Lancez une compilation snapshot (sans publication) :
./build_locally.sh
Cela créera des binaires pour toutes les plateformes dans le répertoire dist/, y compris un binaire universel pour macOS qui fonctionne à la fois sur Intel et Apple Silicon.
Vous pouvez toujours utiliser l'approche traditionnelle avec Makefile. Vous aurez besoin de Go 1.23+ installé, ainsi que de make, git, unzip et wget. AndroidQF inclut un collector cross-compilé qui s'exécute sur l'appareil cible pour extraire de manière plus fiable les informations forensiques pertinentes.
Construisez d'abord le module collector :
make collector
Ensuite, compilez AndroidQF pour la plateforme de votre choix :
make linux
make darwin
make windows
Ces commandes généreront des binaires dans un dossier build/.
Les paquets de distribution peuvent éviter d'intégrer les binaires ADB et collecteur regroupés en compilant avec la balise de compilation unbundle :
go build -tags unbundle -o build/
Lorsque cette balise est activée, androidqf s'attend à ce que :
adb soit disponible dans le PATH du système./usr/lib/androidqf/android-collector/ en utilisant les noms attendus par androidqf, tels que collector_arm et collector_arm64.Les empaqueteurs peuvent supprimer les ressources binaires incluses de assets/ avant la compilation, mais le répertoire du paquet assets/ et ses fichiers source Go doivent rester présents. La compilation unbundle importe toujours le paquet assets, et la compilation échouera si tout le répertoire assets/ est supprimé.
L'image conteneur de la version est publiée sur GitHub Container Registry :
docker pull ghcr.io/mvt-project/androidqf:latest
Pour effectuer une acquisition à partir d'un appareil Android connecté par USB sous Linux, passez le bus USB et montez un répertoire de sortie :
docker run --rm -it --privileged \
-v /dev/bus/usb:/dev/bus/usb \
-v "$(pwd)/output:/output" \
ghcr.io/mvt-project/androidqf:latest -fast -output /output
Vous pouvez également construire l'image localement pour une version publiée :
docker build --build-arg VERSION=1.8.3 -t androidqf .
[!TIP] Consultez Archives d'acquisition pour le format d'archive, les hachages d'intégrité, le chiffrement et la gestion des fichiers volumineux. Pour un dictionnaire des fichiers collectés, voir le dictionnaire de fichiers de sortie AndroidQF de SocialTIC (tiers).
Avant de lancer androidqf, vous devez avoir l'appareil Android cible connecté à votre ordinateur via USB, et vous devez avoir activé le débogage USB. Veuillez vous référer à la documentation officielle pour savoir comment procéder, mais sachez que les téléphones Android de différents fabricants peuvent nécessiter des étapes de navigation différentes des valeurs par défaut.
Une fois le débogage USB activé, vous pouvez lancer androidqf. Il tentera d'abord de se connecter à l'appareil via le pont USB, ce qui devrait amener le téléphone Android à vous demander d'autoriser manuellement les clés de l'hôte. Assurez-vous de les autoriser, idéalement de manière permanente afin que l'invite ne réapparaisse pas.
Maintenant, androidqf devrait s'exécuter et créer une archive zip d'acquisition dans votre répertoire de travail actuel, ou dans le répertoire fourni avec -output. À un moment donné de l'exécution, androidqf vous proposera des choix : ces invites suspendront l'acquisition jusqu'à ce que vous fassiez une sélection, alors soyez attentif.
Les données suivantes peuvent être extraites :
Chaque acquisition contient également acquisition.json, command.log lorsque des logs ont été produits, et hashes.csv. La liste de hachages enregistre le digest SHA-256 de chaque entrée d'archive en texte clair précédente et ne s'inclut pas elle-même. Les extractions échouées de l'appareil ne sont pas enregistrées comme entrées d'archive. Voir Archives d'acquisition pour plus de détails.
Les options suivantes sont présentées lors de l'exécution d'une collecte androidqf :
Would you like to take a backup of the device?
...
? Backup:
▸ Only SMS
Everything
No backup
Ces options font référence aux données collectées à partir de l'appareil en exécutant la commande adb backup en arrière-plan. Si No backup est sélectionné, la commande adb backup n'est pas exécutée.
| Option | Explication |
|---|---|
Would you like to download copies of all apps or only non-system ones?
? Download:
▸ All
Only non-system packages
Do not download any
| Option | Explication |
|---|---|
| All | Tous les paquets installés seront récupérés depuis le téléphone |
| Only non-system packages | Ne téléchargez aucun paquet listé dans adb pm list packages -s |
| Do not download any | Ne téléchargez aucun paquet |
Would you like to take the Intrusion Logs of the device?
? Intrusion Logs:
▸ Yes
No
| Option | Explication |
|---|---|
| Yes | Les journaux d'intrusion seront récupérés depuis le téléphone. |
| No | L'acquisition des journaux d'intrusion est ignorée. |
Transporter les acquisitions d'androidqf sur un lecteur non chiffré peut vous exposer, et encore plus ceux dont vous avez acquis les données, à un risque important. Par exemple, vous pourriez être arrêté à une frontière problématique et votre disque androidqf pourrait être saisi. Les données brutes pourraient non seulement révéler le but de votre voyage, mais aussi contenir des données très sensibles (par exemple la liste des applications installées, ou même des messages SMS).
Idéalement, vous devriez avoir le disque entièrement chiffré, mais cela n'est pas toujours possible. Vous pouvez également envisager de placer androidqf dans un conteneur VeraCrypt et emporter avec vous une copie de VeraCrypt pour le monter. Cependant, les conteneurs VeraCrypt sont généralement protégés uniquement par un mot de passe, que vous pourriez être contraint de fournir.
Alternativement, androidqf permet de chiffrer chaque acquisition avec une clé publique age fournie. De préférence, cette clé publique appartient à une paire de clés dont l'utilisateur final ne possède pas, ou du moins ne transporte pas, la clé privée. Ainsi, l'utilisateur final ne serait pas en mesure de déchiffrer les données acquises, même sous la contrainte.
androidqf diffuse chaque acquisition dans une archive zip. Si vous placez un fichier nommé key.txt dans le répertoire de travail actuel, androidqf chiffrera le flux zip avec age et écrira <UUID>.zip.age ; sinon, il écrit un <UUID>.zip non chiffré. androidqf vérifie également la présence de key.txt dans le même dossier que l'exécutable ; si les deux fichiers existent, le répertoire de travail actuel a priorité.
Les acquisitions chiffrées ne créent pas d'archive d'acquisition en texte clair. Les fichiers de l'appareil qui doivent être validés avant d'être ajoutés à une archive chiffrée sont temporairement mis en scène avec un chiffrement authentifié ChaCha20-Poly1305. Voir Archives d'acquisition pour le flux de données complet et le comportement avec les grosses APK.
Une fois que vous avez récupéré un fichier d'acquisition chiffré, vous pouvez le déchiffrer avec age comme ceci :
$ age --decrypt -i ~/path/to/privatekey.txt -o <UUID>.zip <UUID>.zip.age
Gardez à l'esprit qu'il est toujours possible qu'au moins une partie des données non chiffrées puisse être récupérée grâce à des techniques avancées de forensique - même si nous travaillons à atténuer cela.
Le but d'androidqf est de faciliter l'analyse forensique consensuelle des appareils de ceux qui pourraient être la cible d'attaques sophistiquées de logiciels espions mobiles, en particulier les membres de la société civile et des communautés marginalisées. Nous ne voulons pas qu'androidqf permette des violations de la vie privée d'individus non consentants. Par conséquent, l'objectif de cette licence est d'interdire l'utilisation d'androidqf (et de tout autre logiciel sous la même licence) à des fins de forensique adversarial.
Pour y parvenir, androidqf est publié sous la Licence MVT 1.1, une adaptation de la Mozilla Public License v2.0. Cette licence modifiée inclut une nouvelle clause 3.0, « Restriction d'utilisation consensuelle » qui permet l'utilisation du logiciel sous licence (et de toute "Œuvre dérivée" qui en découle) exclusivement avec le consentement explicite de la/des personne(s) dont les données sont extraites et/ou analysées ("Propriétaire des données").
| Donnée | Optionnelle ? | Chemin(s) de sortie |
|---|
| Une sauvegarde complète ou une sauvegarde des messages SMS et MMS. | ✅ | backup.ab |
| La sortie de la commande shell getprop, fournissant des informations de construction et des paramètres de configuration. | getprop.txt | |
| Tous les paramètres système | settings_*.txt | |
| La sortie de la commande shell ps, fournissant une liste de tous les processus en cours. | processes.txt | |
| La liste des services du système. | services.txt | |
| Une copie de tous les logs du système. | logs/, logcat.txt | |
| La sortie de la commande shell dumpsys, fournissant des informations de diagnostic sur l'appareil. | dumpsys.txt | |
| Une liste de tous les paquets installés et des fichiers de distribution associés. | packages.json | |
| Copie de toutes les APK installées ou de seulement celles non marquées comme applications système. | ✅ | apks/* |
| Logs de journalisation d'intrusion. Contient des données privées telles que l'historique de navigation. | ✅ | intrusion_logs/* |
| Une liste des fichiers sur le système. | files.json | |
| Une copie des fichiers disponibles dans les dossiers temporaires. | tmp/* | |
| Un rapport de bogue contenant des logs système et spécifiques aux applications, sans données privées incluses. | bugreport.zip |
| SMS uniquement |
adb backup com.android.providers.telephony est exécutée. Seules les données de com.android.providers.telephony sont collectées. Cela inclut la base de données SMS. |
| Tout | adb backup -all est exécutée. Cela demande des sauvegardes uniquement pour les applications qui ont explicitement autorisé les sauvegardes de leurs données via cette méthode. Depuis Android 12+, cette méthode n'extrait rien pour presque toutes les applications. |
| Pas de sauvegarde | adb backup n'est pas exécutée |