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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-64560-Analysis — تحليل لثغرة استخدام بعد التحرير (UAF) في نواة لينكس الخاصة بـ CVE-2026-64560 مع كود إثبات المفهوم (PoC) المُحفِّز للسباق، ومراجعة التصحيح، ومصفوفة الإصدارات المتأثرة من LTS/أندرويد، وفحص ذاتي للأجهزة المحدّثة. | Kitploit
أدوات/GitHubGitHub/villager1314/cve-2026-64560-analysis
أمان أندرويدتحليل الثغرات الأمنيةالاستغلالأمن الجوالالتعلم والتعليماستغلال الملفات الثنائية
GitHubvillager1314/cve-2026-64560-analysis

CVE-2026-64560-Analysis

تحليل لثغرة استخدام بعد التحرير (UAF) في نواة لينكس الخاصة بـ CVE-2026-64560 مع كود إثبات المفهوم (PoC) المُحفِّز للسباق، ومراجعة التصحيح، ومصفوفة الإصدارات المتأثرة من LTS/أندرويد، وفحص ذاتي للأجهزة المحدّثة.

الأكثر شعبية

عرض الكل →

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

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

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

عرض جميع الأدوات →
مشاركة
عرض المستودع
1145منذ شهر واحدتمت المراجعة من قبل Kitploit

CVE-2026-64560 — Linux Kernel posix-cpu-timers: UAF بسبب سباق exec() من خيط غير قائد

مُعيد الإنتاج / PoC (للتحقق من حدوث الثغرة): Linux وAndroid (NDK) يُستخدم هذا المستودع فقط للتحقق من حالة التصحيح ولأغراض البحث والتعلّم على أجهزة الاختبار الخاصة بك، ولا يحتوي على أي بدائيات تصعيد صلاحيات أو استغلال.

CVSS 3.1 CVSS 4.0 (SUSE) CWE-416 Fix


1. نظرة عامة على الثغرة

الحقلالمحتوى
CVE IDCVE-2026-64560
العنوانposix-cpu-timers: Prevent UAF caused by non-leader exec() race
النوعاستخدام بعد التحرير (Use-After-Free) (CWE-416)، حالة سباق (race condition)
CNAkernel.org (Linux CNA)
CVSS v3.17.8 High — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0 (SUSE)8.5 High — CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
EPSS~0.12% (المئين الثاني، عند 2026-08)
CISA KEVغير مُدرج
تاريخ الإفصاح2026-07-29
التزام الإصلاح (mainline)920f893f735e92ba3a1cd9256899a186b161928d
الالتزام المُسبِّب للمشكلة (Fixes:)55e8c8eb2c7b (v5.7, 2020) — "posix-cpu-timers: Store a reference to a pid not a task"
المُصلِحThomas Gleixner <[email protected]>
المُبلِّغWongi Lee <[email protected]>, Jungwoo Lee <[email protected]>
الملفات المتأثرةkernel/exit.c, kernel/signal.c, kernel/time/posix-cpu-timers.c

الإصدارات المتأثرة

أُدخلت الثغرة في v5.7 (2020-05)، ونُقل الإصلاح (backport) إلى فروع stable المختلفة:

الفرعالمتأثرالإصدار المُصحَّح (≥)التزام الإصلاح في stable
5.10 LTS5.7 ~ 5.10.2615.10.26267aa823e3e8c
5.15 LTS~ 5.15.2125.15.213d8bcb28abad8
6.1 LTS~ 6.1.1796.1.180cc35ddbc4973
6.6 LTS~ 6.6.1466.6.14712a891c773ae
6.12 LTS~ 6.12.996.12.100e74443f5db00
6.18~ 6.18.406.18.416a7ecc25abe6
7.1~ 7.1.47.1.5ad1cafa1bdaa
mainline< 7.2-rc37.2-rc3920f893f735e

الصلة بنظام Android

نواة Android GKI مبنية على 5.10 / 5.15 / 6.1 / 6.6 / 6.12 LTS، وجميعها ضمن النطاق المتأثر. نظرًا لأن التزام الإصلاح الرئيسي (mainline) صدر في 2026-07-29، فإن أجهزة Android التي يكون مستوى التصحيح الأمني (SPL) فيها 2026-08-01 أو قبل ذلك لا تتضمن هذا الإصلاح في الغالب. يمكنك التأكد من إصدار النواة وSPL على الجهاز باستخدام adb shell cat /proc/version وgetprop ro.build.version.security_patch.


2. التفاصيل التقنية

2.1 الخلفية: موقّتات POSIX CPU وsighand

تُدار موقّتات POSIX CPU (timer_create(CLOCK_PROCESS_CPUTIME_ID, ...) / timer_create(CLOCK_THREAD_CPUTIME_ID, ...)) داخل النواة عبر kernel/time/posix-cpu-timers.c. يحتفظ كل k_itimer بالمهمة المستهدفة من خلال it.cpu.pid؛ وعند التعامل مع الموقّت يلزم استدعاء lock_task_sighand(p, &flags) للحصول على sighand->siglock الخاص بتلك المهمة لحماية timerqueue.

الالتزام 55e8c8eb2c7b لعام 2020 استبدل مؤشر task المخزَّن مؤقتًا في الموقّت بـ مرجع pid (لإصلاح مشكلة سبّبها workaround عام 2010 e0a70217107e)، مع إجراء بحث pid_task(pid, type) قبل كل عملية. ترك هذا التغيير نافذة السباق (race window) الخاصة بهذه الثغرة.

