
أداة استقصاء مكتوبة بلغة Go تعيد إنتاج ثغرة PwnEscape الخاصة بإزاحة حساب المجموع الاختباري (checksum-offload) في IPv4 على Linux عبر واجهة TAP مُهيأة، حيث تحقن رؤوس virtio مصنوعة وتتحقق من نسخ رأس الجزء (fragment header) خارج الحدود.
أداة فحص مكتوبة بلغة Go لثغرة مجموع التحقق (checksum-offload) في IPv4 على Linux والمعروفة باسم PwnEscape. تتصل بواجهة TAP قمت بإعدادها مسبقًا وتتحقق مما إذا كان مجزّئ الحزم (fragmenter) على المضيف يثق برأس IPv4 أُعيدت كتابته بواسطة skb_checksum_help.
تتولى الأداة حقن الحزم والتقاطها. يُجهّز scripts/setup.sh واجهات المختبر وإعدادات sysctl وقاعدة nftables داخل فضاء الشبكة pwnesc. ويُزيل scripts/teardown.sh المختبر.
على نواة لا تزال تُكمل مجموع تحقق جزئيًا قبل قراءة ihl (أُعيد إنتاج ذلك هنا على 6.18.54؛ وأُصلح في 6.18.57):
csum_start=22. ثم تُزال وسمتا VID-0 (14+4+4)، فتقع كتابة مجموع التحقق على بايت الإصدار/IHL في IPv4.0x45 إلى 0x4f. ويستخدم المجزّئ رأسًا بحجم 60 بايت.-head 8، يكون الرأس الخطي 28 بايت، لذا تقرأ نسخة الرأس البالغة 60 بايت مقدار 32 بايت بعد skb_headlen داخل خيارات IPv4 في حزم الإخراج.يمارس هذا البدائية الخاصة بالكشف (disclosure primitive) الموصوفة في مقال PwnEscape من PWN.AI. مع CONFIG_INIT_ON_ALLOC_DEFAULT_ON، قد تظهر المساحة الخلفية (tailroom) الجديدة في slab كأصفار في البايتات المنسوخة.
ihlip وnft وsysctlnf_conntrack وnf_defrag_ipv4 مضمّنة أو قابلة للتحميل/dev/net/tunمن دليل المستودع على المضيف:
go build -o poc .
sudo ./scripts/setup.sh
sudo ip netns exec pwnesc ./poc
تفتح الأداة pwntap باستخدام IFF_TAP|IFF_NO_PI|IFF_VNET_HDR وتلتقط الإخراج على pwnv1. احتفظ بـ pwntap مخصصًا للأداة. تُفعّل قاعدة ct في nftables إعادة تجميع conntrack، ويستخدم pwnv0 وحدة MTU بقيمة 200 لتجزئة مخطط البيانات المُعاد تجميعه مرة أخرى عند الإخراج.
عند نجاح فحص الرأس تُطبع verify: first byte 0x4f ihl=15. ثم تُبلغ الأداة عن حزم الإخراج وخيارات IPv4 فيها والبايتات المنسوخة بعد الرأس الخطي.
-head (الافتراضي 8): حمولة الحزمة المجزأة عند الإزاحة 0 بالبايت؛ مضاعف للعدد 8 من 8 حتى 40. النسخ المتوقع بعد الرأس الخطي هو 40 - head بايت.-rest (الافتراضي 400): حمولة الحزمة المكمّلة بالبايت؛ 16 على الأقل.-spray (الافتراضي 0): عدد الإطارات متساوية الحجم المخصصة مباشرة قبل الحزمة المجزأة عند الإزاحة 0.-spray-fill (الافتراضي 0xee): البايت المستخدم لملء تلك الإطارات.-page: استخدام رأس page_frag، الذي قد تحتوي مساحته الخلفية على بيانات skb الوصفية. الافتراضي هو رأس slab.-skip-verify: الانتقال مباشرة إلى فحص مخطط البيانات المجزأ.يحدد PWN_TAP واجهة TAP (الافتراضي pwntap). ويحدد PWN_CAP واجهة الالتقاط (الافتراضي pwnv1). يستخدم سكربت الإعداد هذه الأسماء الافتراضية.
بعد انتهاء الأداة، اخرج من أي أوامر طرفية (shells) في pwnesc ونفّذ من المضيف:
sudo ./scripts/teardown.sh
يحذف هذا الأمر pwnesc مع واجهاته وجدول nftables الخاص بـ ip pwn وإعدادات sysctl المحلية لفضاء الشبكة.