
أداة كشف آمنة لثغرة CVE-2026-31431 "Copy Fail" وCVE-2026-43284 "Dirty Frag" — تصعيد صلاحيات محلي في وحدة algif_aead في نواة لينكس يؤثر على جميع التوزيعات الرئيسية منذ 2017.
أدوات كشف آمنة لعائلتين مرتبطتين من ثغرات تصعيد الامتيازات المحلية في نواة لينكس — Copy Fail (CVE-2026-31431) وDirty Frag (CVE-2026-43284 / CVE-2026-43500) — وكلتاهما تؤثران على جميع التوزيعات الرئيسية منذ 2017، وكلتاهما قابلة للاستغلال من قِبَل أي مستخدم محلي غير مميز، وكلتاهما تتطلبان تخفيفات مستقلة.
لا تفتح أدوات الفحص هذه أي مقابس (sockets) ولا تنفذ أي عمليات تشفير أو شبكة. يعتمد الكشف فقط على إصدار النواة، وبيانات حزم التوزيعة، وحالة الوحدات، وعلامات التخفيف النشطة — وكلها قابلة للقراءة للجميع دون
sudo.
تطبيق تخفيف Copy Fail لا يحمي من Dirty Frag. يجب تشغيل كلتا أداتَي الفحص وتطبيق كلا التخفيفين بشكل مستقل.
.
├── cve-2026-31431-check.sh Copy Fail probe (all output modes)
├── copy_fail_userparameter.conf Zabbix agent UserParameter — Copy Fail
├── zabbix_template_copy_fail.yaml Zabbix 6.4 template — Copy Fail
├── copy_fail_auditd.rules auditd behavioral detection — Copy Fail
├── cve-2026-43284-check.sh Dirty Frag probe (all output modes)
├── dirty_frag_userparameter.conf Zabbix agent UserParameter — Dirty Frag
├── wazuh_sca/
│ └── copy_fail_sca.yml Wazuh SCA compliance policy
└── ansible/
└── copy_fall_scan.yml Fleet-wide Ansible scan playbook
يتطلب الاستغلال سلسلة استدعاءات النظام (syscall chain) هذه بالضبط:
socket(AF_ALG, SOCK_SEQPACKET, 0)
bind(fd, {alg_type="aead", alg_name="authesn(hmac(sha256),cbc(aes))"})
accept(fd, ...)
splice(suid_binary_fd, op_fd) ← page cache fed into crypto subsystem
sendmsg / recvmsg ← 4-byte scratch write lands in page cache
لا يلمس الفحص أيًّا من هذه الاستدعاءات. يعتمد الكشف على:
.ko على القرص (قابلة للتحميل التلقائي)modprobe.d وعلامة initcall_blacklist في سطر أوامر النواةchmod +x cve-2026-31431-check.sh
./cve-2026-31431-check.sh # human-readable
./cve-2026-31431-check.sh --json # machine-readable
./cve-2026-31431-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-31431-check.sh --zabbix # integer 0/1/2 for Zabbix item
رموز الخروج: 0 = مُصحَّح أو مُخفَّف · 1 = قابل للاستغلال · 2 = غير معروف
يقارن السكربت هذه العتبات تلقائيًا ويضبط النتيجة على PATCHED عندما تبلغ الحزمة المثبّتة العتبة أو تتجاوزها.
في RHEL وAlmaLinux وRocky Linux ومشتقاتها، تُدمج الوحدة algif_aead في النواة. لا أثر للحل البديل عبر modprobe.d. فقط initcall_blacklist=algif_aead_init في سطر أوامر النواة هو ما يعمل. يكتشف الفحص ذلك ويحذّر صراحةً.
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
يجمع Dirty Frag بين خطأين في المسار السريع لفك التشفير في المكان (in-place decrypt) اكتشفهما Hyunwoo Kim (@v4bel)، وأُفصح عنهما في ~2026-05-07، بعد أسبوع واحد من Copy Fail:
esp4, esp6)؛ الإصلاح الرسمي f4c50a4034e6rxrpc)؛ الإصلاح الرسمي aa54b1d27fe0يُرفق الاستغلال صفحات الأنابيب من ذاكرة التخزين المؤقت للصفحات الخاصة بـ /usr/bin/su كأجزاء مُصفَّحة في مخزن المقبس (socket-buffer fragments)، ثم يقود فك التشفير في المكان بمفتاح يختاره المهاجم — كاتبًا بايتات عشوائية مباشرةً في النسخة المخزَّنة مؤقتًا من ملف ثنائي setuid، دون لمس الملف على القرص.
تخفيف Copy Fail (قائمة حظر algif_aead) لا يمنع Dirty Frag.
chmod +x cve-2026-43284-check.sh
./cve-2026-43284-check.sh # human-readable
./cve-2026-43284-check.sh --json # machine-readable
./cve-2026-43284-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-43284-check.sh --zabbix # integer 0/1/2 for Zabbix item
يفحص السكربت esp4 وesp6 وrxrpc بشكل مستقل، ويُبلغ عن قيمتين منطقيتين منفصلتين cve_43284_safe / cve_43500_safe في مخرجات JSON.
الوحدتان esp4 وesp6 هما تحويلا ESP في جانب النواة المستخدمَين بواسطة IPsec (strongSwan, Libreswan). حظرهما يكسر أنفاق IPsec. يكتشف الفحص الاستخدام النشط لـ IPsec عبر فحص ip xfrm state وكشف الخدمات (daemons)، ويعدّل نصيحة المعالجة وفقًا لذلك:
modprobe.d الكاملة على الوحدات الثلاث جميعها.rxrpc أيضًا بشكل منفصل إن لم تكن بحاجته):
# RHEL-family
sysctl -w user.max_user_namespaces=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
# Ubuntu / Debian
sysctl -w kernel.unprivileged_userns_clone=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
| التوزيعة | CVE-2026-43284 | CVE-2026-43500 (rxrpc) |
|---|---|---|
| RHEL / Rocky / Alma 8.10 | 4.18.0-553.123.2.el8_10 | N/A — rxrpc غير مضمّن في RHEL 8 |
| RHEL / Rocky / Alma 9.x |
للأنظمة التي تنتظر نواة مُصحَّحة، طبّق قائمة حظر modprobe.d فورًا (مع مراعاة تحذير IPsec).
لا تبني AlmaLinux / RHEL 8 وحدة rxrpc إطلاقًا. يضبط الفحص تلقائيًا kernel_vuln_rxrpc=not_affected على RHEL/Rocky/Alma 8.x.
انشر كلا الفحصَين على كل مضيف مُراقَب:
mkdir -p /etc/zabbix/scripts
install -m 750 -o zabbix -g zabbix cve-2026-31431-check.sh /etc/zabbix/scripts/
install -m 750 -o zabbix -g zabbix cve-2026-43284-check.sh /etc/zabbix/scripts/
cp copy_fail_userparameter.conf /etc/zabbix/zabbix_agentd.d/
cp dirty_frag_userparameter.conf /etc/zabbix/zabbix_agentd.d/
systemctl restart zabbix-agent # or zabbix-agent2
استورد zabbix_template_copy_fail.yaml عبر Configuration → Templates → Import.
عناصر UserParameter المتوفرة:
يتضمن قالب Copy Fail مشغِّل HIGH عند status=1 وWARNING عند status=2. لا حاجة إلى sudo — فكل ملف يقرؤه السكربتان قابل للقراءة للجميع.
install -m 755 cve-2026-31431-check.sh /usr/lib/nagios/plugins/
install -m 755 cve-2026-43284-check.sh /usr/lib/nagios/plugins/
# NRPE — add to /etc/nagios/nrpe.cfg:
command[check_copy_fail]=/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios
command[check_dirty_frag]=/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios
# CheckMK local checks:
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios); RC=$?
echo "$RC CVE-2026-31431 - $OUT"' > /usr/lib/check_mk_agent/local/copy_fail
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios); RC=$?
echo "$RC CVE-2026-43284 - $OUT"' > /usr/lib/check_mk_agent/local/dirty_frag
chmod +x /usr/lib/check_mk_agent/local/copy_fail \
/usr/lib/check_mk_agent/local/dirty_frag
يكتشف محاولة استغلال نشطة قيد التنفيذ، ليكمّل بذلك كلا الفحصين الساكنين.
cp copy_fail_auditd.rules /etc/audit/rules.d/
augenrules --load
# Watch for unexpected AF_ALG callers:
ausearch -k copy_fail_af_alg --interpret | \
grep -v -E 'cryptsetup|veritysetup|systemd-crypt|kcapi'
نماذج قواعد Wazuh (من المستوى 13 / 15) مضمّنة في تعليقات ملف .rules.
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
النتائج: Security → SCA → تصفية حسب السياسة cve_2026_31431_copy_fail
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml
# Limit to a subset:
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml --limit webservers
يكتب ملف JSON لكل مضيف + summary.txt إلى /tmp/copy_fail_results/ على عقدة التحكم. يخرج الـ play برمز غير صفري إذا كان أي مضيف VULNERABLE.
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| الوحدات | algif_aead | esp4, esp6, rxrpc |
| أُدخلت | أغسطس 2017 (النواة 4.14) | يناير 2017 / يونيو 2023 |
| التخفيف | قائمة حظر modprobe.d لـ algif_aead | قائمة حظر modprobe.d لـ esp4/esp6/rxrpc |
| سكربت الفحص | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| التوزيعة | الإصدار المُصحَّح | الاستشارة الأمنية |
|---|
| RHEL / Rocky / Alma 8.10 | kernel-4.18.0-553.123.1.el8_10 | Rocky 2026-05-11 |
| RHEL / Rocky / Alma 9.7 | kernel-5.14.0-611.54.1.el9_7 | نفس المرجع |
| RHEL / Rocky / Alma 10.1 | kernel-6.12.0-124.55.1.el10_1 | نفس المرجع |
| Debian 11 (bullseye) | linux 5.10.251-3 | DLA-4560-1 |
| Debian 12 (bookworm) | linux 6.1.170-1 | DSA-6243-1 |
| Debian 13 (trixie) | linux 6.12.85-1 | DSA-6238-1 |
| Ubuntu 22.04 / 24.04 | لا نواة مُصحَّحة بعد — تخفيف عبر kmod بموجب USN-8226-1 | USN-8226-1 |
| SLES 12 SP5 | kernel-default 4.12.14-122.299.1 | SUSE-SU-2026:1669-1 |
| SLES 15 SP5 | kernel-default 5.14.21-150500.55.144.1 | SUSE-SU-2026:1670-1 |
| SLES 15 SP6 | kernel-default 6.4.0-150600.23.92.1 | SUSE-SU-2026:1671-1 |
| SLES 15 SP7 | kernel-default 6.4.0-150700.53.40.1 | SUSE-SU-2026:1669-1 |
| SLES 16.0 | kernel-default 6.12.0-160000.29.1 | استشارة SUSE |
| قيد الانتظار |
| قيد الانتظار |
| Debian / Ubuntu / SLES | قيد الانتظار | قيد الانتظار |
| المفتاح | النوع | المعنى |
|---|
copy_fail.status | int | 0=آمن · 1=ثغرة · 2=غير معروف |
copy_fail.detail | str | نتيجة Copy Fail بصيغة قابلة للقراءة |
dirty_frag.status | int | 0=آمن · 1=ثغرة · 2=غير معروف |
dirty_frag.detail | str | نتيجة Dirty Frag بصيغة قابلة للقراءة |
| التوزيعة | Copy Fail | Dirty Frag |
|---|