
دليل تحليل وتخفيف لثغرة CVE-2026-31431، وهي ثغرة تصعيد صلاحيات محلية في نواة لينكس ضمن النظام الفرعي crypto algif_aead، مع تقييم الأثر لـ RHEL وOpenShift، بما في ذلك تعزيز seccomp وSCC.
تصعيد امتيازات محلي في نظام Linux kernel الفرعي للتشفير algif_aead.
CVE-2026-31431، الملقب بـ "Copy Fail"، هو خطأ منطقي في قالب التشفير authencesn في نواة لينكس (algif_aead). يسمح لمستخدم محلي غير مميز بتنفيذ كتابة محكومة بحجم 4 بايت في ذاكرة التخزين المؤقت للصفحات لأي ملف قابل للقراءة، مما يمكن استغلاله لتعديل ثنائي setuid والحصول على صلاحيات الجذر.
a664bf3d603d| التاريخ | الحدث |
|---|---|
| 2026-03-23 | تم الإبلاغ لفريق أمان نواة لينكس |
| 2026-04-01 | تم تطبيق التصحيح على الفرع الرئيسي |
| 2026-04-22 | تم تعيين CVE |
| 2026-04-29 | الكشف العام |
يتطلب الاستغلال أمرين: مقبس AF_ALG (مسموح به افتراضيًا في جميع ملفات تعريف seccomp) وثنائي setuid (مثل /usr/bin/su). التخفيف الرئيسي هو allowPrivilegeEscalation: false — وهذا يضبط علامة no_new_privs في نواة لينكس عبر prctl(PR_SET_NO_NEW_PRIVS, 1)، مما يجعل النواة تتجاهل بتات setuid/setgid عند execve(). نظرًا لأن الاستغلال يعتمد على تنفيذ ثنائي setuid معدل، فإن هذا يمنع خطوة التصعيد النهائية.
هذه ليست ميزة خاصة بـ OpenShift — تعمل بنفس الطريقة على Kubernetes العادي (معايير أمان البودات المقيدة)، وDocker (--security-opt no-new-privileges)، وPodman. ببساطة، يفرضها OpenShift افتراضيًا عبر SCC restricted-v2، بينما تتطلب المنصات الأخرى تكوينًا صريحًا.
تصدر RHEL 8 وRHEL 9 نوى تحتوي على الكود الضعيف. يمكن لمستخدم محلي غير مميز مع وصول شل استغلال هذا للحصول على صلاحيات الجذر. قم بالتحديث فورًا.
yum updateinfo list cves CVE-2026-31431
yum update kernel
يعمل OpenShift على RHCOS، الذي يصدر النواة الضعيفة. يعتمد التأثير العملي على قيود سياق الأمان (SCC) الخاصة بالحمل.
أحمال العمل القياسية التي تستخدم SCC restricted-v2 الافتراضي غير قابلة للاستغلال لأن allowPrivilegeEscalation: false مفروض.
البودات التي تعمل مع SCC مرتفعة (anyuid، privileged، أو SCC مخصصة تسمح بـ allowPrivilegeEscalation: true) معرضة للخطر. يشمل ذلك عادةً:
anyuidالوصول المباشر للعقدة (مثل عبر oc debug node/) معرض دائمًا للخطر — تصعيد امتيازات محلي قياسي، بدون عزل حاويات.
يتم توفير بود اختبار للتحقق مما إذا كانت متطلبات الاستغلال متوفرة في مجموعتك. لا يحاول استغلال الثغرة — يتحقق فقط من:
AF_ALG؟ (سطح هجوم النواة قابل للوصول)no_new_privs؟ (يمنع تصعيد setuid)oc apply -f test-pod.yaml
oc logs cve-2026-31431-check
oc delete -f test-pod.yaml
استخدم متغير النشر للاختبار عبر عقد متعددة عن طريق توسيع نطاق النسخ المتماثلة أو استخدام مضاد التقارب للبودات:
oc apply -f test-deployment.yaml
oc logs -l app=cve-2026-31431-check
oc delete -f test-deployment.yaml
| الرمز | المعنى |
|---|---|
0 | غير قابل للاستغلال — مقبس AF_ALG محظور بواسطة seccomp |
1 | مكشوف جزئيًا — AF_ALG قابل للوصول ولكن setuid محظور بواسطة no_new_privs |
2 | ضعيف — جميع متطلبات الاستغلال متوفرة |
على مجموعة OpenShift قياسية مع SCC restricted-v2، يجب أن ترى رمز الخروج 1 (مكشوف جزئيًا): يمكن إنشاء مقبس AF_ALG (لا يحجبه RuntimeDefault seccomp)، ولكن no_new_privs يمنع خطوة تصعيد setuid. لن يعمل إثبات المفهوم المنشور، لكن الثغرة على مستوى النواة لا تزال قابلة للوصول — يُوصى بالتحديث.
هذا هو الإصلاح الكامل الوحيد. قم بتحديث النواة على جميع العقد وأعد التشغيل.
بالنسبة لـ OpenShift، قم بالتحديث إلى إصدار RHCOS يتضمن الإصلاح وقم بإعادة تشغيل العقد بشكل متدرج.
إذا تم تجميع algif_aead كـ وحدة قابلة للتحميل (CONFIG_CRYPTO_USER_API_AEAD=m):
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead 2>/dev/null || true
هذا لا يعمل إذا كان algif_aead مدمجًا (=y)، وهو الحال على RHCOS. تحقق باستخدام:
modinfo algif_aead 2>&1 | grep builtin
grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)
إذا كانت وحدة النواة مدمجة، فإن التخفيف الوحيد قبل التحديث للحاويات هو حظر استدعاء النظام socket(AF_ALG, ...) عبر ملف تعريف seccomp مخصص.
أنشئ MachineConfig لوضع الملف التعريفي على جميع العقد (كرر مع role: master لعقد التحكم):
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: worker
name: 99-worker-seccomp-deny-af-alg
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- path: /var/lib/kubelet/seccomp/deny-af-alg.json
mode: 0644
contents:
source: data:application/json;charset=utf-8;base64,ewogICJkZWZhdWx0QWN0aW9uIjogIlNDTVBfQUNUX0FMTE9XIiwKICAic3lzY2FsbHMiOiBbCiAgICB7CiAgICAgICJuYW1lcyI6IFsic29ja2V0Il0sCiAgICAgICJhY3Rpb24iOiAiU0NNUF9BQ1RfRVJSTk8iLAogICAgICAiYXJncyI6IFsKICAgICAgICB7CiAgICAgICAgICAiaW5kZXgiOiAwLAogICAgICAgICAgInZhbHVlIjogMzgsCiAgICAgICAgICAib3AiOiAiU0NNUF9DTVBfRVEiCiAgICAgICAgfQogICAgICBdCiAgICB9CiAgXQp9
المحتوى المشفر base64 يُفك إلى:
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"names": ["socket"],
"action": "SCMP_ACT_ERRNO",
"args": [
{
"index": 0,
"value": 38,
"op": "SCMP_CMP_EQ"
}
]
}
]
}
ملاحظة: تطبيق MachineConfig يؤدي إلى إعادة تشغيل متدرجة للعقد.
securityContext:
seccompProfile:
type: Localhost
localhostProfile: deny-af-alg.json
لحماية جميع الحاويات دون تعديل مواصفات البود، قم بتجاوز ملف تعريف seccomp الافتراضي لـ CRI-O (/etc/crio/seccomp.json) عبر MachineConfig بإضافة قاعدة تصفية AF_ALG إلى الملف التعريفي الموجود.
حدد البودات التي تعمل بصلاحيات مرتفعة:
# ابحث عن البودات التي لا تستخدم restricted-v2
oc get pods -A -o json | jq -r '
.items[] |
select(.metadata.annotations["openshift.io/scc"] != "restricted-v2") |
"\(.metadata.namespace)/\(.metadata.name) → \(.metadata.annotations["openshift.io/scc"])"
'
هذه هي البودات التي تعمل فيها سلسلة الاستغلال الكاملة. أعطِ الأولوية للتحديث أو تخفيف seccomp للعقد التي تشغل هذه الأحمال.
حظر مقابس AF_ALG له تأثير ضئيل على معظم أحمال العمل. ما يلي غير متأثر:
فقط التطبيقات التي تم تكوينها صراحةً لاستخدام محرك OpenSSL afalg ستتأثر.
| البيئة | allowPrivilegeEscalation | جذر الحاوية | جذر المضيف | المخاطر |
|---|
| RHEL 8 / RHEL 9 (مستخدم محلي) | غير متاح | غير متاح | نعم | حرجة |
عقدة OpenShift (وصول شل، مثل oc debug node/) | غير متاح | غير متاح | نعم | حرجة |
بود OpenShift — SCC restricted-v2 (الافتراضي) | false | لا | لا | منخفضة |
بود OpenShift — SCC anyuid | true | نعم | لا (عزل مساحة الأسماء) | عالية |
بود OpenShift — SCC privileged | true | نعم | نعم (بدون عزل) | حرجة |
| بود OpenShift — SCC مخصص | يعتمد | يعتمد | يعتمد | تدقيق |
| بود Kubernetes — PSS Restricted | false | لا | لا | منخفضة |
| بود Kubernetes — PSS Baseline / بدون سياسة | true (افتراضي) | نعم | لا | عالية |
Docker / Podman — --security-opt no-new-privileges | false | لا | لا | منخفضة |
| Docker / Podman — الافتراضي | true | نعم | لا | عالية |