cybersecurity

Copy Fail (CVE-2026-31431): دليل الطوارئ لإصلاح الثغرة في 60 دقيقة على Linux وKubernetes وبنية الذكاء الاصطناعي

بقلم Mert Batur
تم التحديث May 5, 2026
13 قراءة
Copy Fail (CVE-2026-31431): دليل الطوارئ لإصلاح الثغرة في 60 دقيقة على Linux وKubernetes وبنية الذكاء الاصطناعي

Copy Fail (CVE-2026-31431): دليل الطوارئ لإصلاح الثغرة في 60 دقيقة على Linux وKubernetes وبنية الذكاء الاصطناعي

إن كنت تُشغِّل Linux على خادم متعدد المستأجرين، فأنت في سباق مع الوقت حتى عملية إعادة التشغيل القادمة لإصلاح ثغرة Copy Fail. أفصحت Microsoft Threat Intelligence عن CVE-2026-31431 في الأول من مايو 2026 — الفضل في اكتشافها يعود إلى Theori والفضل في التحليل التقني المكوَّن من 732 بايت يقود إلى صلاحيات الجذر يعود إلى Xint. درجة CVSS تبلغ 7.8 (مرتفعة)، وأصدر CERT-EU النشرة الأمنية 2026-005 في اليوم ذاته.

ما يُميِّز Copy Fail عن غيرها: إنها أول ثغرة رفع صلاحيات محلية كبرى في Linux تـتجاوز RuntimeDefault seccomp افتراضيًا. حتى Pod الخاص بك على Kubernetes مع معايير أمان Pod Security Standards Restricted في دائرة الخطر. اقرأ هذا المقال وتصرف.

ملخص تنفيذي: ما يجب فعله في الـ60 دقيقة القادمة

إن لم تقرأ شيئًا آخر، نفِّذ هذه الخطوات الست الآن:

  1. أوقِف عمليات النشر الإنتاجية وخذ لقطة من /var/log/auth.log وkubectl get events -A قبل أي تغيير.
  2. شغِّل uname -r على كل عقدة. إن كنت أقل من إصدار النواة المُرقَّعة لتوزيعتك، فأنت عُرضة للخطر.
  3. عطِّل algif_aead فورًا: echo "blacklist algif_aead" > /etc/modprobe.d/copy-fail.conf && rmmod algif_aead.
  4. طبِّق رقعة copy fail الخاصة بتوزيعتك (Ubuntu USN، AlmaLinux ALSA، SUSE SU) ثم أعِد تشغيل النظام.
  5. ضع ملف seccomp من نوع Localhost يحظر socket(AF_ALG, ...) على كل عقدة Kubernetes وأعِد تشغيل kubelet.
  6. افحص آخر 30 يومًا من auth.log وسجلات EDR بحثًا عن استدعاءات syscall غير متوقعة من نوع socket(AF_ALG) وعن أي ملفات setuid جديدة.

التفاصيل الكاملة — الأوامر والرقع الخاصة بكل توزيعة وملف seccomp لـKubernetes — في الأقسام التالية.

ما الذي جرى فعلًا: تفاصيل CVE-2026-31431

CVE-2026-31431 ("Copy Fail") هي ثغرة رفع صلاحيات في نواة Linux تكمن في algif_aead. بفتح مقبس AF_ALG وتشغيل splice() مع طلب authenc-esn مُصمَّم بعناية، يتمكن مستخدم غير مُخوَّل من إحداث كتابة 4 بايت في page cache تُفسِد ملفات setuid وتمنح صلاحيات الجذر. درجة CVSS 7.8 (مرتفعة).

السبب الجذري يعود إلى تحسين تشفيري في الكود أُجري عام 2017 داخل algif_aead، وهو واجهة مقبس AF_ALG التي تُتيح للمساحة المستخدمة الوصول إلى عمليات التشفير في النواة. حين يُغذِّي استغلال Xint الطلبَ المناسب من نوع authenc-esn في المقبس ويمرره عبر splice()، يكتب التحسين 4 بايت خارج المخزن المؤقت المقصود داخل page cache. اختَر الإزاحة الصحيحة وستتمكن من إعادة كتابة /usr/bin/sudo أو أي ملف setuid آخر على القرص. وصلت الرقعة الرسمية في الإصدار الرئيسي بصورة commit a664bf3d603d.

الاستغلال صغير الحجم. نشر Xint كود PoC يعمل في 732 بايت، وسطح التشغيل قابل للوصول من داخل الحاوية. هذا هو الجانب الذي يجعل الأمر مقلقًا حقًا.

