Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-38352-PoC — PoC وGDB script يساعدان في تفعيل CVE-2025-38352 | Kitploit
أدوات/GitHubGitHub/longwasu/cve-2025-38352-poc
تحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةمصممي الأخطاءالأوراق والأبحاثالتعلم والتعليماستغلال الملفات الثنائية
GitHublongwasu/cve-2025-38352-poc

CVE-2025-38352-PoC

PoC وGDB script يساعدان في تفعيل CVE-2025-38352

عرض المستودع
منذ 7س 4دلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2025-38352: حالة تسابق TOCTOU في مؤقت CPU POSIX بنواة لينكس واستخدام بعد التحرير (UAF)

برهان مفهوم (PoC) قابل لإعادة الإنتاج وسكربت تنسيق GDB آلي لـ CVE-2025-38352، وهي حالة تسابق من نوع Time-of-Check to Time-of-Use (TOCTOU) في النظام الفرعي لمؤقت CPU POSIX بنواة لينكس (kernel/time/posix-cpu-timers.c) تؤدي إلى استخدام بعد التحرير (UAF).

إخلاء مسؤولية: هذا المشروع لأغراض تعليمية ودفاعية وبحثية أمنية فقط. تم إجراء جميع الاختبارات وإعادة الإنتاج في جهاز افتراضي معزول ARM64 QEMU.


🧠 كيف تعمل الثغرة

  1. تنشئ العملية A العملية الابنة B.

  2. تنشئ العملية B مؤقت CPU وتبدأ بالخروج، فتدخل حالة الزومبي. وبينما تخرج B، يصل مقاطعة مؤقت على نواة المعالج الخاصة بها. يدخل النواة سياق المقاطعة لمعالجة المؤقت، لكنه يحرر قفله مؤقتًا (unlock_task_sighand) لتجنب الجمود.

  3. في الوقت نفسه تمامًا على نواة أخرى، تجمع العملية A العملية B الخارجة، فتنظف معالج إشارتها (sighand = NULL) وتزيل تجزئة PID الخاص بها.

  4. يستدعي خيط آخر في B حذف المؤقت (posix_cpu_timer_del). يحاول البحث عن المهمة عبر PID الخاص بها والتحقق من معالج إشارتها، لكنه يجدهما قد تم تنظيفهما بالفعل / NULL. وبتفسيره الخاطئ أن المهمة ميتة تمامًا ولا يمكن أن تنطلق أي مؤقتات، يفترض أنه آمن ويحرر المؤقت من الذاكرة.

  5. في هذه الأثناء، يستأنف معالج مقاطعة المؤقت على النواة الأولى لإطلاق المؤقت المنتهي. ولأن المؤقت قد تم تحريره للتو في الخطوة 4، فإن الوصول إليه يسبب استخدامًا بعد التحرير ويُسقط النواة.


🔬 استراتيجية التزامن (poc_gdb_script.py)

لأن منفذ GDB الخاص بـ QEMU لا يدعم set non-stop on (إيقاف vCPU واحد يوقف جميع وحدات vCPU)، لا يمكن تحقيق التزامن القياسي متعدد الخيوط عبر نقاط التوقف العادية.

يحل هذا المستودع المشكلة عبر ترقيع التعليمات في الذاكرة:

  1. المرحلة 1 (حاجز CPU):

    • تُوضع نقاط التوقف عند الدوال الأربع الحرجة في النواة:
      • exit_notify (CPU 2)
      • kernel_wait4 (CPU 0)
      • __arm64_sys_timer_delete (CPU 1)
      • handle_posix_cpu_timers (CPU 2)
    • عند وصول كل vCPU إلى نقطة التقائه، يقوم GDB بترقيع $pc الخاص به باستخدام تعليمة ARM64 ذاتية التفرع 0x14000000 (b . حلقة لا نهائية) ويستأنف التنفيذ.
    • بمجرد تثبيت جميع وحدات vCPU الأربع في مواقعها الدقيقة، يستعيد GDB التعليمات الأصلية ويسلّم التنفيذ إلى المرحلة 2.
  2. المرحلة 2 (التنسيق التسلسلي):

    • يقفل GDB المجدول (set scheduler-locking on) ويقدم كل vCPU للأمام بالتسلسل:
      • الخطوة 1 (CPU 2): تقديم handle_posix_cpu_timers إلى ما بعد unlock_task_sighand().
      • الخطوة 2 (CPU 0): تقديم kernel_wait4 إلى ما بعد .

🚀 كيفية إعادة الإنتاج

1. تنزيل مصدر النواة الهدف

نزّل أو استنسخ شجرة مصدر Android Common Kernel عند الالتزام 1bf1aa362e6b9573a310fcd14f35bc875b42ba83:

root@kitploit:~
# Option A: Download tarball directly
curl -LO https://android.googlesource.com/kernel/common/+archive/1bf1aa362e6b9573a310fcd14f35bc875b42ba83.tar.gz
mkdir -p kernel-cve && tar -xzf 1bf1aa362e6b9573a310fcd14f35bc875b42ba83.tar.gz -C kernel-cve
cd kernel-cve

