
PoC محمي ومصدري فقط لاستغلال ثغرة CVE-2026-43499 في جهاز Humane AI Pin
GhostLock لـ Humane AI Pin هو إثبات مفهوم مفتوح المصدر لجذر محدود النطاق بحدود الإقلاع، مخصص لإصدار برنامج ثابت تجاري واحد محدد. يستغل CVE-2026-43499، وهو ثغرة use-after-free في Linux rtmutex، انطلاقًا من صدفة ADB عادية مصرّح بها.
المشغّل محدود النطاق عمدًا. فهو يتحقق من بصمة البرنامج الثابت الكاملة، وبناء النواة، والفتحة (slot)، ومعرّف المستخدم للصدفة (shell UID)، وحالة SELinux قبل أن يجهّز أي شيء. أي عدم تطابق يوقف التشغيل.
[!WARNING] هذا استغلال للنواة. قد يتسبب في ذعر (panic) أو إعادة تشغيل أو تعليق قاسٍ للـ Pin. قد يتطلب التعليق القاسي فصل الجهاز وانتظار نفاد البطارية. استخدمه فقط على Pin تملكه ويمكنك تحمّل استعادته. يختفي الجذر عند إعادة التشغيل.
| الخاصية | القيمة المقبولة |
|---|---|
| الجهاز | Humane AI Pin، وحدة تجزئة التجزئة |
| البرنامج الثابت | qti/atoll/atoll:12/SKQ1.230401.001/101.000470.45.20:user/release-keys |
| Android | 12 |
| النواة | 4.14.190-perf، بُنيت في Mon Nov 4 18:37:23 PST 2024 |
| الفتحة | _b فقط |
| معمارية النواة | aarch64 |
| ABI الخاص بـ Android | arm64-v8a |
| معرّف الملف التعريفي | humane-aipin-45.20-nov4 |
| مشروع البناء | humane-aipin-45.20 |
| SHA-256 لصورة النواة | d4f4e0deb20871fce207f1f095ba1934162081c2f10afaccbb2e6a1e938719fb |
| إعادة تشغيل المرشح للإصدار | قيد الانتظار لإعادة التشغيل النهائية على إقلاع نظيف |
يُرفض كل من الفتحة _a، والبرنامج الثابت الخاص بالمطورين، وإصدارات البرنامج الثابت القريبة، ومنتجات Qualcomm
atoll الأخرى. راجع تفاصيل التوافق.
بصمة Android مطابقة لا تكفي لتجاوز هذا الفحص: يمكن أن تحمل فتحات A/B صور إقلاع
وتخطيطات نواة مختلفة تحت نفس هوية بناء مساحة المستخدم.
يُعرَّف التوافق بواسطة بيان (manifest) مُصدَّر بإصدار تحت profiles/. يرتبط مشغّل المضيف،
والمشغّل، والفحص المسبق الأصلي المُولَّد، وهندسة المخصص (allocator)، والرموز الدنيا، والحمل (payload) المبني بذلك البيان نفسه. لا تزال إضافة فتحة إلى
بيان تتطلب إعادة تشغيل مادية على إقلاع نظيف لصورة النواة المُعرَّفة بدقة.
تحتاج إلى:
adb، وPython 3.10 أو أحدث، وmake، ومترجم C؛28.2.13676358 (r28c) لبناء الحمل (payload).لا يحتوي هذا المستودع على مفتاح ADB خاص، أو صورة برنامج ثابت، أو صورة إقلاع، أو bugreport، أو سجل جهاز، أو حمل (payload) مبني مسبقًا.
ثبّت NDK المثبّت (pinned) باستخدام أدوات سطر الأوامر الخاصة بـ Android:
sdkmanager "ndk;28.2.13676358"
تأكد من أن ADB يرى Pin بالفعل كـ device:
$ adb devices
List of devices attached
YOUR_SERIAL device
استنسخ المستودع، ثم استخدم الرقم التسلسلي الصريح نفسه في كل أمر:
git clone https://github.com/TheAndersMadsen/humane-aipin-ghostlock.git
cd humane-aipin-ghostlock
./ghostlock check --serial YOUR_SERIAL
./ghostlock run --serial YOUR_SERIAL
./ghostlock verify --serial YOUR_SERIAL
check للقراءة فقط. يطبع البرنامج الثابت المكتشف، والنواة، والفتحة، وحدود الصدفة، وحالة SELinux، والبطارية، ومصدر الطاقة، وإصدار NDK، وحالة أدوات البناء. يُخفي مخرجه التشخيصي الرقم التسلسلي للجهاز افتراضيًا.
run ينفذ محاولة واحدة محروسة. يطلب منك كتابة
ROOT YOUR_SERIAL، ويبني من المصدر، ويتحقق من تجزئة الحمولة بعد
دفعها، ويلتقط تقرير خطأ للإقلاع الحالي لاشتقاق KASLR، ويحذف تقرير
الخطأ الخام ذلك افتراضيًا، ويبدأ الاستغلال فقط بعد فحص أولي كامل
ثانٍ. يتطلب المشغّل بطارية لا تقل عن 20% وطاقة خارجية
افتراضيًا، ثم يعيد المدقّق التحقق من كليهما فورًا قبل أن يستهلك
المحاولة الواحدة للإقلاع. يُعطّل --min-battery 0 كلا بوابتي الطاقة، وهو
مقصود فقط عندما تم التأكد من استقرار الطاقة بشكل مستقل.
verify يطلب بشكل مستقل من وسيط الجذر المقيّد بالإقلاع تشغيل id و
getenforce.
يبدو التحقق الناجح هكذا:
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
SELinux: Permissive
Boot epoch: <redacted>; uptime: <redacted>s
سياق SELinux الدقيق خاص بالنواة والبرنامج الثابت. شرط القبول هو UID/GID 0 عبر الوسيط مع SELinux في الوضع المتساهل على نفس الإقلاع.
بالنسبة للإقلاع الحالي، تقوم الحمولة بما يلي:
init_cred؛/data/local/tmp/su؛لا تكتب قسمًا، ولا تفتح أداة تحميل الإقلاع، ولا تثبّت وحدة، ولا تعدّل الإقلاع الموثّق، ولا تنشئ استمرارية عبر إعادة التشغيل، ولا تتصل بخدمة شبكية، ولا ترفع بيانات قياس عن بُعد.
شغّل أمر root من ADB shell آخر باستخدام:
adb -s YOUR_SERIAL shell '/data/local/tmp/su -c id'
يسمح المشغّل بمحاولة واحدة لكل إقلاع للنواة. إذا أبلغ عن إخفاق، أو مهلة، أو انقطاع اتصال، أو حالة غير مؤكدة، أو panic، أو إعادة تشغيل، فلا تُعِد المحاولة على ذلك الإقلاع.
أعِد التشغيل أولًا ثم شغّل check مرة أخرى.
إذا كان ADB لا يزال يستجيب:
adb -s YOUR_SERIAL reboot
إذا كان Pin معلقًا بشكل صلب ولا يستجيب ADB، فافصل جميع مصادر الطاقة الخارجية. لا تحتوي الأجهزة التجارية المختبرة على إعادة تشغيل قسرية موثوقة يمكن للمستخدم الوصول إليها، لذا قد تتطلب الاستعادة الانتظار حتى تفرغ البطارية قبل إعادة توصيل الطاقة.
بعد إعادة تشغيل عادية، يختفي root. قد تبقى الملفات المجهزة خاملة تحت /data/local/tmp؛ يمكن لصدفة نظيفة إزالتها، بما في ذلك مطالبات المحاولة الذرية الخاصة بالإقلاع:
adb -s YOUR_SERIAL shell 'rm -f /data/local/tmp/ghostlock-aipin.so /data/local/tmp/su /data/local/tmp/.ghostlock-su.sock /data/local/tmp/.ghostlock-aipin-attempt'
adb -s YOUR_SERIAL shell 'rm -rf /data/local/tmp/.ghostlock-aipin-attempt.*.lock'
اقرأ SAFETY.md قبل استخدام PoC وTROUBLESHOOTING.md قبل إعادة محاولة تشغيل فاشل.
تُكتب سجلات التشغيل في دليل مؤقت بوضع 0700. وهي تحتوي على الرقم التسلسلي للجهاز، وهوية الإقلاع، وعناوين النواة، وبيانات القياس عن بُعد الخاصة بالاستغلال. لا تُرفق أبدًا ذلك الدليل أو تقرير أخطاء Android خامًا في مشكلة.
أنشئ تقريرًا مختصرًا بدلاً من ذلك:
./ghostlock report /private/tmp/ghostlock-aipin-TIMESTAMP --output ghostlock-report.json
راجع JSON قبل مشاركته. يحذف المُنقّح الأرقام التسلسلية ومعرّفات الإقلاع ومسارات المضيف ومخرجات الأوامر الخام وعناوين النواة. ويتضمن مددًا أحادية الاتجاه ثابتة للفحص المسبق والاستغلال والتحقق والتشغيل الكلي حتى يمكن مقارنة حالات الفشل دون مشاركة أدلة الجهاز. راجع PRIVACY.md.
ابنِ حِزمة Android:
./ghostlock build
عندما يوجد أكثر من ملف تعريف مدعوم بالأدلة، اختر واحدًا بشكل صريح:
./ghostlock build --profile humane-aipin-45.20-nov4
شغّل جميع اختبارات المضيف وبناءين مستقلين:
./scripts/verify-release.sh
يُكتب الحمولة إلى:
source/build/humane-aipin-45.20/bin/preload.so
يتم تجاهل منتجات البناء بواسطة Git. يجب التحقق من أصول الإصدار مقابل مجاميع التحقق المرفقة بإصدار GitHub المقابل.
يستخدم الاستغلال rt_mutex_waiter المعلّق المقيم على المكدس الخاص بـ CVE لتوجيه
تحديث شجرة أحمر-أسود مُتحكَّم به. يقوم KernelSnitch أولاً بتسريب عنوان
mm_struct عبر توقيت futex-hash. ثم تُثبت بوابة حدث perf بنفس PFN أن صفحة
slab من الرتبة 3 المُحرَّرة قد أُعيد استصلاحها بواسطة بيانات مخزن socket مُتحكَّم
بها قبل أن يتمكن مُحفِّز الفساد من المتابعة. تُشتق قاعدة KASLR المرتبطة بالإقلاع
من مرساة WARN اثنتين على الأقل متوافقتين للإقلاع الحالي.
يحل مسار القراءة/الكتابة الناتج المهمة الحالية وينفّذ تغيير بيانات الاعتماد
المحدود بنطاق الإقلاع.
يحتوي ملف تعريف الهدف فقط على الإزاحات والرموز التي يستهلكها هذا المسار. لا يتم توزيع صورة النواة وجدول الرموز الكامل. يصف TECHNICAL.md المراحل وبوابات الفشل المُغلَق.