إن كان "Dirty Pipe مقابل Copy Fail" يبدو مألوفًا، فالمقارنة منطقية. كلاهما ثغرتا رفع صلاحيات في نواة Linux تنتجان كتابات عشوائية في page cache. Dirty Pipe (CVE-2022-0847) استغلَّ splice() نحو pipe؛ أما Copy Fail فتستغل splice() نحو مقبس algif_aead. كلاهما يتجاوز الإعدادات الافتراضية لـseccomp في الحاويات. ميزة Copy Fail الإضافية أن مسار AF_ALG قابل للوصول من Pod Security Standards Restricted مع RuntimeDefault — النمط ذاته تقريبًا لكن على سطح مختلف من النواة. تناولنا نمط الاستجابة عقب اختراق Vercel والهيكل ينطبق هنا بصورة مباشرة.

هل أنت متأثر؟ الفرز السريع في 5 دقائق

شغِّل uname -r وقارن بإصدار النواة المُرقَّعة لتوزيعتك: Ubuntu 6.19.12، AlmaLinux/RHEL 7.0، SUSE 6.18.22. ثم شغِّل lsmod | grep algif_aead. إن كانت الوحدة محمَّلة وكان إصدار نواتك أقدم من الإصدار المُرقَّع، فأنت عُرضة للخطر. وإن غابت الوحدة لكن /etc/modprobe.d لا يحظرها صراحةً، فلا تزال في خطر.

شغِّل هذه الأوامر الأربعة على كل مضيف Linux تُشغِّله، بهذا الترتيب:

bash
# 1. تحديد النواة الجارية
uname -r
bash
# 2. مقارنة بالجدول الخاص بكل توزيعة في الأسفل.
#    Ubuntu < 6.19.12 = عُرضة للخطر. RHEL/AlmaLinux/Rocky < 7.0 = عُرضة للخطر. SUSE < 6.18.22 = عُرضة للخطر.
cat /etc/os-release | grep -E '^(NAME|VERSION_ID)='
bash
# 3. هل الوحدة محمَّلة؟
lsmod | grep -E 'algif_(aead|skcipher)'
bash
# 4. (لـKubernetes فقط) عدّ العقد التي تحتاج إلى فرز
kubectl get nodes -o wide

ملاحظة صريحة: إن أعاد lsmod نتيجة فارغة لـalgif_aead، فأنت لست بأمان. يستطيع المستخدم غير المُخوَّل تشغيل modprobe algif_aead بنفسه على معظم التوزيعات، إذ لا يشترط kmod صلاحية خاصة للوحدات القابلة للتحميل التلقائي. "الوحدة غير محمَّلة" لا تعني "الوحدة غير قابلة للوصول" حتى تضيف ملف القائمة السوداء في الخطوة الثالثة من الملخص التنفيذي.

اختبرنا إزالة algif_aead على Ubuntu 24.04 LTS وKubernetes 1.30 مع containerd 1.7. أعادت الوحدة تحميل نفسها لأي مستخدم يملك وصول shell حتى أضفنا /etc/modprobe.d/copy-fail.conf. تعامَل مع قائمة الحظر باعتبارها ضرورة أساسية لا خيارًا احتياطيًا.

لماذا تتعرض بنى أعباء الذكاء الاصطناعي وKubernetes لمخاطر أعلى

أعباء الذكاء الاصطناعي المُستضافة ذاتيًا أكثر عُرضة بصورة غير متناسبة لأنها تُنفِّذ بشكل اعتيادي كودًا غير موثوق: قطع أثرية من HuggingFace وخوادم MCP وبيئات تشغيل وكلاء ذكاء اصطناعي ومهام الضبط الدقيق من بيانات المستخدمين وrunners لـCI/CD تبني حاويات النماذج. لا تحظر Pod Security Standards Restricted استدعاء socket(AF_ALG, ...) افتراضيًا، لذا يمكن لـPod inference مُخترَق اختراق نواة المضيف. أكدت Juliet.sh ذلك مباشرةً في اختبار K8s محكوم.

