
أداة عرض توضيحي للتحقق من سلامة العتاد (HW Attestation) على نظام أندرويد
يرافق هذا المستودع مقالة Quarkslab حول التحقق من المفتاح المعتمد على العتاد في أندرويد (Android hardware Key Attestation)، وهو مخصص لتوضيحها.
إنه إثبات مفهوم صغير ومتكامل يعرض تجاوزًا بسيطًا: محلل على هاتف مُجذر يتغلب على فحص التحقق المعتمد على العتاد لدى الخادم الخلفي عبر ترحيل التحقق إلى جهاز ثانٍ نظيف. لا شيء مُزيّف. تُمرَّر سلسلة تحقق حقيقية، أنتجها جهاز غير معدّل ومرتبطة بـ nonce الخاص بالخادم الخلفي نفسه، بدلًا من سلسلة الجهاز المُجذر المرفوضة.
النطاق والأخلاقيات. هذه مادة تعليمية لأغراض البحث الأمني. إنها تستخدم HTTP عاديًا وتعطّل فحوصات السلامة عمدًا (علامات "للعرض فقط" في كل مكان). شغّلها على أجهزتك الخاصة وخادمك الخلفي الخاص، على شبكة محلية موثوقة.
تحقق Keystore على جهاز مُجذر يُبلغ عن مُحمّل إقلاع غير مقفول، لذلك يرفضه الخادم الخلفي. بدلًا من مهاجمة التشفير، يعترض المحلل استدعاء التحقق الخاص بالتطبيق ويستبدله بسلسلة تُجلب مباشرة من جهاز نظيف لنفس التحدي.
يستبدل الخطاف (hook) الدالة KeystoreAttestation.generateAttestedKey(challenge) في تطبيق العرض ولا يستدعي Keystore المحلي أبدًا، وبالتالي لا تُنشأ سلسلة الجهاز المُجذر إطلاقًا. السلسلة المُرحّلة حقيقية وتجتاز فحوصات الإقلاع الموثّق والفحوصات المعتمدة على العتاد في الخادم الخلفي.
| المكوّن | المسار | الدور | يعمل على |
|---|---|---|---|
| تطبيق العميل التجريبي | apps/QuarkslabAttestationDemo/ | التطبيق المستهدف. يطلب nonce، ويؤدي التحقق، ويرسل السلسلة إلى الخادم الخلفي. يتم خطفه بواسطة Frida. | جهاز التحليل المُجذر |
| خادم التحقق | apps/QuarkslabAttestationServer/ | مرجع التحقق. يُنتج سلسلة حقيقية لـ nonce معيّن. لا يتحقق من أي شيء. | جهاز نظيف غير معدّل |
| الأدوات | instrumentation/ | وكيل Frida (الخطاف) بالإضافة إلى وحدة التحكم التي ترحّل الـ nonce إلى الجهاز النظيف. | محطة عمل المحلل + الجهاز المُجذر |
| الخادم الخلفي | backend/ | الطرف المعتمد. يُصدر nonces ويتحقق من سلاسل التحقق. | أي جهاز يمكن الوصول إليه من الجهازين |
لكل مكوّن 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 في تطبيق العرض. يُرجع الخادم الخلفي صالحًا: السلسلة المُرحّلة تُبلغ عن مُحمّل إقلاع مقفول.
التحكم السلبي. أوقف 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
حقوق النشر 2026 Quarkslab. مُرخَّص بموجب رخصة MIT. راجع LICENSE.
يوضح هذا المستودع مقالة Quarkslab.