# Option B: Clone repository
git clone https://android.googlesource.com/kernel/common
cd common
git checkout 1bf1aa362e6b9573a310fcd14f35bc875b42ba83

2. التراجع عن الترقيع في run_posix_cpu_timers()

افتح kernel/time/posix-cpu-timers.c، وحدد الدالة run_posix_cpu_timers() (حوالي السطر 1435–1448)، وعلّق أسطر الترقيع:

root@kitploit:~
void run_posix_cpu_timers(void)
{
    struct task_struct *tsk = current;

    lockdep_assert_irqs_disabled();

    /*
     * Ensure that release_task(tsk) can't happen while
     * handle_posix_cpu_timers() is running. Otherwise, a concurrent
     * posix_cpu_timer_del() may fail to lock_task_sighand(tsk) and
     * miss timer->it.cpu.firing != 0.
     */
//  if (tsk->exit_state)
//      return;

3. تعطيل CONFIG_POSIX_CPU_TIMERS_TASK_WORK

ملاحظة: عندما يكون CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y، تُنفَّذ مؤقتات CPU من سياق task_work بدلًا من مقاطعة المؤقت، متجاوزةً حالة التسابق هذه. لذلك، يجب تعطيله لإعادة إنتاج الثغرة.

لأن CONFIG_POSIX_CPU_TIMERS_TASK_WORK يفتقر إلى سلسلة مطالبة في Kconfig الأساسي، فإنه يُعيّن افتراضيًا إلى y ولا يمكن تبديله مباشرة في menuconfig. يمكنك إظهاره كما يلي:

  1. في kernel/time/Kconfig (حوالي السطر 56)، أضف سلسلة مطالبة وغيّر الافتراضي:
    root@kitploit:~
    config POSIX_CPU_TIMERS_TASK_WORK
        bool "POSIX CPU timers task work"
        default n
    
  2. أنشئ الإعداد الافتراضي وعطّل الخيار:
    root@kitploit:~
    ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make defconfig
    scripts/config --disable POSIX_CPU_TIMERS_TASK_WORK
    ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make olddefconfig
    
  3. تحقق من أنه معطّل في .config:
    root@kitploit:~
    grep POSIX_CPU_TIMERS_TASK_WORK .config
    # Expected output: # CONFIG_POSIX_CPU_TIMERS_TASK_WORK is not set
    

4. بناء النواة

ترجم صورة نواة ARM64:

root@kitploit:~
time ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j$(nproc) Image

5. ترجمة PoC لمساحة المستخدم

ترجم poc.c ترجمة متقاطعة:

root@kitploit:~
aarch64-linux-gnu-gcc -ggdb3 ./poc.c -o poc

6. تشغيل QEMU مع منفذ GDB

شغّل جهازك الافتراضي QEMU بأربع وحدات vCPU (-smp 4) وفعّل منفذ GDB (علامة -s، المنفذ 1234):

root@kitploit:~
qemu-system-aarch64 \
    -M virt \
    -cpu cortex-a57 \
    -smp 4 \
    -m 2G \
    -kernel arch/arm64/boot/Image \
    -append "console=ttyAMA0 root=/dev/vda oops=panic panic_on_warn=1" \
    ... \
    -s

7. إرفاق GDB وتشغيل السكربت

من طرفية المضيف، أرفق GDB بـ QEMU وحمّل سكربت التنسيق:

root@kitploit:~
gdb-multiarch vmlinux
pwndbg> target remote :1234
pwndbg> source poc_gdb_script.py
pwndbg> continue

8. إطلاق الثغرة

داخل صدفة ضيف QEMU، شغّل الملف التنفيذي المترجم:

root@kitploit:~
./poc

[!TIP] التوقيت واستكشاف الأخطاء:
إذا انطلق المؤقت قبل الأوان قبل أن يصل الخيط الهدف إلى حالة الزومبي، سيسجل GDB:

root@kitploit:~
[!] ERROR: handle_posix_cpu_timers fired before exit_state == EXIT_ZOMBIE
  • الخيار 1: ببساطة أعد تشغيل ./poc وأعد تحميل سكربت GDB عدة مرات.
  • الخيار 2: زد TIMER_FIRE_MS في poc.c (مثلًا، من #define TIMER_FIRE_MS 10 إلى 20)، وأعد ترجمة poc.c، وشغّل مرة أخرى. يمنح هذا الخيط وقتًا إضافيًا للوصول إلى exit_notify() والانتقال إلى EXIT_ZOMBIE قبل انتهاء المؤقت.

9. عرض توضيحي

https://github.com/user-attachments/assets/11481b5c-25f8-46c3-be3a-7b79a06a4948


📚 المراجع

  • Race Against Time in the Kernel Clockwork بواسطة StreyPaws
  • CVE-2025-38352 Root Cause Analysis بواسطة Faith
تنزيل الأداة
tsk->sighand = NULL
  • الخطوة 3 (CPU 1): تقديم timer_delete لاستدعاء release_posix_timer() (تحرير sigq).
  • الخطوة 4 (CPU 2): تحرير قفل المجدول للسماح لـ CPU 2 بإطلاق المؤقت المحرر $\rightarrow$ انهيار!