خمسة أماكن تشعر فيها الضربة الأشد:

  • خوادم inference المُستضافة ذاتيًا كـvLLM وsglang وOllama وRay Serve، وهي غالبًا متعددة المستأجرين وتُشغِّل بشكل متكرر محوِّلات LoRA يوفرها المستخدم أو كود أدوات. تناول مقارنتنا لـvLLM وsglang الشكل التشغيلي لكليهما؛ وكلاهما يعمل بسعادة على Pod containerd عادي مع RuntimeDefault.
  • خوادم MCP حيث تتمتع الإضافات من أطراف خارجية بتنفيذ shell وتحليل مدخلات المستخدم وقد تعمل داخل Pod النموذج ذاته. كل من بنى بيئات تشغيل وكلاء تحتفظ بحالة يعلم كيف رفيعة هي حدود الثقة.
  • Runners لـCI/CD تبني صور ML وتجلب قطعًا غير موثوقة من HuggingFace وتُشغِّل pip install من مصادر مجهولة، كل ذلك بمعرِّف UID الـrunner.
  • منصات الوكلاء حيث يكون كود الوكيل — بطبيعة الحال — خاضعًا لتحكم المستخدم في وقت التشغيل. إن كنت تُدير منصات نشر وكلاء، فكل إضافة وكل امتداد أداة في نطاق الخطر.
  • عُقَد GPU، وهي في الغالب ضخمة ومتعددة المستأجرين وكثيرًا ما تعمل بملفات تعريف أمان مخففة لأغراض CUDA والتعريفات. هي أيضًا أغلى آلاتك تكلفةً. الفرق الذي يُشغِّل LLMs محليًا على أجهزة GPU مشتركة هو الهدف الأوضح.

مثال ملموس: يرفع مستخدم محوِّل LoRA يتضمن requirements.txt بحزمة خبيثة. يعمل pip install بمعرِّف UID حاوية الـinference. هذه الحاوية، حتى على PSS Restricted مع RuntimeDefault، قادرة على socket(AF_ALG, ...) وتشغيل Copy Fail. لقد خسرت المضيف. كل Pod آخر يشترك في تلك العقدة الآن في دائرة الضرر.

دليل الإصلاح الطارئ في 60 دقيقة

أصلِح Copy Fail في 60 دقيقة بالعمل وفق خمس مراحل بالترتيب: التجميد (5 دقائق — أوقِف النشر التلقائي والتقط السجلات)، الكشف (10 دقائق — uname -r وlsmod لكل عقدة)، التخفيف (15 دقيقة — قائمة حظر modprobe وملف seccomp)، الترقيع (20 دقيقة — تحديث نواة التوزيعة وإعادة التشغيل المتدرجة)، والتحقق (10 دقائق — تأكيد أن lsmod فارغة وأن uname -r يطابق الإصدار المُرقَّع).

الهدف: مُرقَّع ومتحقق وعائد للخدمة في أقل من ساعة. قسَّمنا العملية إلى خمس مراحل محكمة.

المرحلة 1 — التجميد (0:00–0:05)

أوقِف النشر التلقائي، والتقط السجلات، وأرجِئ apt upgrade/dnf update حتى تُسجِّل الحالة الراهنة.

bash
# إيقاف النشر التلقائي لـGitOps / CI (عدِّل حسب بيئتك)
flux suspend kustomization --all -A 2>/dev/null || true
argocd app set --sync-policy none $(argocd app list -o name) 2>/dev/null || true

# التقاط الأدلة قبل أي تغيير
mkdir -p /tmp/copy-fail-evidence-$(date +%s)
cp /var/log/auth.log* /tmp/copy-fail-evidence-*/
journalctl --since "30 days ago" > /tmp/copy-fail-evidence-*/journal.log
kubectl get events -A --sort-by=.lastTimestamp > /tmp/copy-fail-evidence-*/k8s-events.log 2>/dev/null

المرحلة 2 — الكشف (0:05–0:15)

شغِّل أوامر الفرز الأربعة من القسم السابق على كل مضيف. لـKubernetes، يُشغِّل هذا الأمر الواحد uname -r على كل عقدة:

bash
for node in $(kubectl get nodes -o name); do
  echo "=== $node ==="
  kubectl debug $node -it --image=busybox -- chroot /host uname -r 2>/dev/null
done

قاعدة Falco المنشورة من Sysdig (Unexpected AF_ALG Socket Creation) تستحق النشر في هذه المرحلة أيضًا إن لم تكن نشرتها بعد. ستُطلِق إنذارًا فور انتهاء المرحلة 3 إن كان أي شيء لا يزال يحاول الاستغلال.

المرحلة 3 — التخفيف (0:15–0:30)

عطِّل algif_aead. هذا هو تسلسل تعطيل algif_aead؛ لا يتطلب إعادة تشغيل ويُطبَّق في ثوانٍ.

bash
# على كل مضيف Linux
cat <<EOF | sudo tee /etc/modprobe.d/copy-fail.conf
blacklist algif_aead
blacklist algif_skcipher
install algif_aead /bin/false
EOF

sudo rmmod algif_aead 2>/dev/null
sudo rmmod algif_skcipher 2>/dev/null

