
An Android HW Attestation demo
Este repositório acompanha um artigo da Quarkslab sobre atestação de chave de hardware do Android e existe para ilustrá-lo.
É uma prova de conceito pequena e de ponta a ponta que mostra um bypass simples: um analista em um telefone com root contorna a verificação de atestação de hardware de um backend ao retransmitir a atestação para um segundo dispositivo limpo. Nada é forjado. Uma cadeia de atestação genuína, produzida por um dispositivo não modificado e vinculada ao nonce do próprio backend, é encaminhada no lugar da cadeia rejeitada do dispositivo com root.
Escopo e ética. Este é um material educacional para pesquisa em segurança. Ele usa HTTP simples e desativa verificações de segurança de propósito (marcadores "demo only" em todo o material). Execute-o contra seus próprios dispositivos e seu próprio backend, em uma rede local de confiança.
A atestação do Keystore de um dispositivo com root informa um bootloader desbloqueado, então o backend a rejeita. Em vez de atacar a criptografia, o analista intercepta a chamada de atestação do próprio aplicativo e insere, no lugar, uma cadeia obtida ao vivo de um dispositivo limpo para o mesmo desafio.
O hook substitui KeystoreAttestation.generateAttestedKey(challenge) no aplicativo demo e nunca chama o Keystore local, portanto a cadeia do dispositivo com root nunca é gerada. A cadeia retransmitida é genuína e passa nas verificações de boot verificado e com respaldo de hardware do backend.
Cada componente tem seu próprio README com todos os detalhes; este arquivo os reúne.
frida-server 17.16.4, com o aplicativo demo instalado.backend/requirements.txt)../gradlew assembleDebug).instrumentation/_agent.js) está versionado, portanto uma recompilação é opcional.Coloque os componentes em funcionamento nesta ordem.
Backend. Em uma máquina alcançável por ambos os dispositivos:
cd backend
pip install -r requirements.txt
python3 attestation_backend.py # listens on 0.0.0.0:8080
Dispositivo limpo. Compile e instale o aplicativo servidor de atestação, abra-o, toque em START SERVER e anote a URL que ele exibe, ex.: http://192.168.1.42:8080.
Dispositivo com root. Inicie o frida-server, compile e instale o aplicativo demo, abra-o e insira o endereço do backend (host:port).
Ambos os aplicativos são compilados pelo Android Studio ou pela linha de comando com o wrapper do Gradle (./gradlew assembleDebug, JDK 17-21); consulte o README de cada aplicativo para os detalhes.
Retransmissão. Na estação de trabalho:
cd instrumentation
python3 control.py --host <clean-device-ip> --port 8080
O controlador inicia o aplicativo demo, instala o hook e então o retoma.
Disparo. Toque em RUN ATTESTATION no aplicativo demo. O backend retorna valid: a cadeia retransmitida informa um bootloader bloqueado.
Controle negativo. Pare o control.py e toque em novamente. O aplicativo demo agora envia a própria cadeia do dispositivo com root e o backend a rejeita. Esta é a verificação que a retransmissão contorna.
Recompilando o agente (somente se você alterar o 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 sob a Licença MIT. Consulte LICENSE.
Este repositório ilustra um artigo da Quarkslab.
| Componente | Caminho | Função | Executa em |
|---|
| Cliente demo | apps/QuarkslabAttestationDemo/ | Aplicativo alvo. Solicita um nonce, atesta e envia a cadeia ao backend. Recebe hook via Frida. | Dispositivo de análise com root |
| Servidor de atestação | apps/QuarkslabAttestationServer/ | Oráculo de atestação. Produz uma cadeia genuína para um determinado nonce. Não valida nada. | Dispositivo limpo e não modificado |
| Instrumentação | instrumentation/ | Agente Frida (o hook) mais o controlador que retransmite o nonce ao dispositivo limpo. | Estação de trabalho do analista + dispositivo com root |
| Backend | backend/ | Parte confiante. Emite nonces e valida cadeias de atestação. | Qualquer máquina alcançável pelos dispositivos |