
Une démo d’attestation matérielle Android
Ce dépôt accompagne un article Quarkslab sur l'attestation de clé matérielle Android et a pour but de l'illustrer.
Il s'agit d'une petite preuve de concept de bout en bout qui montre un contournement simple : un analyste sur un téléphone rooté contourne le contrôle d'attestation matérielle d'un backend en relayant l'attestation vers un deuxième appareil sain. Rien n'est falsifié. Une chaîne d'attestation authentique, produite par un appareil non modifié et liée au nonce propre au backend, est transmise à la place de la chaîne rejetée de l'appareil rooté.
Portée et éthique. Ce contenu est un support pédagogique destiné à la recherche en sécurité. Il utilise du HTTP en clair et désactive volontairement les contrôles de sécurité (marqueurs « demo only » disséminés dans le code). Exécutez-le contre vos propres appareils et votre propre backend, sur un réseau local de confiance.
L'attestation Keystore d'un appareil rooté signale un bootloader déverrouillé ; le backend la rejette donc. Plutôt que d'attaquer la cryptographie, l'analyste intercepte l'appel d'attestation de l'application elle-même et le remplace par une chaîne récupérée en direct depuis un appareil sain pour le même défi.
Le hook remplace KeystoreAttestation.generateAttestedKey(challenge) dans l'application de démonstration et n'appelle jamais le Keystore local ; la chaîne de l'appareil rooté n'est donc jamais générée. La chaîne relayée est authentique et satisfait aux contrôles de boot vérifié et de matériel du backend.
Chaque composant possède son propre README avec tous les détails ; ce fichier les relie entre eux.
frida-server 17.16.4, avec l'application de démonstration installée.backend/requirements.txt)../gradlew assembleDebug).instrumentation/_agent.js) est inclus dans le dépôt ; une reconstruction est donc facultative.Démarrez les éléments dans cet ordre.
Backend. Sur une machine joignable depuis les deux appareils :
cd backend
pip install -r requirements.txt
python3 attestation_backend.py # listens on 0.0.0.0:8080
Appareil sain. Compilez et installez l'application du serveur d'attestation, ouvrez-la, appuyez sur START SERVER et notez l'URL affichée, par ex. http://192.168.1.42:8080.
Appareil rooté. Démarrez frida-server, compilez et installez l'application de démonstration, ouvrez-la et saisissez l'adresse du backend (host:port).
Les deux applications se compilent depuis Android Studio ou en ligne de commande avec le wrapper Gradle (./gradlew assembleDebug, JDK 17-21) ; consultez le README de chaque application pour les détails.
Relais. Sur le poste de travail :
cd instrumentation
python3 control.py --host <clean-device-ip> --port 8080
Le contrôleur lance l'application de démonstration, installe le hook, puis la reprend.
Déclenchement. Appuyez sur RUN ATTESTATION dans l'application de démonstration. Le backend renvoie valid : la chaîne relayée indique un bootloader verrouillé.
Contrôle négatif. Arrêtez control.py et appuyez de nouveau sur . L'application de démonstration envoie désormais la chaîne propre à l'appareil rooté et le backend la rejette. C'est ce contrôle que le relais contourne.
Reconstruction de l'agent (uniquement si vous modifiez agent/agent.ts) :
cd instrumentation
nvm use # Node 22 from .nvmrc
npm install
npm run build # regenerates _agent.js
apps/
QuarkslabAttestationDemo/ target client app (Android Studio project)
QuarkslabAttestationServer/ clean-device attestation oracle (Android Studio project)
instrumentation/ Frida agent + relay controller
backend/ Python attestation validator
LICENSE MIT
Copyright 2026 Quarkslab. Sous licence MIT. Voir LICENSE.
Ce dépôt illustre un article Quarkslab.
| Composant | Chemin | Rôle | S'exécute sur |
|---|
| Client de démonstration | apps/QuarkslabAttestationDemo/ | Application cible. Demande un nonce, atteste, envoie la chaîne au backend. Hookée par Frida. | Appareil d'analyse rooté |
| Serveur d'attestation | apps/QuarkslabAttestationServer/ | Oracle d'attestation. Produit une chaîne authentique pour un nonce donné. Ne valide rien. | Appareil propre, non modifié |
| Instrumentation | instrumentation/ | Agent Frida (le hook) et contrôleur qui relaie le nonce vers l'appareil sain. | Poste de travail de l'analyste + appareil rooté |
| Backend | backend/ | Partie de confiance. Émet les nonces et valide les chaînes d'attestation. | Toute machine joignable depuis les appareils |