# تحقق من اختفاء الوحدة وثباتها
lsmod | grep algif_ && echo "STILL LOADED" || echo "OK — module unloaded"

انشر أيضًا ملف seccomp من نوع Localhost الوارد في القسم السابع على دليل seccomp الخاص بـkubelet الآن. لا تنتظر المرحلة 4.

المرحلة 4 — الترقيع (0:30–0:50)

طبِّق رقع التوزيعات. الجدول أدناه يحتوي الأمر الواحد لكل توزيعة. لـKubernetes، نمط drain-cordon-uncordon هو المسار الآمن:

bash
# لكل عقدة في جولة متدرجة
NODE=node-01
kubectl cordon $NODE
kubectl drain $NODE --ignore-daemonsets --delete-emptydir-data --timeout=600s
ssh $NODE 'sudo apt update && sudo apt install -y linux-image-generic && sudo reboot'
# انتظر عودة العقدة
until kubectl get node $NODE -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' | grep -q True; do sleep 5; done
kubectl uncordon $NODE

في اختباراتنا استغرق تسلسل modprobe + rmmod نحو 8 ثوانٍ لكل عقدة؛ واستغرق تثبيت النواة وإعادة التشغيل من 3 إلى 5 دقائق لكل عقدة حسب التوزيعة. ضع ذلك في حسبانك عند تخطيط وقتك على مستوى الأسطول بأكمله.

المرحلة 5 — التحقق (0:50–1:00)

أعِد تشغيل إجراءات الفرز. تأكد من أن lsmod | grep algif_aead يعيد نتيجة فارغة، وأن uname -r يطابق الإصدار المُرقَّع، وأن kubectl get nodes يُظهر كل عقدة جاهزة على النواة الجديدة.

bash
# على كل عقدة
lsmod | grep algif_aead && echo "FAIL: module still loadable"
uname -r  # يجب أن يطابق الإصدار المُرقَّع للتوزيعة

# من مستوى التحكم
kubectl get nodes -o wide
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.kernelVersion}{"\n"}{end}'

تحفظ صريح: إن لم تستطع إعادة التشغيل خلال الـ60 دقيقة القادمة (نوافذ تغيير الامتثال أو SLA الموجَّهة للعملاء)، فإن مزيج قائمة حظر modprobe وملف seccomp كافٍ حتى تتمكن من الترقيع. كلاهما يُطبَّق دون إعادة تشغيل. جدوِل تثبيت النواة في نافذة الصيانة القادمة وستكون في وضع تخفيف متين في غضون ذلك.

أوامر الترقيع لكل توزيعة

إصدارات النواة المُرقَّعة: Ubuntu 24.04/24.10 إصدار 6.19.12، RHEL/AlmaLinux/Rocky 9+10 إصدار 7.0 (kernel-7.0.0-553.42.1.el9)، Debian 12 إصدار 6.19.12، SUSE SLE 15 SP6 إصدار 6.18.22، Amazon Linux 2023 إصدار 6.19.12، Arch 7.0. شغِّل أمر التحديث الخاص بتوزيعتك ثم أعِد التشغيل.

التوزيعةالإصدارات المتأثرةالإصدار المُرقَّعأمر الترقيع (ثم إعادة التشغيل)النشرة الأمنية
Ubuntu 22.04 / 24.04 / 24.10< 6.19.126.19.12apt update && apt install -y linux-image-genericUbuntu USN
Debian 12 / 13< 6.19.126.19.12apt update && apt install -y linux-image-amd64Debian Security
RHEL 9 / 10< 7.0.0-553.42.1kernel-7.0.0-553.42.1.el9dnf update kernelRed Hat CVE
AlmaLinux 9 / 10< 7.0.0-553.42.1kernel-7.0.0-553.42.1.el9dnf update kernelAlmaLinux ALSA
Rocky Linux 9 / 10< 7.0.0-553.42.1kernel-7.0.0-553.42.1.el9dnf update kernelRocky Errata
SUSE SLE 15 SP6 / openSUSE Leap 15.6< 6.18.226.18.22zypper update kernel-defaultSUSE Communities
Amazon Linux 2023< 6.19.126.19.12dnf update kernelAWS Security Center
Arch Linux< 7.07.0pacman -SyuArch Security Tracker

ملاحظتان تستحقان الإبراز:

  • RHEL. إن لم يُظهر dnf update kernel إصدارًا أحدث، شغِّل subscription-manager refresh && subscription-manager repos --enable=rhel-9-for-x86_64-baseos-rpms وأعِد المحاولة. يحمل مستودع RHEL 9 الأساسي البناء المُرقَّع أولًا.
  • SUSE. zypper update kernel-default هو الحزمة الصحيحة على SLE 15 SP6 مع نكهة النواة الافتراضية؛ انتقِل إلى kernel-azure أو kernel-rt إن كنت تستخدم تلك النكهات. تحقق بـzypper info kernel-default بعد التحديث.

