
Un demo de atestación de hardware para Android
Este repositorio acompaña a un artículo de Quarkslab sobre la atestación de claves (Key Attestation) de hardware de Android y existe para ilustrarlo.
Es una prueba de concepto pequeña y de extremo a extremo que muestra un bypass simple: un analista en un teléfono rooteado burla la verificación de atestación de hardware de un backend retransmitiendo la atestación a un segundo dispositivo limpio. Nada se falsifica. Una cadena de atestación genuina, producida por un dispositivo sin modificar y vinculada al nonce del propio backend, se reenvía en lugar de la cadena rechazada del dispositivo rooteado.
Alcance y ética. Este es material educativo para la investigación en seguridad. Usa HTTP sin cifrar y desactiva las comprobaciones de seguridad a propósito (marcadores de «solo demo» por todas partes). Ejecútalo contra tus propios dispositivos y tu propio backend, en una red local de confianza.
La atestación de Keystore de un dispositivo rooteado informa de un bootloader desbloqueado, por lo que el backend la rechaza. En lugar de atacar la criptografía, el analista intercepta la llamada de atestación de la propia app e intercambia esa cadena por una obtenida en vivo de un dispositivo limpio para el mismo desafío.
El hook reemplaza KeystoreAttestation.generateAttestedKey(challenge) en la app demo y nunca llama al Keystore local, por lo que la cadena del dispositivo rooteado nunca se genera. La cadena retransmitida es genuina y supera las comprobaciones de arranque verificado (verified boot) y respaldadas por hardware del backend.
Cada componente tiene su propio README con todos los detalles; este archivo los une.
frida-server 17.16.4, con la app demo instalada.backend/requirements.txt)../gradlew assembleDebug).instrumentation/_agent.js) está incluido en el repositorio, por lo que recompilar es opcional.Levanta los componentes en este orden.
Backend. En una máquina accesible desde ambos dispositivos:
cd backend
pip install -r requirements.txt
python3 attestation_backend.py # listens on 0.0.0.0:8080
Dispositivo limpio. Compila e instala la app del servidor de atestación, luego ábrela, toca START SERVER y anota la URL que muestra, p. ej. http://192.168.1.42:8080.
Dispositivo rooteado. Inicia frida-server, compila e instala la app demo, ábrela e introduce la dirección del backend (host:port).
Ambas apps se compilan desde Android Studio o desde la línea de comandos con el wrapper de Gradle (./gradlew assembleDebug, JDK 17-21); consulta el README de cada app para más detalles.
Retransmisión. En la estación de trabajo:
cd instrumentation
python3 control.py --host <clean-device-ip> --port 8080
El controlador lanza la app demo, instala el hook y luego la reanuda.
Disparador. Toca RUN ATTESTATION en la app demo. El backend devuelve válido: la cadena retransmitida informa de un bootloader bloqueado.
Control negativo. Detén control.py y toca RUN ATTESTATION de nuevo. La app demo ahora envía la cadena del propio dispositivo rooteado y el backend la rechaza. Esta es la verificación que la retransmisión evade.
Recompilar el agente (solo si cambias 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. Licenciado bajo la Licencia MIT. Consulta LICENSE.
Este repositorio ilustra un artículo de Quarkslab.
| Componente | Ruta | Función | Se ejecuta en |
|---|
| Cliente demo | apps/QuarkslabAttestationDemo/ | App objetivo. Solicita un nonce, atesta y envía la cadena al backend. Hookeada por Frida. | Dispositivo de análisis rooteado |
| Servidor de atestación | apps/QuarkslabAttestationServer/ | Oráculo de atestación. Produce una cadena genuina para un nonce dado. No valida nada. | Dispositivo limpio y sin modificar |
| Instrumentación | instrumentation/ | Agente de Frida (el hook) más el controlador que retransmite el nonce al dispositivo limpio. | Estación de trabajo del analista + dispositivo rooteado |
| Backend | backend/ | Parte confiadora (relying party). Emite nonces y valida cadenas de atestación. | Cualquier máquina accesible desde los dispositivos |