
Android HW Attestationのデモ
このリポジトリは、Android ハードウェア Key Attestation に関する Quarkslab の記事 に付随し、その内容を説明するためのものです。
これは、単純なバイパスを示す小規模なエンドツーエンドの概念実証(PoC)です。root化された電話機を使うアナリストが、構成証明を2台目のクリーンなデバイスにリレーすることで、バックエンドのハードウェア構成証明チェックを無効化します。何も偽造されていません。未改変のデバイスが生成し、バックエンド自身の nonce にバインドされた本物の構成証明チェーンが、root化デバイスの拒否されたチェーンの代わりに転送されます。
適用範囲と倫理。 これはセキュリティ研究のための教育資料です。平文の HTTP を使用し、安全チェックを意図的に無効にしています(全体に「デモ専用」のマーカーがあります)。信頼できるローカルネットワーク上で、ご自身のデバイスとバックエンドに対して実行してください。
root化されたデバイスの Keystore 構成証明はロック解除されたブートローダーを報告するため、バックエンドはそれを拒否します。アナリストは暗号を攻撃する代わりに、アプリ自身の構成証明呼び出しをインターセプトし、同じチャレンジに対してクリーンなデバイスからライブで取得したチェーンに差し替えます。
フックはデモアプリ内の KeystoreAttestation.generateAttestedKey(challenge) を置き換え、ローカルの Keystore を一切呼び出さないため、root化デバイスのチェーンは生成されません。リレーされたチェーンは本物であり、バックエンドの verified boot とハードウェアバックアップのチェックを通過します。
| コンポーネント | パス | 役割 | 動作環境 |
|---|---|---|---|
| デモクライアント | apps/QuarkslabAttestationDemo/ | 対象アプリ。nonce を要求し、構成証明を行い、チェーンをバックエンドに送信します。Frida によってフックされます。 | root化された解析用デバイス |
| 構成証明サーバー | apps/QuarkslabAttestationServer/ | 構成証明オラクル。指定された nonce に対して本物のチェーンを生成します。検証は一切行いません。 | クリーンで未改変のデバイス |
| インストルメンテーション | instrumentation/ | Frida エージェント(フック)と、nonce をクリーンなデバイスへリレーするコントローラー。 | アナリストのワークステーション + root化デバイス |
| バックエンド | backend/ | 検証者(Relying Party)。nonce を発行し、構成証明チェーンを検証します。 | デバイスから到達可能な任意のマシン |
各コンポーネントには詳細を記載した専用の README があります。このファイルはそれらを結び付ける役割を担います。
frida-server 17.16.4 を実行し、デモアプリがインストールされた root化済み の「解析用」デバイス。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)をメモします。
root化デバイス。 frida-server を起動し、デモアプリをビルドしてインストールし、開いてバックエンドのアドレス(host:port)を入力します。
両方のアプリは、Android Studio またはコマンドライン(Gradle ラッパー ./gradlew assembleDebug、JDK 17-21)からビルドできます。詳細は各アプリの README を参照してください。
リレー。 ワークステーション上で:
cd instrumentation
python3 control.py --host <clean-device-ip> --port 8080
コントローラーはデモアプリをスポーンし、フックをインストールしてから再開(resume)します。
トリガー。 デモアプリで RUN ATTESTATION をタップします。バックエンドは valid を返します。リレーされたチェーンがロックされたブートローダーを報告するためです。
ネガティブコントロール。 control.py を停止し、再度 RUN ATTESTATION をタップします。デモアプリは今度は root化デバイス自身のチェーンを送信するため、バックエンドはそれを拒否します。これが、リレーが無効化するチェックです。
エージェントの再ビルド(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 の記事 で説明されている内容を示すものです。