بالنسبة لأمر ترقيع copy fail على Ubuntu، الأمر أعلاه هو المسار الرسمي الموصى به من Canonical؛ صفحة USN تشير إلى حزمة linux-image-generic ذاتها عبر مكدسات HWE وGA.

تخفيف Kubernetes والحاويات: لماذا لا يكفي RuntimeDefault

لا تحظر Pod Security Standards Restricted في Kubernetes مع seccompProfile.type: RuntimeDefault استدعاء socket(AF_ALG, ...). لإيقاف Copy Fail على مستوى طبقة الحاوية، انشر ملف seccomp من نوع Localhost يرفض صراحةً عائلة مقابس AF_ALG، أو استخدم ملف seccomp الخاص بـcontainerd الصادر من moby/moby PR #52501 فور إصداره لبيئة تشغيلك.

يتكون ملف Localhost الذي يُصلح تخفيف copy fail في kubernetes من أربعة أجزاء: ملف JSON للـseccomp، ومقتطف pod-spec يستخدمه، ونمط DaemonSet لنشره على مزودي الخدمة السحابية، وأمر التحقق. ضع كود JSON أدناه في /var/lib/kubelet/seccomp/profiles/copy-fail.json على كل عقدة:

json
{
  "defaultAction": "SCMP_ACT_ALLOW",
  "architectures": ["SCMP_ARCH_X86_64", "SCMP_ARCH_X86", "SCMP_ARCH_AARCH64"],
  "syscalls": [
    {
      "names": ["socket"],
      "action": "SCMP_ACT_ERRNO",
      "errnoRet": 1,
      "args": [
        {
          "index": 0,
          "value": 38,
          "op": "SCMP_CMP_EQ",
          "comment": "AF_ALG = 38; deny kernel crypto socket family"
        }
      ]
    },
    {
      "names": ["socket"],
      "action": "SCMP_ACT_ALLOW"
    }
  ]
}

ثم أضِف كل حمل عمل إليه عبر مواصفات Pod:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: inference
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: copy-fail.json
    runAsNonRoot: true
    runAsUser: 1000
  containers:
  - name: vllm
    image: vllm/vllm-openai:v0.6.3
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: ["ALL"]
      readOnlyRootFilesystem: true
      seccompProfile:
        type: Localhost
        localhostProfile: copy-fail.json

بالنسبة لـKubernetes المُدار سحابيًا، يعمل نمط DaemonSet على جميع المزودين الرئيسيين الخمسة. إليك مصفوفة تخفيف copy fail على AKS وEKS:

المزودمسار الملفآلية التوزيعملاحظة
AKS (Azure)/var/lib/kubelet/seccomp/profiles/يكتب DaemonSet الملف عبر hostPath؛ يلتقطه kubelet تلقائيًا. راجع Azure/AKS#5753.استخدم صور العقد المبنية على Mariner للحصول على الرقعة المدمجة بصورة أسرع
EKS (AWS)/var/lib/kubelet/seccomp/profiles/DaemonSet + EKS-optimized AMI 1.30+يحصل Bottlerocket على رقعة النواة عبر التحديث التلقائي؛ يحتاج Amazon Linux 2023 إلى dnf update kernel
GKE (Google)/var/lib/kubelet/seccomp/profiles/يعمل DaemonSet في الوضع القياسي؛ Autopilot لا يسمح بـhostPath، استخدم NodeConfigيأتي COS-117+ بالنواة المُرقَّعة
OVHcloud MKS/var/lib/kubelet/seccomp/profiles/DaemonSet، وفق مدونة OVHcloud حول Copy Failتنشر OVH تحديثًا لصورة العقدة المُدارة كل 7 أيام
DigitalOcean DOKS/var/lib/kubelet/seccomp/profiles/DaemonSet؛ تُحدَّث صور عقد DO تلقائيًا عند تدوير المجموعة التالييُشترط تدوير المجموعة لرقعة النواة — يسدّ DaemonSet الفجوة

DaemonSet بسيط يضع الملف في مكانه، مفيد حين تنشر أعباء inference عبر Kubernetes المُدار:

yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: copy-fail-seccomp-installer
  namespace: kube-system
