
ترقية آمنة للنواة لمعالجة CVE-2026-98432 على Ubuntu 24.04 مع NVIDIA، وتحليل للخطأ
تنقل هذه العملية جهازًا يعمل بنظام Ubuntu 24.04 مزوّدًا ببطاقة رسومات NVIDIA إلى نواة تُصلح CVE-2026-98432، وهي ثغرة استخدام بعد التحرير (use-after-free) في شيفرة IPv4 TCP الخاصة بالنواة. صُمّمت هذه العملية لجهاز قد لا تتمكن من الوصول إليه إذا فشلت الترقية: لا يُوثق بأي شيء حتى يُقلع النظام، وتتوقف أي خطوة فاشلة صراحةً بدلًا من ترك مضيف معطوب.
فضّل تحديثات Ubuntu العادية إذا كانت تتضمن الإصلاح. وُجد هذا الحل لأنه، في الحالة الطارئة التي كُتب من أجلها، كانت النواة المُصلحة الوحيدة عبارة عن إصدار ما قبل الإصدار في أرشيف staging الخاص بـ Canonical. أما أحدث نواة منشورة، 7.0.0-42، فكانت لا تزال تحوي العلّة.
لا تعتمد على رقم الإصدار. اقرأ شيفرة النواة قيد التشغيل نفسها باستخدام بوابة personal_server:
sudo bash scripts/14_verify_kernel_fixes.sh
يقرأ الشيفرة الآلية للنواة قيد التشغيل من الذاكرة الحية، وللنواة التي يُقلعها GRUB تاليًا من صورتها. في النواة المُصلَّحة، تستدعي inet_sock_destruct وtcp_v4_reqsk_destructor الدالة kvfree_call_rcu. وفي النواة المعرّضة للثغرة تستدعيان kfree.
إذا فشل ذلك، جرّب المسار العادي أولًا:
sudo apt-get update
sudo apt-get install --only-upgrade linux-generic-hwe-24.04
sudo systemctl reboot
استخدم هذا المستودع فقط إذا لم يكن ذلك يجلب نواة ثابتة.
تحتاج إلى نسختك الخاصة، لأن العملية تنشر سجل التدقيق الخاص بها إلى Git أثناء تشغيلها. قم بعمل fork لهذا المستودع، وعلى الجهاز:
git clone <your fork> && cd <it>
kernel-upgrade/install.sh
sudo systemctl reboot
اسمح بنحو 8 دقائق لإعادة التشغيل. تعيد الآلة تشغيل نفسها مرتين إضافيتين، ولا تحتاج منك أي شيء:
uname -r # must print 7.0.0-43-generic
python3 -I kernel-upgrade/upgrade.py status # must say complete
إذا لم تكن الآلة مناسبة، يوضّح المثبّت السبب ولا يغيّر شيئًا. يحتوي kernel-upgrade/PROCEDURE.md على ما يحتاجه المضيف، وكل إخفاق وما ينبغي فعله بشأنه، وحدود الانهيار.
| الإقلاع | من يبدأه | النواة | ما يحدث |
|---|---|---|---|
| 1 | أنت | نواة معروف أنها تعمل هنا | يُثبت أن GRUB يستطيع الكتابة إلى هذا القرص، لذا فإن الإقلاع لمرة واحدة هو فعلًا لمرة واحدة |
| 2 | العملية، مرة واحدة | -43، لمرة واحدة فقط | يقرأ الإصلاح من ذاكرة النواة ويتحقق من كل ما كان لدى المضيف من قبل. يعود الانهيار إلى النواة المعروفة بسلام من تلقاء نفسه |
| 3 | العملية، مرة واحدة | -43، عبر GRUB الأصلي | يُثبت الحالة النهائية، مع استعادة GRUB الأصلي وإزالة كل نواة أخرى |
ما الذي يضمنه:
complete تعني مُثبت. لا يُبلغ عن تلك الحالة إلا بعد إقلاع عبر حالة GRUB والنواة النهائية، ويصل السجل النهائي إلى Git قبل حفظ الحالة.lock.json ما ينبغي تثبيته ولا يحمل أي شيء عن أي آلة. تُقرأ النواة الاحتياطية وقوائم الإزالة وخط الأساس الصحي كلها من المضيف، وتُنشر قبل التغيير الأول.PROCEDURE.md. يستمر الإقلاع التالي أو يتوقف صراحةً.يبني kernel-upgrade/vm/final-run.sh آلات اختبار UEFI من الصفر، بقرص NVMe محاكى بسعة 4 TB، ويشغّل المثبّت نفسه فيها. يسجّل test-report.json تجزئات ما نجح، ويرفض install.sh التشغيل إذا اختلف الكود عن ذلك التقرير.
تغطي السيناريوهات الـ24 انقطاعات كهرباء حقيقية أثناء الحزم، وأثناء التطهير النهائي وبعد السجل النهائي، وانهيارات النواة وتعليقها، وتعطّل GitHub في كل مرحلة، وآلة يجب رفضها. يبني from-zero آلة بالسكربت الحقيقي لـpersonal_server من أرشيف Ubuntu الحقيقي، ويرى البوابة ترفضها، ثم يرقّيها، ويرى البوابة تسمح بها. يحتاج from-zero إلى نسخة مستنسخة من personal_server بجوار هذا المستودع.
ما لا تستطيع الآلات الافتراضية إظهاره مذكور في PROCEDURE.md. أبرزها البرنامج الثابت الحقيقي، وهو ما يختبره الإقلاع 1 على الآلة نفسها.
جرى هذا على خادم متصل بالإنترنت بقرص NVMe بسعة 4 TB وRTX 5090 في 2026-11-02. لا تملك تلك الآلة وحدة تحكم عن بُعد، بل مفتاح طاقة على الشبكة فقط. نجح الإقلاع الأول عبر GRUB الأصلي في كل الفحوص، مع 7.0.0-43 كنواتها الوحيدة والإصلاح مؤكدًا في ذاكرة النواة الحية.
عملت النسخة الأولى من هذه العملية هناك لكنها لم تكن صحيحة. قتلتها systemd في آخر أجزاء من الثانية لديها، لأنها حذفت ملف وحدتها الخاص أثناء التشغيل. كما أعلنت نفسها complete قبل أن يُقلع GRUB الأصلي، وكانت تفاصيل تلك الآلة مضمّنة فيها. هذا المستودع هو إعادة البناء. ثم وجدت مراجعات مستقلة عيوبًا حقيقية أخرى قبل أن تعمل مجددًا، بما في ذلك فحص كان سيمنع كل مضيف NVMe حقيقي بعد تغيّر حزمه.
├── ANALYSIS.md what the bug is, what MPTCP changes, and the limits of that
├── upstream-fix.diff the two-line upstream fix
├── filter/ an interim packet filter. It reduces exposure and isn't a fix
└── kernel-upgrade/
├── PROCEDURE.md the full procedure, failure table and crash boundary
├── install.sh the entry point
├── upgrade.py the controller and the audit publisher
├── lock.json what to install, with hashes
├── cuda-probe.c a real GPU allocation, for the health check
├── test_upgrade.py logic tests against a real Git remote
├── test-report.json what passed, and the exact bytes it covered
├── test-evidence/ the journal of each VM scenario
└── vm/ the VM test harness
الكود مُصدَر بموجب Unlicense. تحتفظ الحزم بتراخيصها الخاصة. يحتوي الإصدار على حزم نواة Canonical وdkms، لأن أرشيف التجهيز يحذف عمليات البناء القديمة. لا تُعاد توزيع حزم NVIDIA هنا: فهي تأتي من أرشيف Ubuntu الخاص بك.