
vcheck v1.6.3
أداة اكتشاف وتخفيف الثغرات الأمنية لأخطاء 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):
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 | مهلة خطوة إعادة بناء initramfs (0 لتعطيل)؛ تُستخدم فقط مع -rebuild-initramfs |
-debug | false | زيادة مستوى تفصيل السجل |
-version | false | عرض الإصدار والخروج |
يجب أن ينتج واحد على الأقل من -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 على الهدف لإزالتها بالكامل.
التشغيل الثاني — 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)، والتي تحتاج أيضًا إلى صلاحيات الجذر.