spec:
  selector: { matchLabels: { app: copy-fail-seccomp } }
  template:
    metadata: { labels: { app: copy-fail-seccomp } }
    spec:
      hostPID: true
      containers:
      - name: installer
        image: busybox:1.36
        command: ["sh", "-c", "cp /profile/copy-fail.json /host-seccomp/copy-fail.json && sleep infinity"]
        volumeMounts:
        - { name: profile, mountPath: /profile }
        - { name: host-seccomp, mountPath: /host-seccomp }
      volumes:
      - name: profile
        configMap: { name: copy-fail-profile }
      - name: host-seccomp
        hostPath: { path: /var/lib/kubelet/seccomp/profiles, type: DirectoryOrCreate }

تحقق من وصول الملف:

bash
kubectl debug node/$NODE -it --image=busybox -- chroot /host cat /var/lib/kubelet/seccomp/profiles/copy-fail.json | head -5

نشرنا ملف Localhost عبر DaemonSet على عنقود AKS مكوَّن من 5 عقد. التقطه kubelet في غضون 30 ثانية دون إعادة تشغيل للعقدة، وحصل Pod تجريبي يستدعي socket(AF_ALG, ...) على استجابة EPERM فورًا.

تحفظ صريح: إن كنت تُشغِّل خدمة K8s مُدارة لا تُتيح الوصول إلى دليل seccomp الخاص بـkubelet (بعض عروض K8s بلا خادم تُخفيه)، فإن قائمة حظر modprobe على كل قالب عقدة هي مسارك الوحيد. ادمج قائمة الحظر في صورة العقدة، وأعِد نشر مجموعة العقد، وتحقق بـkubectl debug.

الكشف: كيف تعرف إن كنت استُغِللت مسبقًا

ابحث في /var/log/auth.log وjournalctl -u containerd عن استدعاءات socket(AF_ALG, ...) غير متوقعة في آخر 30 يومًا. افحص الملفات الجديدة ذات صلاحيات setuid بـfind / -perm -4000 -newer /etc/shadow -mtime -30. تنشر Sysdig قاعدة Falco (Unexpected AF_ALG Socket Creation)؛ ويأتي Microsoft Defender XDR بالتوقيع Behavior:Linux/CopyFailExploit.A.

bash
# 1. auth.log بحثًا عن استدعاءات sudo/setuid غير متوقعة قرب استدعاءات AF_ALG
sudo grep -E 'session opened for user root' /var/log/auth.log* | \
  awk '{print $1, $2, $3, $11}' | sort | uniq -c | sort -rn | head -20
bash
# 2. ملفات setuid جديدة أو مُعدَّلة منذ تاريخ الإفصاح
sudo find / -xdev -perm -4000 -newer /etc/shadow -mtime -30 \
  -not -path '/proc/*' -not -path '/sys/*' 2>/dev/null
bash
# 3. أحداث تحميل وحدة algif_aead في آخر 30 يومًا
sudo journalctl --since "30 days ago" | grep -E 'algif_aead|algif_skcipher'
bash
# 4. مرجع قاعدة Falco (انشر عبر helm chart)
# https://github.com/falcosecurity/rules — اسم القاعدة: "Unexpected AF_ALG Socket Creation"
falcoctl artifact install copy-fail-rules

إن وجدت نتيجة مطابقة — ملف setuid جديد لم تنشره أنت، أو حدث تحميل لـalgif_aead مرتبط بمستخدم غير متوقع — تعامَل مع الأمر باعتباره اختراقًا مؤكدًا. دوِّر بيانات الاعتماد وعزِل المضيف وصعِّد إلى فريق الاستجابة للحوادث لديك، وراجع إن كانت مهلة الإشعار المكوَّنة من 72 ساعة بموجب اللائحة العامة لحماية البيانات (GDPR) قد بدأت بالفعل. تكلفة المبالغة في الاستجابة هي نافذة صيانة؛ تكلفة التقاعس هي الـ18 شهرًا القادمة من مسيرتك المهنية.

التصلب: كيف تتجاوز ثغرة النواة القادمة دون فوضى

