
إصلاح نواة OpenVPN من المنبع لـ CVE-2026-74727، تم اختباره على نواة Ubuntu 7.0.0-38.38. يتضمن تعليمات البناء ونتائج الاختبار الوظيفي.
توثيق لعملية بناء محلي، واختبارات وظيفية، ومراجعة مصدرية مركّزة، واختبارات انحدار حتمية لثوابت إعادة التجزئة (rehash) الخاصة بعنوان IP للـ VPN ونقطة نهاية النقل، للإصلاح upstream المرتبط بـ CVE-2026-74727، مقابل حزمة مصدر نواة Ubuntu linux 7.0.0-38.38 على x86_64. كما أُعيد بناء اختبارات نقطة نهاية النقل وتشغيلها على نواة Generic KASAN مبنية محليًا.
هذه مراجعة backport لإصلاح upstream قائم، وليست ثغرة مكتشفة حديثًا ولا إصلاحًا أمنيًا أصليًا. المؤلف المسجَّل في upstream هو Antonio Quartulli. الـ commit المسجَّل هو 33ec10567fe14456063daf549fdf1a4f53448e4c.
رقع upstream: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/?id=33ec10567fe14456063daf549fdf1a4f53448e4c
التغيير في drivers/net/ovpn/peer.c يمنع إعادة تجزئة (rehash) نظير (peer) سبق إزالته من جدول تجزئة معرّف النظير (peer ID). حافظ على ترويسات الرقعة الأصلية والإسناد والترخيص عند توزيعها. هذا التوثيق لا يعيد ترخيص رقعة النواة.
الرقعة الأصلية من upstream مضمّنة بايتًا ببايت. بصمة SHA-256 الخاصة بها تطابق الأثر المستخدم في جلسة الاختبار المسجَّلة. تم التحقق من مؤلفها ورسالة الـ commit وتغييرات الشيفرة مقابل الـ commit العام في upstream على GitHub. لا يتضمن أي ملف ثنائي.
تم التحقق من مجموع التحقق الاختباري للرقعة بشكل مستقل مقابل الملف المضمَّن. سُجِّل مجموع التحقق الاختباري للوحدة أثناء جلسة اختبار المشغّل؛ ولا يُوزَّع الملف الثنائي هنا.
| الأثر | SHA-256 |
|---|---|
CVE-2026-74727-upstream.patch | baf0962c60b182776a86e040d2ec5b35eea2737c2e2eb6f17f87eb7d2fe47b24 |
ovpn.ko المُختبَر | 0853fdce14ce1c4d64857871dc873bf98a1b8fe8243bf042ad6daffc906e6d27 |
استخدم نسخة مستخرجة منفصلة من حزمة المصدر الدقيقة لـ Ubuntu linux 7.0.0-38.38. ثبّت ترويسات النواة المطابقة وسلسلة أدوات البناء أولًا. كان المترجم المسجَّل هو Ubuntu GCC 15.2.0-16ubuntu1، مطابقًا لمترجم النواة قيد التشغيل.
من جذر المصدر، مع وجود الرقعة في الدليل الأب:
patch --dry-run --batch --forward --fuzz=0 -p1 < ../CVE-2026-74727-upstream.patch
patch --batch --forward --fuzz=0 -p1 < ../CVE-2026-74727-upstream.patch
make -C /lib/modules/7.0.0-38-generic/build \
M="$PWD/drivers/net/ovpn" CONFIG_OVPN=m \
CC=x86_64-linux-gnu-gcc -j1 modules
استخدم تطبيق الرقعة المسجَّل صفر fuzz مع إزاحات أسطر قدرها -6 و-5. أعاد البناء رمز الخروج 0. تم تخطي توليد BTF لأن vmlinux لم يكن متاحًا. طابق vermagic الخاص بالوحدة 7.0.0-38-generic SMP preempt mod_unload modversions.
لا يُثبت تطابق vermagic ونجاح البناء أن الوحدة آمنة أو أن الثغرة قد تم التحقق منها بالكامل.
أُجريت الاختبارات يدويًا على جهاز Hyper-V افتراضي يعمل بنظام Ubuntu بنواة 7.0.0-38-generic مع تعطيل Secure Boot. تستند النتائج إلى مخرجات الطرفية التي قدّمها المشغّل:
192.0.2.2 إلى 192.0.2.3؛ وأكدت حالة النظير المُعادة التغيير. اقتصر ذلك على مساحة أسماء اختبار مؤقتة ولم يغيّر عنوان VPN التشغيلي.في 2026-10-06، نفّذت وحدتا اختبار مستقلتان الدالة الفعلية ovpn_peer_hash_vpn_ip() المستخرجة من النسخة الاحتياطية غير المرقّعة والمصدر المرقّع. أُبقيت الكائنات الاصطناعية الخاصة مخصَّصة طوال الوقت. بعد محاكاة إزالة مكتملة من جداول التجزئة، استدعى الاختبار الدالة مرة أخرى تحت ovpn->lock.
| الخاصية | قبل الرقعة | بعد الرقعة |
|---|---|---|
| النظير النشط مُدخَل في جدولي IPv4 وIPv6 | PASS | PASS |
| النظير المُزال يبقى خارج جدولي IPv4 وIPv6 | FAIL | PASS |
| دلاء IPv4 / IPv6 المشغولة بعد إعادة تجزئة النظير المُزال | 1 / 1 | 0 / 0 |
هذا فحص وقت تشغيل للثابت المحدد بعد الإزالة، وليس إعادة إنتاج لحالة تسابق حذف متزامن أو use-after-free. فشل الثابت في خط الأساس متوقع ويُظهر أن الاختبار يميّز بين نسختي الدالة. أُفرغت الوحدتان لاحقًا. بقي VPN التشغيلي نشطًا مع عدم تغيّر عنوانه. احتوى فاصل السجل الذي تمت مراجعته على نتائج الاختبار ولم يحتوي على رسائل BUG أو Oops أو general protection fault أو soft lockup مطابقة.
راجع TESTING.md للاطلاع على المخرجات المسجَّلة وتعليمات إعادة الإنتاج والقيود. يوجد المولّد في tests/prepare-ovpn-rehash-regtest.py.
في 2026-10-06، نفّذت وحدات اختبار مستقلة أيضًا الدالة الفعلية ovpn_peer_endpoints_update() المستخرجة من المصادر غير المرقّعة والمرقّعة، مع مساعدات الربط الإنتاجية. بالنسبة لكل من IPv4 وIPv6، تسببت رؤوس حزم اصطناعية خاصة في أن يطفو نظير نشط، ثم تسببت في تحديث آخر لنقطة النهاية بعد إزالة إدخالات التجزئة الخاصة به بينما بقي تخزينه مخصَّصًا.
| الخاصية، لكل من IPv4 وIPv6 | قبل الرقعة | بعد الرقعة |
|---|---|---|
| النظير النشط يطفو ويبقى في جدول النقل | PASS | PASS |
| يُبلَغ تحديث نقطة النهاية بعد إزالة مُحاكاة | PASS | PASS |
| النظير المُزال يبقى خارج جدول النقل | FAIL | PASS |
| دلاء النقل المشغولة بعد تحديث النظير المُزال | 1 | 0 |
لم تُرسَل أي حزم، ولم تُعدَّل أي واجهات أو نظائر VPN أو عناوين حقيقية. أُفرغت وحدتا الاختبار بعد ذلك؛ وبقي VPN التشغيلي نشطًا مع عدم تغيّر عنوانه. احتوى فاصل السجل الذي تمت مراجعته على نتائج الاختبار الأربع ولم يحتوي على أسطر BUG أو Oops أو general protection fault أو soft lockup مطابقة.
راجع FLOAT-TESTING.md وtests/prepare-ovpn-float-regtest.py للاطلاع على النطاق وتعليمات إعادة الإنتاج والنتائج المسجَّلة.
في 2026-10-06، تم بناء مصدر Ubuntu المراجَع كنواة كاملة باستخدام CONFIG_KASAN=y وCONFIG_KASAN_GENERIC=y وCONFIG_KASAN_OUTLINE=y وCONFIG_STACKTRACE=y. وكانت سلسلة الإصدار الخاصة به 7.0.14-ovpn-kasan. أعادت عمليات بناء النواة والوحدات رمز الخروج 0. أقلعت الآلة الافتراضية بهذه النواة وكانت خدمة VPN الإدارية الخاصة بها نشطة.
أُعيد بناء وحدات float الاصطناعية الموجودة مقابل ذلك البناء الكامل، وتم التحقق منها عبر checksum وvermagic بعد النقل. بقيت نتائج IPv4 وIPv6 دون تغيير: نجحت فحوصات active-peer وendpoint-update في كلا المتغيرين؛ وفشل ثابت removed-peer في النسخة الأساسية ونجح في النسخة المُرقَّعة. لم يظهر أي خطأ KASAN في سجل الاختبار المُفلتر المُقدَّم. هذا تنفيذ للاختبار الاصطناعي مع تمكين KASAN، وليس إعادة إنتاج KASAN لخطأ use-after-free الأصلي. لم يُعَد تشغيل اختبار VPN-IP-only تحت KASAN.
تم تفريغ وحدات الاختبار من الذاكرة. عادت الآلة الافتراضية بعد ذلك إلى نواة التوزيعة 7.0.0-38-generic، وتم التأكد من أن VPN الإدارية نشطة. تبقى نواة الاختبار المثبَّتة بشكل منفصل ووحداتها متاحة للاختبار المستقبلي؛ ونواة التوزيعة مُهيأة كخيار GRUB الافتراضي.
راجع KASAN-TESTING.md للاطلاع على التهيئة والنتائج الدقيقة وتجزئات المخرجات والقيود. وراجع SOURCE-REVIEW.md لمراجعة الأقفال والمراجع ومسار التحرير المركزة بناءً على مقتطفات المصدر التي قدّمها المشغّل.