
أداة اكتشاف وتخفيف الثغرات الأمنية لأخطاء Copy Fail و Dirty Frag (CVE-2026-31431, CVE-2026-43284, CVE-2026-43500)
| 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). الوحدة المحملة تعني دائمًا تقريبًا أن شيئًا ما على المضيف يستخدمها بنشاط؛ تحقق من ذلك قبل وضعها في القائمة السوداء.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, 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):
brew install --cask krisiasty/tap/vcheck
الملفات الثنائية الجاهزة لنظام Linux و macOS و Windows منشورة على صفحة الإصدارات.
من المصدر (يتطلب Go 1.26+):
go install github.com/krisiasty/vcheck@latest
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 |
يجب أن ينتج واحد على الأقل من -agent أو -identity أو -password طريقة مصادقة قابلة للاستخدام. يتم تجربة الطرق بالترتيب المدرج.
مطلوب صلاحيات sudo على الهدف. إذا تم تكوين sudo بدون كلمة مرور، ستستمر الأداة بصمت؛ وإلا فإنها تطلب كلمة مرور مرة واحدة (يتم إخفاء الإدخال) وتغذيها عبر sudo -S لكل أمر لاحق.
| الرمز | المعنى |
|---|---|
0 | جميع الوحدات المتأثرة موضوعة في القائمة السوداء، غير محملة، غير مدمجة، وغير نشطة |
1 | خطأ في الاستخدام |
2 | فشل اتصال SSH |
3 | فشل مصادقة sudo |
4 | وحدة واحدة أو أكثر غير مدرجة في القائمة السوداء (لا يوجد تعرض حالي) |
5 | وحدة واحدة أو أكثر محملة حاليًا، أو مدمجة في النواة، أو قيد الاستخدام النشط |
99 | فشل داخلي/فحص |
$ 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
$ 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 — التشغيل الأول$ 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 على الهدف لإزالتها بالكامل.
$ 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$ 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$ 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$ 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)، والتي تحتاج أيضًا إلى صلاحيات الجذر.
مهلة خطوة إعادة بناء initramfs (0 لتعطيل)؛ تُستخدم فقط مع -rebuild-initramfs |
-debug | false | زيادة مستوى تفصيل السجل |
-version | false | عرض الإصدار والخروج |