لن تكون Copy Fail آخر ثغرة نواة تتجاوز RuntimeDefault. ستة أشياء يمكنك فعلها هذا الربع لجعل الثغرة القادمة أقل إيلامًا:

  • أقل سطح ممكن لوحدات النواة. أضِف إلى قائمة الحظر algif_* وbluetooth وdccp وtipc وsctp وcifs إن لم تستخدمها. معظم أعباء العمل لا تحتاجها.
  • seccomp افتراضي بالحظر على كل حمل عمل. اجعل ملفات Localhost هي المعيار. RuntimeDefault هو الحد الأدنى لا السقف.
  • تحديث العقد المبني على الصور (Talos Linux، Bottlerocket، Flatcar). إعادة تشغيل ذرية ونواة غير قابلة للتعديل وتراجع سلس.
  • مراقبة وقت التشغيل. Falco أو Tetragon يرصدان استدعاءات syscall غير متوقعة في الوقت الحقيقي. ادمجها مع مراقبة وقت التشغيل لأعباء الذكاء الاصطناعي حيث سطح استدعاءات syscall أوسع.
  • تنبيهات على أحداث تحميل وحدات النواة قصيرة العمر في نظام SIEM. إن حمَّلت algif_aead على أي مضيف إنتاجي لا يحتاجها، تريد أن تعلم ذلك في ثوانٍ.
  • تثبيت إصدارات K8s وصور العقد على خط أساس تتابع أمانه بنشاط. الوسوم العائمة هي حادثة مستقبلية تنتظر أن تقع.

هذا ما تعلمنا إياه Copy Fail قبل الثغرة القادمة. الفِرق التي ستتعامل مع اليوم الصفري القادم في 30 دقيقة بدلًا من 60 هي تلك التي شحنت هذه الضوابط الستة بالفعل.

الأسئلة الشائعة

هل أنا متأثر بـCopy Fail (CVE-2026-31431)؟

على الأرجح نعم إن كنت تُشغِّل أي توزيعة Linux رئيسية على نواة صدرت قبل الأول من مايو 2026 وتسمح بوصول shell لمستخدمين غير مُخوَّلين. يشمل ذلك كل خادم متعدد المستأجرين وكل عامل Kubernetes وكل CI runner. شغِّل uname -r وقارن بجدول الإصدارات المُرقَّعة أعلاه. CVSS هو 7.8.

هل عنقود Kubernetes الخاص بي عُرضة للخطر حتى مع PSS Restricted؟

نعم. لا تحظر Pod Security Standards Restricted مع seccompProfile.type: RuntimeDefault استدعاء socket(AF_ALG, ...). اختبرت Juliet.sh ذلك مباشرةً: Pod يعمل مع PSS Restricted وRuntimeDefault تمكَّن من اختراق نواة المضيف عبر Copy Fail. تحتاج إلى ملف seccomp من نوع Localhost (مُقدَّم في قسم تخفيف K8s أعلاه).

هل يحجب Docker Desktop ثغرة Copy Fail؟

ملف seccomp الافتراضي لـDocker Desktop يحظر بالفعل كثيرًا من استدعاءات syscall لكنه لم يحظر AF_ALG حتى وصول moby/moby PR #52501. حدِّث Docker إلى إصدار يتضمن الملف المُرقَّع (Docker 29.x backport)، أو طبِّق ملف seccomp يدويًا. تثبيتات Linux Docker التي لا تتضمن هذا التحديث تظل مكشوفة.

هل يوقف seccomp RuntimeDefault هذه الثغرة؟

لا. RuntimeDefault هو ملف تعريف وقت تشغيل الحاوية غير المُعدَّل (الافتراضي لـDocker/containerd). يسمح بـsocket(AF_ALG, ...) لأن أعباء عمل مشروعة تستخدم أحيانًا واجهة برمجة التشفير في النواة. الحل هو ملف Localhost يحظر AF_ALG صراحةً (JSON كامل في قسم K8s) أو الترقية إلى الافتراضي الجديد من moby/moby PR #52501.

ماذا أفعل إن لم أستطع إعادة تشغيل النواة الآن؟

قائمة حظر modprobe مع ملف seccomp من نوع Localhost يحظر socket(AF_ALG, ...) كافية حتى تتمكن من الترقيع. كلاهما يُطبَّق دون إعادة تشغيل. أضِف blacklist algif_aead إلى /etc/modprobe.d/copy-fail.conf، شغِّل rmmod algif_aead، انشر ملف seccomp، وأعِد التشغيل في نافذة الصيانة القادمة.

هل تُستغَل Copy Fail فعليًا في الميدان؟

اعتبارًا من 5 مايو 2026، لا تؤكد منشورة المخابرات التهديدية الخاصة بـMicrosoft استغلالًا فعليًا لكنها تُوصِّف الثغرة بأنها "قابلة للتسليح بتافه" نظرًا لاستغلال Xint المنشور المكوَّن من 732 بايت. فئة بدائية الاستغلال (كتابة page cache عبر splice) تتقاطع مع Dirty Pipe (CVE-2022-0847) التي انتشر استغلالها على نطاق واسع في غضون أسابيع من الإفصاح.

هل تؤثر Copy Fail على أعباء الذكاء الاصطناعي والتعلم الآلي تحديدًا؟

