
An Android HW Attestation 데모
이 저장소는 Android 하드웨어 키 증명(Key Attestation)에 관한 Quarkslab 기사와 함께 제공되며, 이를 예시로 보여주기 위해 존재합니다.
루팅된 휴대폰의 분석가가 **릴레이(relaying)**를 통해 백엔드의 하드웨어 증명 검사를 우회하는 간단한 방법을 보여주는 소규모 엔드투엔드 개념 증명입니다. 어떤 것도 위조되지 않습니다. 수정되지 않은 장치에서 생성되고 백엔드 자체 논스(nonce)에 바인딩된 진짜 증명 체인이 루팅된 장치의 거부된 체인 대신 전달됩니다.
범위 및 윤리. 이 자료는 보안 연구를 위한 교육용 자료입니다. 일반 HTTP를 사용하며 의도적으로 안전 검사를 비활성화합니다(전체에 "데모 전용" 표시). 신뢰할 수 있는 로컬 네트워크에서 자신의 장치와 자신의 백엔드를 대상으로 실행하세요.
루팅된 장치의 Keystore 증명은 잠금 해제된 부트로더를 보고하므로 백엔드가 이를 거부합니다. 분석가는 암호화를 공격하는 대신 앱 자체의 증명 호출을 가로채 동일한 챌린지에 대해 클린 장치에서 실시간으로 가져온 체인으로 교체합니다.
후크는 데모 앱에서 KeystoreAttestation.generateAttestedKey(challenge)를 대체하며 로컬 Keystore를 호출하지 않으므로 루팅된 장치의 체인은 생성되지 않습니다. 릴레이된 체인은 진짜이며 백엔드의 검증된 부팅 및 하드웨어 기반 검사를 통과합니다.
| 구성 요소 | 경로 | 역할 | 실행 위치 |
|---|---|---|---|
| 데모 클라이언트 | apps/QuarkslabAttestationDemo/ | 대상 앱. 논스를 요청하고, 증명하고, 체인을 백엔드로 전송합니다. Frida로 후킹됩니다. | 루팅된 분석 장치 |
| 증명 서버 | apps/QuarkslabAttestationServer/ | 증명 오라클. 주어진 논스에 대해 진짜 체인을 생성합니다. 아무것도 검증하지 않습니다. | 클린(수정되지 않은) 장치 |
| 계측 | instrumentation/ | Frida 에이전트(후크)와 논스를 클린 장치로 릴레이하는 컨트롤러. | 분석가 워크스테이션 + 루팅된 장치 |
| 백엔드 | backend/ | 신뢰 당사자(Relying Party). 논스를 발급하고 증명 체인을 검증합니다. | 장치에서 접근 가능한 모든 머신 |
각 구성 요소에는 전체 세부 정보를 담은 자체 README가 있으며, 이 파일은 이를 하나로 묶습니다.
frida-server 17.16.4를 실행하는 루팅된 "분석" 장치.backend/requirements.txt에 있음)../gradlew assembleDebug)를 사용한 명령줄에서 빌드).instrumentation/_agent.js)는 커밋되어 있으므로 재빌드는 선택 사항입니다.다음 순서로 구성 요소를 가동합니다.
백엔드. 두 장치 모두에서 접근 가능한 머신에서:
cd backend
pip install -r requirements.txt
python3 attestation_backend.py # listens on 0.0.0.0:8080
클린 장치. 증명 서버 앱을 빌드하여 설치한 다음 열고 START SERVER를 탭하고 표시된 URL(예: http://192.168.1.42:8080)을 기록해 둡니다.
루팅된 장치. frida-server를 시작하고 데모 앱을 빌드하여 설치한 다음 열고 백엔드 주소(host:port)를 입력합니다.
두 앱 모두 Android Studio 또는 Gradle 래퍼(./gradlew assembleDebug, JDK 17-21)를 사용한 명령줄에서 빌드할 수 있습니다. 자세한 내용은 각 앱의 README를 참조하세요.
릴레이. 워크스테이션에서:
cd instrumentation
python3 control.py --host <clean-device-ip> --port 8080
컨트롤러는 데모 앱을 실행하고 후크를 설치한 다음 앱을 재개합니다.
트리거. 데모 앱에서 RUN ATTESTATION을 탭합니다. 백엔드는 valid(유효)를 반환합니다. 릴레이된 체인은 잠긴 부트로더를 보고합니다.
음성 대조군. control.py를 중지하고 RUN ATTESTATION을 다시 탭합니다. 이제 데모 앱은 루팅된 장치 자체의 체인을 보내며 백엔드는 이를 거부합니다. 이것이 릴레이가 무력화하는 검사입니다.
에이전트 재빌드(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. MIT 라이선스에 따라 사용이 허가됩니다. LICENSE를 참조하세요.
이 저장소는 Quarkslab 기사를 예시로 보여줍니다.