
أداة اكتشاف وتخفيف الثغرات الأمنية لأخطاء Copy Fail و Dirty Frag (CVE-2026-31431, CVE-2026-43284, CVE-2026-43500)
# vcheck تدقيق مضيف لينكس بعيد عبر SSH بحثًا عن ثغرات نواة "Copy Fail" و "Dirty Frag" (وحدات النواة) واختياريًا تطبيق التخفيفات: | CVE | الاسم | الوحدات المتأثرة | | -------------- | -------------------- | ----------------------------------------------------- | | CVE-2026-31431 | Copy Fail | `algif_aead` | | CVE-2026-43284 | Dirty Frag (IPsec) | `esp4`, `esp6`, `ipcomp4`, `ipcomp6`, `xfrm_user` | | CVE-2026-43500 | Dirty Frag (RxRPC) | `rxrpc`, `kafs` | لكل وحدة متأثرة، يبلغ vcheck عما إذا كانت محملة حاليًا، أو مدمجة في النواة قيد التشغيل، أو لها آثار سابقة في سجلات النواة، أو بها مقابس `AF_ALG` حية (Copy Fail فقط)، وما إذا كانت مدرجة بالفعل في القائمة السوداء تحت `/etc/modprobe.d/`. مع `-fix`، يبلغ vcheck عن الحالة الأولية، ويكتب مقطعًا `cve-XXXX-XXXXX-disable.conf` لأي وحدة غير مدرجة في القائمة السوداء بعد، ثم يعيد تشغيل الفحوصات ويبلغ عن الحالة النهائية. مع `-fix -unload`، يحاول vcheck أيضًا تفريغ الوحدات المتأثرة التي كانت محملة قبل الإصلاح، ثم يستخدم الفحص النهائي للتحقق مما إذا كانت لا تزال محملة. مع `-fix -rebuild-initramfs`، يعيد vcheck بناء initramfs للنواة قيد التشغيل فقط بعد كتابة مقطع، بحيث يتم تضمين القائمة السوداء في صورة الإقلاع التالية. إدخالات النواة الأقدم تحتفظ بـ initramfs الأصلي الخاص بها كخيار احتياطي. ## استخدم `-fix` فقط بعد تشغيل تحقق فقط **قم دائمًا بتشغيل vcheck بدون `-fix` أولاً.** اقرأ التقرير وتأكد من أن الوحدات المتأثرة آمنة لتعطيلها على هذا المضيف قبل إعادة التشغيل باستخدام `-fix`. تعطيل وحدات النواة التي تعتمد عليها أعباء العمل الشرعية يمكن أن يؤثر على المستخدمين ويكسر التطبيقات. بشكل خاص: - تعامل مع `-fix` على أنه آمن **فقط** عندما لا تكون أي من الوحدات المتأثرة محملة حاليًا — أي كل وحدة يتم الإبلاغ عنها إما `mitigated` أو `module not blacklisted` (بدون سطور `VULNERABLE` أو `blacklisted but currently loaded`). الوحدة المحملة تعني دائمًا تقريبًا أن _شيئًا ما على المضيف يستخدمها بنشاط_؛ تحقق من ذلك قبل وضعها في القائمة السوداء. - وحدات IPsec (`esp4`, `esp6`, `ipcomp4`, `ipcomp6`, `xfrm_user`) مطلوبة لأي نشر IPsec/strongSwan/WireGuard-over-IPsec/IKE. وحدات `ipcomp4`/`ipcomp6` تنفذ ضغط حمولة IPComp وقد يتم التفاوض عليها تلقائيًا كجزء من SA IPsec حتى عندما لا تكون مهيأة بشكل صريح. لا تضع أيًا منها في القائمة السوداء على بوابة VPN، أو نقطة نهاية IPsec، أو في أي مكان يعيد فيه `ip xfrm policy` قواعد. لاحظ أن وحدة إطار العمل `xfrm_algo` **ليست** متعمدة في هذه القائمة — وفقًا لتوجيهات البائعين (Red Hat, Ubuntu, AWS)، يكفي حظر وحدات بروتوكول ESP و IPComp بالإضافة إلى واجهة تكوين netlink الخاصة بـ `xfrm_user`، وأن وضع `xfrm_algo` في القائمة السوداء سيكسر كل تحويل xfrm آخر دون فائدة إضافية. - وحدات RxRPC (`rxrpc`, `kafs`) مطلوبة لأي مضيف يقوم بتركيب أنظمة ملفات AFS. تعطيلها سيكسر تلك التركيبات عند الإقلاع التالي. - `algif_aead` يعرض تشفير النواة عبر عائلة المقابس `AF_ALG`. نادرًا ما يستخدمه رمز التطبيق مباشرة، لكن تحقق عن طريق سرد المقابس الحية (`ss -p --af-alg`) والتحقق من المستهلكين في مساحة المستخدم قبل وضعها في القائمة السوداء. مقاطع القائمة السوداء التي يكتبها vcheck تعمل فقط عند وقت تحميل الوحدة (عادة الإقلاع التالي، أو `modprobe -r <module>` بينما النظام خامل). الوحدة التي تكون _محملة بالفعل_ ستستمر في العمل حتى بعد `-fix` — سيقوم vcheck بالإبلاغ عن هذا كـ `blacklisted but currently loaded; run 'modprobe -r' or reboot`. تمرير `-unload` مع `-fix` يطلب من vcheck تشغيل `modprobe -r` للوحدات المتأثرة المحملة بعد كتابة مقاطع القائمة السوداء. استخدمه فقط عندما تكون قد أكدت أن الوحدات آمنة للإزالة من النواة قيد التشغيل. تمرير `-rebuild-initramfs` مع `-fix` يعيد إنشاء initramfs للنواة **قيد التشغيل فقط** (`update-initramfs -u -k $(uname -r)` على Debian/Ubuntu، `dracut -f --kver $(uname -r)` على RHEL/Fedora). النوى الأخرى المثبتة تحتفظ بـ initramfs الحالي دون تغيير، لذلك إذا حدث خطأ بعد إعادة التشغيل يمكنك اختيار إدخال نواة أقدم من قائمة الإقلاع واستعادة النظام. تركيبات النوى المستقبلية تعيد بناء initramfs الخاص بها من الحالة الحالية لـ `/etc/modprobe.d/`، لذلك تنتشر القائمة السوداء تلقائيًا دون الحاجة لإعادة تشغيل vcheck. إذا كان كل من `update-initramfs` و `dracut` غير موجودين (مثل Arch, Alpine, الصور الثابتة)، يحذر vcheck ويستمر — أعد البناء يدويًا باستخدام أداة التوزيعة قبل إعادة التشغيل. يمكن أن يستغرق إعادة البناء عدة دقائق (خاصة `dracut` على المضيفات التي تحتوي على العديد من برامج التشغيل)، مما قد يتجاوز المهلة التشخيصية `-command-timeout`. يتم تشغيله تحت مهلة خاصة به `-initramfs-timeout` (الافتراضي `10m`) بحيث يحصل إعادة البناء على الوقت الذي يحتاجه بينما تبقى الفحوصات السريعة ضمن ميزانيتها الضيقة. قم بزيادة `-initramfs-timeout` للأجهزة البطيئة، أو مرر `0` لتعطيل المهلة تمامًا. أثناء الأوامر البعيدة طويلة الأمد، يرسل vcheck طلبات keepalive SSH كل `30s` افتراضيًا للحفاظ على عدادات الخمول في NAT/جدار الحماية من قطع الاتصال. اضبط هذا باستخدام `-ssh-keepalive`، أو مرر `0` لتعطيله. ## التثبيت **Homebrew (macOS):** ```bash brew install --cask krisiasty/tap/vcheck ``` **الملفات الثنائية الجاهزة** لنظام Linux و macOS و Windows منشورة على [صفحة الإصدارات](https://github.com/krisiasty/vcheck/releases). **من المصدر** (يتطلب Go 1.26+): ```bash go install github.com/krisiasty/vcheck@latest ``` ## الاستخدام ```text vcheck -host HOST [flags] ``` | الإشارة | الافتراضي | الوصف | | ---------------------- | ------------- | ----------------------------------------------------------------------------------------- | | `-host` | _(مطلوب)_ | المضيف البعيد | | `-user` | `$USER` | المستخدم البعيد | | `-port` | `22` | منفذ SSH البعيد | | `-agent` | `true` | استخدام وكيل SSH للمصادقة | | `-identity` | _(فارغ)_ | المسار إلى ملف مفتاح خاص (يطلب عبارة المرور إذا كان مشفرًا) | | `-password` | `false` | طلب كلمة مرور SSH | | `-insecure` | `false` | قبول مفاتيح المضيف غير المسجلة في `known_hosts`؛ عدم التطابق مع مفتاح مسجل لا يزال يفشل | | `-fix` | `false` | كتابة مقاطع `/etc/modprobe.d` للوحدات غير المدرجة في القائمة السوداء بالفعل | | `-unload` | `false` | مع `-fix`، تفريغ الوحدات المتأثرة بعد وضعها في القائمة السوداء | | `-rebuild-initramfs` | `false` | مع `-fix`، إعادة بناء initramfs للنواة قيد التشغيل فقط (`update-initramfs` أو `dracut`) | | `-skip-logs` | `false` | تخطي فحوصات تاريخ سجل النواة | | `-timeout` | `15s` | مهلة اتصال SSH | | `-ssh-keepalive` | `30s` | فترة keepalive SSH (`0` لتعطيل) | | `-command-timeout` | `30s` | مهلة الأمر البعيد (`0` لتعطيل) | | `-initramfs-timeout` | `10m` | مهلة خطوة إعادة بناء initramfs (`0` لتعطيل)؛ تُستخدم فقط مع `-rebuild-initramfs` | | `-debug` | `false` | زيادة مستوى تفصيل السجل | | `-version` | `false` | عرض الإصدار والخروج | يجب أن ينتج واحد على الأقل من `-agent` أو `-identity` أو `-password` طريقة مصادقة قابلة للاستخدام. يتم تجربة الطرق بالترتيب المدرج. مطلوب صلاحيات sudo على الهدف. إذا تم تكوين sudo بدون كلمة مرور، ستستمر الأداة بصمت؛ وإلا فإنها تطلب كلمة مرور مرة واحدة (يتم إخفاء الإدخال) وتغذيها عبر `sudo -S` لكل أمر لاحق. ## رموز الخروج | الرمز | المعنى | | ---- | ----------------------------------------------------------------------------------------- | | `0` | جميع الوحدات المتأثرة موضوعة في القائمة السوداء، غير محملة، غير مدمجة، وغير نشطة | | `1` | خطأ في الاستخدام | | `2` | فشل اتصال SSH | | `3` | فشل مصادقة sudo | | `4` | وحدة واحدة أو أكثر غير مدرجة في القائمة السوداء (لا يوجد تعرض حالي) | | `5` | وحدة واحدة أو أكثر محملة حاليًا، أو مدمجة في النواة، أو قيد الاستخدام النشط | | `99` | فشل داخلي/فحص | ## نموذج إخراج ### مضيف مخفف بالكامل ```console $ vcheck -host host.example.com -identity ~/.ssh/id_ed25519 INF connected user=ops host=host.example.com port=22 INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail" INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)" INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)" INF mitigated cve=CVE-2026-31431 module=algif_aead INF mitigated cve=CVE-2026-43284 module=esp4 INF mitigated cve=CVE-2026-43284 module=esp6 INF mitigated cve=CVE-2026-43284 module=ipcomp4 INF mitigated cve=CVE-2026-43284 module=ipcomp6 INF mitigated cve=CVE-2026-43284 module=xfrm_user INF mitigated cve=CVE-2026-43500 module=rxrpc INF mitigated cve=CVE-2026-43500 module=kafs ``` ### مضيف غير مخفف ومحمل جزئيًا — فحص بسيط ```console $ vcheck -host host.example.com -identity ~/.ssh/id_ed25519 INF connected user=ops host=host.example.com port=22 INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail" INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)" INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)" INF mitigated cve=CVE-2026-31431 module=algif_aead ERR VULNERABLE cve=CVE-2026-43284 module=esp4 loaded=true ERR module not blacklisted cve=CVE-2026-43284 module=esp6 ERR module not blacklisted cve=CVE-2026-43284 module=ipcomp4 ERR module not blacklisted cve=CVE-2026-43284 module=ipcomp6 ERR module not blacklisted cve=CVE-2026-43284 module=xfrm_user ERR module not blacklisted cve=CVE-2026-43500 module=rxrpc ERR module not blacklisted cve=CVE-2026-43500 module=kafs ``` ### نفس المضيف مع `-fix` — التشغيل الأول ```console $ vcheck -fix -host host.example.com -identity ~/.ssh/id_ed25519 INF connected user=ops host=host.example.com port=22 INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail" INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)" INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)" INF findings before fix INF mitigated cve=CVE-2026-31431 module=algif_aead ERR VULNERABLE cve=CVE-2026-43284 module=esp4 loaded=true ERR module not blacklisted cve=CVE-2026-43284 module=esp6 ERR module not blacklisted cve=CVE-2026-43284 module=ipcomp4 ERR module not blacklisted cve=CVE-2026-43284 module=ipcomp6 ERR module not blacklisted cve=CVE-2026-43284 module=xfrm_user ERR module not blacklisted cve=CVE-2026-43500 module=rxrpc ERR module not blacklisted cve=CVE-2026-43500 module=kafs INF writing modprobe.d snippet path=/etc/modprobe.d/cve-2026-43284-disable.conf modules="[esp4 esp6 ipcomp4 ipcomp6 xfrm_user]" INF writing modprobe.d snippet path=/etc/modprobe.d/cve-2026-43500-disable.conf modules="[rxrpc kafs]" INF re-scanning after fix snippets_written=2 INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail" INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)" INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)" INF findings after fix INF mitigated cve=CVE-2026-31431 module=algif_aead ERR blacklisted but currently loaded; run 'modprobe -r' or reboot cve=CVE-2026-43284 module=esp4 INF mitigated cve=CVE-2026-43284 module=esp6 INF mitigated cve=CVE-2026-43284 module=ipcomp4 INF mitigated cve=CVE-2026-43284 module=ipcomp6 INF mitigated cve=CVE-2026-43284 module=xfrm_user INF mitigated cve=CVE-2026-43500 module=rxrpc INF mitigated cve=CVE-2026-43500 module=kafs ``` القائمة السوداء في مكانها، لكن `esp4` كانت محملة بالفعل في النواة قبل كتابة المقطع. أعد التشغيل أو قم بتشغيل `sudo modprobe -r esp4` على الهدف لإزالتها بالكامل. ### التشغيل الثاني — esp4 لا يزال محملة ```console $ vcheck -fix -host host.example.com -identity ~/.ssh/id_ed25519 INF connected user=ops host=host.example.com port=22 INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail" INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)" INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)" INF findings before fix INF mitigated cve=CVE-2026-31431 module=algif_aead ERR blacklisted but currently loaded; run 'modprobe -r' or reboot cve=CVE-2026-43284 module=esp4 INF mitigated cve=CVE-2026-43284 module=esp6 INF mitigated cve=CVE-2026-43284 module=ipcomp4 INF mitigated cve=CVE-2026-43284 module=ipcomp6 INF mitigated cve=CVE-2026-43284 module=xfrm_user INF mitigated cve=CVE-2026-43500 module=rxrpc INF mitigated cve=CVE-2026-43500 module=kafs INF fix: nothing to do — all affected modules already blacklisted ``` ### التشغيل الثالث — بعد `modprobe -r esp4` ```console $ vcheck -host host.example.com -identity ~/.ssh/id_ed25519 INF connected user=ops host=host.example.com port=22 INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail" INF checking vulnerability cve=CVE-2026-43284 name="Dirty Frag (IPsec)" INF checking vulnerability cve=CVE-2026-43500 name="Dirty Frag (RxRPC)" INF mitigated cve=CVE-2026-31431 module=algif_aead INF mitigated cve=CVE-2026-43284 module=esp4 INF mitigated cve=CVE-2026-43284 module=esp6 INF mitigated cve=CVE-2026-43284 module=ipcomp4 INF mitigated cve=CVE-2026-43284 module=ipcomp6 INF mitigated cve=CVE-2026-43284 module=xfrm_user INF mitigated cve=CVE-2026-43500 module=rxrpc INF mitigated cve=CVE-2026-43500 module=kafs ``` ### مع `-rebuild-initramfs` ```console $ vcheck -fix -rebuild-initramfs -host host.example.com -identity ~/.ssh/id_ed25519 ... INF writing modprobe.d snippet path=/etc/modprobe.d/cve-2026-43284-disable.conf modules="[esp4 esp6 ipcomp4 ipcomp6 xfrm_user]" INF writing modprobe.d snippet path=/etc/modprobe.d/cve-2026-43500-disable.conf modules="[rxrpc kafs]" INF rebuilding initramfs for running kernel timeout=10m0s INF initramfs rebuilt for running kernel tool=update-initramfs INF re-scanning after fix snippets_written=2 ... ``` فقط initramfs للنواة قيد التشغيل يتم إعادة بنائه. النوى الأخرى المثبتة تحتفظ بـ initramfs الحالي، لذا يبقى إدخال أقدم في قائمة الإقلاع خيارًا احتياطيًا عمليًا إذا تسبب initramfs الجديد في مشاكل. على مضيف لا يحتوي على `update-initramfs` ولا `dracut`، يسجل vcheck `WRN no supported initramfs tool found ...` ويستمر. ### مضيف لأول مرة — `-insecure` ```console $ vcheck -insecure -host host.example.com -identity ~/.ssh/id_ed25519 WRN host key not in known_hosts; accepting due to -insecure host=host.example.com:22 remote=192.0.2.42:22 fingerprint=SHA256:AAAAEXAMPLEfingerPrint000000000000000000000 INF connected user=ops host=host.example.com port=22 INF checking vulnerability cve=CVE-2026-31431 name="Copy Fail" ... ``` `-insecure` يقبل المضيفين غير الموجودين بعد في `known_hosts`. إذا كان المضيف _مسجلاً بالفعل_ وقدم مفتاحًا مختلفًا، لا يزال الاتصال يفشل — الإشارة هي فقط لتجاوز "الاتصال الأول"، وليست طريقة لكبت تحذيرات الوسيط على مضيف معروف. ## تفاصيل الكشف - **محملة:** يتم جلب `lsmod` مرة واحدة ويتم مطابقة أسماء الوحدات مع العمود الأول. - **مدمجة:** يتم فحص `/lib/modules/$(uname -r)/modules.builtin` و `/sys/module` لأن مقاطع modprobe لا يمكنها تعطيل الكود المترجم في النواة قيد التشغيل. - **مدرجة في القائمة السوداء:** يتم البحث في كل ملف تحت `/etc/modprobe.d/` (`grep -rE`) عن توجيه `install <module> /bin/false` — نفس الشكل الذي يكتبه vcheck مع `-fix`. لا يتم التعرف على أشكال أخرى من التعطيل (مثل `blacklist`). - **نشاط سابق:** يتم استشارة `journalctl -k` أولاً، مع الرجوع إلى `/var/log/kern.log`؛ يتم الاحتفاظ بآخر خمسة أسطر مطابقة لكل وحدة. مرر `-skip-logs` لتخطي هذه الخطوة. - **مقابس نشطة (`algif_aead` فقط):** `ss -p --af-alg` يسرد المقابس المفتوحة `AF_ALG`؛ أي إخراج بخلاف الترويسة يعتبر استخدامًا حيًا. جميع الأوامر تعمل عبر `sudo` ومحددة بـ `-command-timeout` — الوصول المميز مطلوب لقراءة `/var/log/kern.log`، وسرد مقابس `AF_ALG`، والكتابة تحت `/etc/modprobe.d/`. مع `-unload`، الوصول المميز مطلوب أيضًا لتشغيل `modprobe -r`. مع `-rebuild-initramfs`، يقوم vcheck بتشغيل `update-initramfs -u -k $(uname -r)` (Debian/Ubuntu) أو `dracut -f --kver $(uname -r)` (RHEL/Fedora)، والتي تحتاج أيضًا إلى صلاحيات الجذر.