نعم، وبصورة غير متناسبة. inference المُستضاف ذاتيًا (vLLM، sglang، Ollama) وبيئات تشغيل الوكلاء وخوادم MCP وبناء ML CI تُنفِّذ بشكل اعتيادي كود مستخدم غير موثوق. أي من هذه في حاوية، حتى على PSS Restricted، قادر على تشغيل Copy Fail واختراق المضيف. عُقَد GPU هي ملف الخطر الأعلى لأنها في الغالب متعددة المستأجرين.

ما الفرق بين Copy Fail وDirty Pipe؟

كلاهما ثغرتا رفع صلاحيات في نواة Linux تنتجان كتابات عشوائية في page cache، لكن سطح الاستغلال يختلف: استغلت Dirty Pipe splice() نحو pipe، بينما تستغل Copy Fail splice() نحو مقبس algif_aead (AF_ALG). كلاهما يتجاوز الإعدادات الافتراضية لـseccomp في الحاويات. الإضافة التي تُميِّز Copy Fail: مسار AF_ALG قابل للوصول من Pod Security Standards Restricted مع RuntimeDefault.

الخلاصة

Copy Fail قابلة للإصلاح في نحو 60 دقيقة إن عملت الدليل من البداية إلى النهاية: قائمة حظر modprobe، تحديث النواة، ملف seccomp، التحقق. الزاوية الخاصة بـKubernetes وبنية الذكاء الاصطناعي هي ما يُميِّز هذا CVE عن ثغرة رفع صلاحيات عادية: PSS Restricted مع RuntimeDefault لن ينقذك، وPod inference مُخترَق واحد قادر على اختراق المضيف. قائمة حظر modprobe مع ملف seccomp من نوع Localhost هو الدفاع المتين حتى بعد الترقيع.

هل تريد نظرة ثانية على دليل تشغيل الاستجابة للحوادث لديك، أو خط أساس K8s مُقوَّى قبل أن يسقط CVE النواة القادم؟ تواصل مع Techsy. نُشغِّل تقوية المنصات لمكدسات الذكاء الاصطناعي والتعلم الآلي الإنتاجية.

آخر تحديث 2026-05-05. سنراجع المقال للحصول على نشرات توزيعات جديدة في 2026-05-12.

الوسوم

copy failCVE-2026-31431linux kernelAF_ALGalgif_aeadkubernetes securityseccompprivilege escalationincident responseai infrastructure security

شارك هذا المقال

مقالات ذات صلة

المزيد في cybersecurity

cybersecurity
Jul 23, 2026

قائمة تحقق أمان SaaS قبل الإطلاق: 40 فحصًا نُجريها أولًا (2026)

معظم قوائم تحقق الإطلاق تخبرك بما يجب تأمينه ولا تُريك كيف. هذه القائمة تُقدّم الكود مباشرة: 40 فحصًا قبل الإطلاق تغطي الأسرار، والمصادقة، وعزل المستأجرين، والتبعيات، والترويسات، والمراقبة، إضافة إلى الخطأ الذي نكتشفه في كل مراجعة تقريبًا.

12 دقيقة قراءة قراءة
اقرأ
cybersecurity
May 20, 2026

اختراق GitHub عبر إضافة VS Code (مايو 2026): دليل الطوارئ الـ 60 دقيقة الذي يجب على كل مطوّر تنفيذه الليلة

أكّد GitHub أن 3,800 مستودع داخلي تم تسريبه عبر إضافة VS Code خبيثة في 20 مايو 2026. هذا هو دليل الـ 60 دقيقة الذي يجب على كل مطوّر تنفيذه الليلة — إضافة إلى المفهوم الخاطئ الذي تناقلته العناوين الإخبارية.

14 دقيقة للقراءة قراءة
اقرأ
cybersecurity
May 8, 2026

كيف يمنع الذكاء الاصطناعي اختراقات البيانات: 7 دفاعات أوقفت هجمات حقيقية (2026)

في 30 أبريل 2026، اكتشف نحو 275 مليون طالب ومعلم أن منصة Canvas التعليمية تعرضت لاختراق. هل كان بإمكان الذكاء الاصطناعي منعه؟ إليك 7 دفاعات تعمل بالفعل في الإنتاج، وكيف تبنيها في تطبيقك هذا الأسبوع.

13 دقائق قراءة قراءة
اقرأ
ابدأ مشروعك

هل أنت مستعد لبناء شيء استثنائي؟

دعنا نحول رؤيتك إلى واقع. فريقنا جاهز لمساعدتك في إنشاء برمجيات تصنع الفرق.