2.2 سيناريو السباق (exec من خيط غير قائد)

عندما يتم استدعاء execve() بواسطة خيط غير قائد (non-leader thread)، يؤدي de_thread() → switch_leader() إلى نقل TGID من القائد القديم إلى القائد الجديد، ويمرّ القائد القديم عبر release_task() → __exit_signal()، حيث يتم تعيين old_leader->sighand = NULL واستدعاء unhash_task(old_leader).

في الوقت نفسه، على نواة معالجة (CPU) أخرى، يُنفَّذ sys_timer_delete() → posix_cpu_timer_del():

 sys_timer_delete()                        exec()
   posix_cpu_timer_del()
   // 观察到旧 leader
   p = pid_task(pid, pid_type);            de_thread()
                                             switch_leader();
                                             release_task(old_leader)
                                               __exit_signal(old_leader)
                                                 sighand = lock(old_leader, sighand);
                                                 posix_cpu_timers*_exit();
   sighand = lock_task_sighand(p)            unhash_task(old_leader);
     sh = lock(p, sighand)                   old_leader->sighand = NULL;
                                               unlock(sighand);
     (p->sighand == NULL)
       unlock(sh)
       return NULL;

   // 直接返回,没有摘链!
   if (!sighand)
      return 0;
   free_posix_timer();   // ← k_itimer 被释放

إن p الذي يعثر عليه posix_cpu_timer_del() هو القائد القديم، وعند هذه النقطة يكون p->sighand == NULL، فتعتبر الدالة أن «المهمة في طور الخروج وأن مسار exit سيتكفل بفكّ الارتباط»، وبالتالي تعود بالنجاح دون أن تفعل أي شيء. بعد ذلك يُحرِّر free_posix_timer() كائن k_itimer.

النقطة الأساسية: يختلف exec() عن exit() — ففي exec() لا يتغير TGID، والموقّتات المفعلة (armed) المرتبطة بمستوى العملية (p->signal->cpu_timers) تُورَّث وتبقى في قائمة الانتظار. وبالتالي:

  • run_posix_cpu_timers() (الذي يجتاز timerqueue في كل tick) يصل إلى timerqueue_node لكائن مُحرَّر → قراءة/كتابة UAF؛
  • عمليات الإضافة/الحذف على موقّتات أخرى ستمرّ أيضًا عبر شجرة rbtree التي تحتوي على عُقد معلّقة (dangling) → UAF.

مشكلات مماثلة موجودة أيضًا في:

  • posix_cpu_timer_set(): بالنسبة إلى الموقّت العادي فإنها تُرجع -ESRCH مؤقتًا فقط؛ لكن do_cpu_nanosleep() داخل النواة تستخدم k_itimer مُخَصَّصًا على المكدس (stack)، وهي نفس مشكلة UAF.
  • posix_cpu_timer_rearm(): فشل صامت في إعادة التسليح (rearm)، فلا يعود الموقّت ينقضي (خطأ وظيفي).

2.3 مشكلة ثانوية على البنى ضعيفة الترتيب

أشار Frederic Weisbecker إلى أن tsk->sighand = NULL داخل __exit_signal() هو تخزين عادي (plain store)؛ وعلى البنى ضعيفة الترتيب مثل ARM64، عندما يرصد posix_cpu_timer_del() أن sighand == NULL فإنه ليس مضمونًا أن يرصد أيضًا عمليات الكتابة الخاصة بفكّ الارتباط التي سبقت posix_cpu_timers*_exit()، مما قد يؤدي إلى إنذار خاطئ من WARN_ON_ONCE(timer_queued(tmr)).

2.4 خطة الإصلاح

  1. في __exit_signal() يتم التعديل إلى smp_store_release(&tsk->sighand, NULL)؛
  2. إضافة smp_acquire__after_ctrl_dep() في مسار !sighand داخل lock_task_sighand()؛
  3. إضافة دالة مساعدة جديدة timer_lock_sighand(): تبحث عن المهمة + تقفل sighand، وإذا كان sighand == NULL فإنها لا تعود بل تعيد محاولة البحث — في سيناريو exec ستجد القائد الجديد، ولا تستسلم إلا في سيناريو exit عندما يفشل البحث؛
  4. الدوال الثلاث المتأثرة (_del / _set / _rearm) تتحول جميعها إلى استخدام هذه الدالة المساعدة بشكل موحّد.

انظر الـ diff الكامل في patches/920f893f735e.patch.


3. شرح الـ PoC (تحقق من الإثارة، وليس استغلالًا لتصعيد الصلاحيات)

يوفر مجلد poc/ مُحفِّز سباق (race trigger): خيطان يعمل كل منهما في حلقة عالية الكثافة

  • الخيط A (خيط الموقّت): يكرر timer_create(CLOCK_PROCESS_CPUTIME_ID) → تسليح (arm) (بزمن انتهاء ابتدائي قصير جدًا) → انتظار مشغول (busy-wait) لحدوث الإثارة → timer_delete()؛
  • الخيط B (خيط exec): يكرر fork() → داخل العملية الابنة إنشاء خيط غير قائد، يقوم هذا الخيط باستدعاء execve() (exec من خيط غير قائد شرط ضروري لهذه الثغرة)، وتقوم العملية الأم فورًا باستدعاء waitpid() لاستعادة (reap) العملية.
تنزيل الأداة