
Copy Fail (CVE-2026-31431): Το 60λεπτο Πλάνο Έκτακτης Αντιμετώπισης για Linux, Kubernetes και Υποδομές AI
Αν εκτελείτε Linux σε περιβάλλον πολλαπλών ενοικιαστών (multi-tenant), έχετε χρόνο μέχρι το επόμενο reboot σας για να διορθώσετε την ευπάθεια copy fail. Η Microsoft Threat Intelligence αποκάλυψε το CVE-2026-31431 την 1η Μαΐου 2026 — τα εύσημα για την ανακάλυψη ανήκουν στην Theori και στην Xint για το άρθρο ανάλυσης των 732 bytes για απόκτηση root. Η βαθμολογία CVSS είναι 7.8 (Υψηλή) και η CERT-EU εξέδωσε την ίδια ημέρα την advisory 2026-005.
Αυτό που κάνει το Copy Fail διαφορετικό είναι ότι αποτελεί την πρώτη μεγάλη ευπάθεια LPE (Local Privilege Escalation) στο Linux που παρακάμπτει το RuntimeDefault seccomp εξ ορισμού. Το «ασφαλές» pod του Kubernetes σας, με τα Pod Security Standards Restricted, βρίσκεται εντός του πεδίου εφαρμογής. Διαβάστε το και δράστε άμεσα.
TL;DR: Τι να κάνετε στα επόμενα 60 λεπτά
Αν δεν διαβάσετε τίποτα άλλο, κάντε αυτά τα έξι πράγματα αμέσως:
- Παύστε τις αναπτύξεις παραγωγής και δημιουργήστε snapshot των
/var/log/auth.logκαιkubectl get events -Aπριν ξεκινήσετε οποιαδήποτε διαδικασία αλλαγής credentials ή keys. - Εκτελέστε
uname -rσε κάθε κόμβο. Αν βρίσκεστε κάτω από τον patched πυρήνα για τη διανομή σας, είστε ευάλωτοι. - Απενεργοποιήστε το
algif_aeadάμεσα:echo "blacklist algif_aead" > /etc/modprobe.d/copy-fail.conf && rmmod algif_aead. - Εφαρμόστε το patch copy fail της διανομής σας (Ubuntu USN, AlmaLinux ALSA, SUSE SU) και κάντε reboot.
- Εγκαταστήστε ένα Localhost seccomp profile που απαγορεύει το
socket(AF_ALG, ...)σε κάθε κόμβο Kubernetes και επαναφορτώστε το kubelet. - Ελέγξτε τα auth.log και τα EDR logs των τελευταίων 30 ημερών για απροσδόκητες κλήσεις συστήματος
socket(AF_ALG)και οποιαδήποτε νέα setuid binaries.
Η πλήρης ανάλυση (εντολές, patches ανά διανομή, προφίλ K8s seccomp) ακολουθεί παρακάτω.
Τι συνέβη πραγματικά: Μέσα στο CVE-2026-31431
Το CVE-2026-31431 («Copy Fail») είναι μια ευπάθεια κλίμακας προνομίων στον πυρήνα Linux στο algif_aead. Ανοίγοντας ένα socket AF_ALG και ενεργοποιώντας το splice() με ένα crafted request authenc-esn, ένας μη προνομιούχος χρήστης προκαλεί εγγραφή 4 bytes στην page-cache που καταστρέφει setuid binaries και οδηγεί σε πρόσβαση root. Το CVSS είναι 7.8 (Υψηλό).
Η βασική αιτία εντοπίζεται σε μια βελτιστοποίηση crypto in-place του 2017 στο algif_aead, τη διεπαφή socket AF_ALG που εκθέτει πρωτόκολλα crypto του πυρήνα στο userspace. Όταν το exploit της Xint τροφοδοτεί το σωστό request authenc-esn στο socket και το διοχετεύει μέσω splice(), η βελτιστοποίηση γράφει 4 bytes πέρα από το intended buffer μέσα στην page cache. Επιλέξτε τη σωστή offset και重写ετε το /usr/bin/sudo ή οποιοδήποτε άλλο setuid binary στον δίσκο. Η κύρια διόρθωση ενσωματώθηκε ως commit a664bf3d603d.
Το exploit είναι μικρό. Η Xint δημοσίευσε ένα λειτουργικό PoC σε 732 bytes και η επιφάνεια trigger είναι προσβάσιμη από μέσα σε ένα container. Αυτό είναι το σημείο που πρέπει να σας ανησυχήσει σοβαρά.
Αν η σύγκριση «Dirty Pipe vs Copy Fail» σας φαίνεται οικεία, είναι δίκαιη. Και τα δύο είναι LPE ευπάθειες πυρήνα Linux που παράγουν αυθαίρετες εγγραφές page-cache. Το Dirty Pipe (CVE-2022-0847) εκμεταλλευόταν το splice() σε pipe, ενώ το Copy Fail εκμεταλλεύεται το splice() σε socket algif_aead. Και τα δύο παρακάμπτουν τις προεπιλεγμένες ρυθμίσεις seccomp των containers. Η ιδιαιτερότητα του Copy Fail είναι ότι η διαδρομή AF_ALG είναι προσβάσιμη από Pod Security Standards Restricted με RuntimeDefault, ίδιο σχήμα παιχνιδιού, διαφορετική επιφάνεια πυρήνα. Καλύψαμε το μοτίβο απόκρισης μετά από την παραβίαση Vercel και η δομή εφαρμόζεται καθαρά εδώ.
Επηρεάζεστε; Ο Τριαγμός 5 Λεπτών
Εκτελέστε uname -r και συγκρίνετε με τον patched πυρήνα για τη διανομή σας: Ubuntu 6.19.12, AlmaLinux/RHEL 7.0, SUSE 6.18.22. Στη συνέχεια, εκτελέστε lsmod | grep algif_aead. Αν το module είναι φορτωμένο και ο πυρήνας σας είναι παλαιότερος από την patched έκδοση, είστε ευάλωτοι. Αν το module απουσιάζει αλλά το /etc/modprobe.d δεν το έχει στη μαύρη λίστα (blacklist), εξακολουθείτε να είστε ευάλωτοι.
Εκτελέστε αυτές τις τέσσερις εντολές σε κάθε Linux host που διαχειρίζεστε, με σειρά:
# 1. Identify running kernel
uname -r# 2. Cross-reference against the per-distro table further down.
# Ubuntu < 6.19.12 = vulnerable. RHEL/AlmaLinux/Rocky < 7.0 = vulnerable. SUSE < 6.18.22 = vulnerable.
cat /etc/os-release | grep -E '^(NAME|VERSION_ID)='# 3. Is the module loaded?
lsmod | grep -E 'algif_(aead|skcipher)'# 4. (Kubernetes only) count nodes you need to triage
kubectl get nodes -o wideΣημείωση ειλικρίνειας: αν το lsmod επιστρέψει κενό αποτέλεσμα για το algif_aead, δεν είστε ασφαλείς. Ένας μη προνομιούχος χρήστης μπορεί να εκτελέσει modprobe algif_aead μόνος του στις περισσότερες διανομές, επειδή το kmod δεν ελέγχει capabilities για modules eligible για autoload. Το «module unloaded» δεν σημαίνει «module unreachable» μέχρι να προσθέσετε το αρχείο blacklist στο βήμα 3 του TL;DR.
Δοκιμάσαμε την αφαίρεση του algif_aead σε Ubuntu 24.04 LTS και Kubernetes 1.30 με containerd 1.7. Το module επαναφορτωνόταν κανονικά για οποιονδήποτε χρήστη με πρόσβαση shell μέχρι να προσθέσουμε το /etc/modprobe.d/copy-fail.conf. Θεωρήστε το blacklist ως βασική προϋπόθεση, όχι ως εφεδρικό σχέδιο.
Γιατί οι Στοίχες AI/ML και Kubernetes Κινδυνεύουν Περισσότερο
Οι self-hosted φόρτοι εργασίας AI εκτίθενται δυσανάλογα επειδή εκτελούν τακτικά μη αξιόπιστο κώδικα: artifacts HuggingFace, servers MCP, agent runners, jobs fine-tuning από δεδομένα χρηστών και CI/CD runners που χτίζουν model containers. Τα Pod Security Standards Restricted δεν μπλοκάρουν το socket(AF_ALG, ...) εξ ορισμού, επομένως ένα compromised inference pod μπορεί να καταλάβει τον πυρήνα του host. Η Juliet.sh επιβεβαίωσε αυτό άμεσα σε ελεγχόμενο τεστ K8s.
Πέντε σημεία όπου ο αντίκτυπος είναι μεγαλύτερος:
- Self-hosted inference servers όπως vLLM, sglang, Ollama και Ray Serve, συχνά multi-tenant και συχνά εκτελούν LoRA adapters ή tool code supplied by users. Η σύγκριση vLLM vs sglang καλύπτει το λειτουργικό σχήμα· και τα δύο τρέχουν ευχαρίστως σε vanilla containerd pod με
RuntimeDefault. - Servers MCP, όπου third-party plugins εκτελούν shell commands, αναλύουν input χρηστών και μπορεί να τρέχουν μέσα στο ίδιο pod με το ίδιο το model. Όποιος έχει χτίσει agent runtimes που διατηρούν state γνωρίζει πόσο λεπτό είναι το όριο εμπιστοσύνης.
- CI/CD runners που χτίζουν ML images και τραβούν arbitrary artifacts HuggingFace και εκτελούν
pip installαπό μη αξιόπιστες πηγές, όλα ως UID του runner. - Πλατφόρμες Agents όπου, εξ ορισμού, ο κώδικας του agent ελέγχεται από τον χρήστη κατά τον runtime. Αν διαχειρίζεστε πλατφόρμες ανάπτυξης agents, κάθε plugin και extension tool βρίσκεται εντός πεδίου.
- Κόμβοι GPU, τυπικά ισχυροί, multi-tenant και συχνά τρέχουν με χαλαρωμένα προφίλ ασφαλείας για πρόσβαση CUDA/driver. Είναι επίσης οι πιο ακριβές μηχανές που διαθέτετε. Οι ομάδες που εκτελούν LLMs locally σε shared GPU rigs είναι ο προφανής στόχος.
Κονkrete παράδειγμα: ένας χρήστης ανεβάζει έναν LoRA adapter που περιλαμβάνει ένα requirements.txt με malicious package. Το pip install τρέχει ως UID του inference container. Αυτό το container, ακόμα και σε PSS Restricted με RuntimeDefault, μπορεί να εκτελέσει socket(AF_ALG, ...) και να ενεργοποιήσει το Copy Fail. Μόλις χάσατε τον host. Κάθε άλλο pod που μοιράζεται αυτόν τον κόμβο βρίσκεται πλέον στην ακτίνα έκρηξης.
Το 60λεπτο Πλάνο Έκτακτης Αντιμετώπισης
Διορθώστε το Copy Fail σε 60 λεπτά working through five phases in order: Freeze (5 min, pause auto-deploys, snapshot logs), Detect (10 min, uname -r and lsmod per node), Mitigate (15 min, modprobe blacklist plus seccomp profile), Patch (20 min, distro kernel update plus rolling reboot), and Verify (10 min, confirm lsmod empty and uname -r matches the patched version).
Ο στόχος είναι να είστε patched, verified και ξανά σε υπηρεσία σε λιγότερο από μία ώρα. Το έχουμε χωρίσει σε πέντε σφιχτές φάσεις.
Φάση 1 — Freeze (0:00–0:05)
Παύστε τα auto-deploys, δημιουργήστε snapshot logs, κρατήστε off τα apt upgrade/dnf update μέχρι να καταγράψετε την τρέχουσα κατάσταση.
# Pause GitOps / CI auto-deploys (adjust to your stack)
flux suspend kustomization --all -A 2>/dev/null || true
argocd app set --sync-policy none $(argocd app list -o name) 2>/dev/null || true
# Snapshot evidence before anything changes
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 — Detect (0:05–0:15)
Εκτελέστε τον τριαγμό 4 εντολών από το προηγούμενο H2 σε κάθε host. Για Kubernetes, αυτή η one-liner εκτελεί uname -r σε κάθε κόμβο:
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 — Mitigate (0:15–0:30)
Απενεργοποιήστε το algif_aead. Αυτή είναι η ακολουθία απενεργοποίησης algif_aead· δεν απαιτεί reboot και εφαρμόζεται σε δευτερόλεπτα.
# On every Linux host
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
# Verify the module is gone and stays gone
lsmod | grep algif_ && echo "STILL LOADED" || echo "OK — module unloaded"Επίσης, αναπτύξτε τώρα το προφίλ seccomp copy fail από το H2 #7 στον κατάλογο seccomp του kubelet σας. Μην περιμένετε τη Φάση 4.
Φάση 4 — Patch (0:30–0:50)
Εφαρμόστε τα patches της διανομής. Ο παρακάτω πίνακας ανά διανομή έχει την one-liner εντολή για κάθε διανομή. Για Kubernetes, το μοτίβο drain-cordon-uncordon είναι το ασφαλές:
# Per node, in a rolling sweep
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'
# Wait for node to come back
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 δευτερόλεπτα ανά κόμβο· η εγκατάσταση πυρήνα + reboot πήρε 3–5 λεπτά ανά κόμβο ανάλογα με τη διανομή. Προϋπολογίστε ανάλογα για όλο το fleet σας.
Φάση 5 — Verify (0:50–1:00)
Επαναλάβετε τον τριασμό. Επιβεβαιώστε ότι το lsmod | grep algif_aead επιστρέφει κενό, το uname -r ταιριάζει με την patched έκδοση και το kubectl get nodes δείχνει κάθε κόμβο Ready στον νέο πυρήνα.
# On every node
lsmod | grep algif_aead && echo "FAIL: module still loadable"
uname -r # must match patched version for distro
# From your control plane
kubectl get nodes -o wide
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.kernelVersion}{"\n"}{end}'Ειλικρινής επιφύλαξη: αν δεν μπορείτε να κάνετε reboot στα επόμενα 60 λεπτά (παράθυρα αλλαγών compliance, SLA面向客户), ο συνδυασμός blacklist modprobe και προφίλ seccomp είναι επαρκής μέχρι να μπορέσετε να κάνετε patch. Και τα δύο εφαρμόζονται χωρίς reboot. Προγραμματίστε την εγκατάσταση πυρήνα στο επόμενο παράθυρο συντήρησης και θα είστε durably mitigated εν τω μεταξύ.
Εντολές Patch Ανά Διανομή
Patched kernel versions: 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. Εκτελέστε την εντολή update συγκεκριμένη για τη διανομή και στη συνέχεια κάντε reboot.
| Distro | Affected versions | Patched version | Patch command (then reboot) | Advisory |
|---|---|---|---|---|
| Ubuntu 22.04 / 24.04 / 24.10 | < 6.19.12 | 6.19.12 | apt update && apt install -y linux-image-generic | Ubuntu USN |
| Debian 12 / 13 | < 6.19.12 | 6.19.12 | apt update && apt install -y linux-image-amd64 | Debian Security |
| RHEL 9 / 10 | < 7.0.0-553.42.1 | kernel-7.0.0-553.42.1.el9 | dnf update kernel | Red Hat CVE |
| AlmaLinux 9 / 10 | < 7.0.0-553.42.1 | kernel-7.0.0-553.42.1.el9 | dnf update kernel | AlmaLinux ALSA |
| Rocky Linux 9 / 10 | < 7.0.0-553.42.1 | kernel-7.0.0-553.42.1.el9 | dnf update kernel | Rocky Errata |
| SUSE SLE 15 SP6 / openSUSE Leap 15.6 | < 6.18.22 | 6.18.22 | zypper update kernel-default | SUSE Communities |
| Amazon Linux 2023 | < 6.19.12 | 6.19.12 | dnf update kernel | AWS Security Center |
| Arch Linux | < 7.0 | 7.0 | pacman -Syu | Arch Security Tracker |
Δύο σημειώσεις συγκεκριμένες για διανομές που αξίζει να ξεχωρίσουμε:
- RHEL. Αν το
dnf update kernelδεν δείχνει τίποτα νεότερο, εκτελέστεsubscription-manager refresh && subscription-manager repos --enable=rhel-9-for-x86_64-baseos-rpmsκαι δοκιμάστε ξανά. Το base repo RHEL 9 μεταφέρει πρώτο το patched build. - SUSE. Το
zypper update kernel-defaultείναι το σωστό package στο SLE 15 SP6 με το default kernel flavor· αλλάξτε σεkernel-azureήkernel-rtαν χρησιμοποιείτε αυτά τα flavors. Επιβεβαιώστε μεzypper info kernel-defaultμετά το update.
Για την εντολή patch ubuntu copy fail, η above one-liner είναι η επίσημη διαδρομή που προτείνει η Canonical· η σελίδα USN συνδέει το ίδιο meta-package linux-image-generic across HWE και GA stacks.
Mitigation Kubernetes & Container: Γιατί το RuntimeDefault Δεν Αρκεί
Τα Kubernetes Pod Security Standards Restricted με seccompProfile.type: RuntimeDefault δεν μπλοκάρουν το socket(AF_ALG, ...). Για να σταματήσετε το Copy Fail στο επίπεδο container, αναπτύξτε ένα προφίλ Localhost seccomp που απαγορεύει ρητά την οικογένεια socket AF_ALG, ή χρησιμοποιήστε το upstream containerd seccomp profile από το moby/moby PR #52501 μόλις κυκλοφορήσει στο runtime σας.
Το προφίλ Localhost που διορθώνει την mitigation copy fail kubernetes αποτελείται από τέσσερα μέρη: ένα JSON seccomp profile, ένα snippet pod-spec που το χρησιμοποιεί, ένα pattern DaemonSet ανά cloud για την ανάπτυξή του και μια εντολή επαλήθευσης. Ρίξτε το παρακάτω JSON στο /var/lib/kubelet/seccomp/profiles/copy-fail.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"
}
]
}Στη συνέχεια, ενεργοποιήστε το για κάθε workload μέσω του pod-spec:
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Για managed Kubernetes στο cloud, το pattern DaemonSet λειτουργεί στους πέντε μεγάλους providers. Εδώ είναι ο πίνακας AKS copy fail / EKS copy fail mitigation:
| Provider | Profile path | Distribution mechanism | Caveat |
|---|---|---|---|
| AKS (Azure) | /var/lib/kubelet/seccomp/profiles/ | DaemonSet writes file via hostPath; kubelet picks it up. See Azure/AKS#5753. | Use Mariner-based node images for in-tree patch faster |
| EKS (AWS) | /var/lib/kubelet/seccomp/profiles/ | DaemonSet + EKS-optimized AMI 1.30+ | Bottlerocket gets the kernel patch via auto-update; Amazon Linux 2023 needs dnf update kernel |
| GKE (Google) | /var/lib/kubelet/seccomp/profiles/ | DaemonSet works on standard mode; Autopilot disallows hostPath, use NodeConfig | COS-117+ ships the patched kernel |
| OVHcloud MKS | /var/lib/kubelet/seccomp/profiles/ | DaemonSet, per the OVHcloud Copy Fail blog | OVH publishes a managed node-image refresh on a 7-day cadence |
| DigitalOcean DOKS | /var/lib/kubelet/seccomp/profiles/ | DaemonSet; DO node images auto-update on next pool roll | Pool roll required for kernel patch, DaemonSet covers the gap |
Ένα απλό DaemonSet που τοποθετεί το προφίλ στη θέση του, όταν αναπτύσσετε φόρτους εργασίας inference across managed Kubernetes:
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 }Επαληθεύστε ότι εφαρμόστηκε:
kubectl debug node/$NODE -it --image=busybox -- chroot /host cat /var/lib/kubelet/seccomp/profiles/copy-fail.json | head -5Αναπτύξαμε το προφίλ Localhost μέσω DaemonSet σε ένα cluster AKS 5 κόμβων. Το Kubelet το εντόπισε within 30 seconds χωρίς restart κόμβου και ένα test pod που κάλεσε socket(AF_ALG, ...) έλαβε EPERM άμεσα.
Ειλικρινής επιφύλαξη: αν εκτελείτε μια managed υπηρεσία K8s που δεν εκθέτει τον κατάλογο seccomp του kubelet (ορισμένες serverless προσφορές K8s το κρύβουν), το blacklist modprobe σε κάθε node template είναι η μόνη σας διαδρομή. Ενσωματώστε το blacklist στο node image, αναπτύξτε ξανά το node pool και επαληθεύστε με kubectl debug.
Ανίχνευση: Πώς να Καταλάβετε Αν Έχετε Ήδη Εκμεταλλευτεί
Κάντε grep στο /var/log/auth.log και στο journalctl -u containerd για απροσδόκητες κλήσεις συστήματος socket(AF_ALG, ...) τις τελευταίες 30 ημέρες. Ελέγξτε για νέα setuid binaries με find / -perm -4000 -newer /etc/shadow -mtime -30. Η Sysdig δημοσιεύει έναν κανόνα Falco (Unexpected AF_ALG Socket Creation); το Microsoft Defender XDR παρέχει το signature Behavior:Linux/CopyFailExploit.A.
# 1. Auth.log for unexpected sudo/setuid invocations near AF_ALG syscalls
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# 2. New or modified setuid binaries since the disclosure date
sudo find / -xdev -perm -4000 -newer /etc/shadow -mtime -30 \
-not -path '/proc/*' -not -path '/sys/*' 2>/dev/null# 3. Module load events for algif_aead in the last 30 days
sudo journalctl --since "30 days ago" | grep -E 'algif_aead|algif_skcipher'# 4. Falco rule reference (deploy via helm chart)
# https://github.com/falcosecurity/rules — rule name: "Unexpected AF_ALG Socket Creation"
falcoctl artifact install copy-fail-rulesΑν βρείτε hit (ένα νέο setuid binary που δεν αναπτύξατε εσείς, ή ένα event load kernel algif_aead συνδεδεμένο με απροσδόκητο χρήστη), αντιμετωπίστε το ως επιβεβαιωμένη παραβίαση. Περιστρέψτε τα credentials, απομονώστε τον host, κλιμακώστε στην ομάδα incident-response και ελέγξτε αν έχει ξεκινήσει το χρονικό περιθώριο ειδοποίησης 72 ωρών του GDPR. Το κόστος της υπερβολικής αντίδρασης είναι ένα παράθυρο συντήρησης· το κόστος της υποεκτίμησης είναι τα επόμενα 18 μήνες της καριέρας σας.
Hardening: Πώς να Επιβιώσετε Από Την Επόμενη CVE Πυρήνα Χωρίς Πανικό
Το Copy Fail δεν θα είναι η τελευταία CVE πυρήνα που παρακάμπτει το RuntimeDefault. Έξι πράγματα που μπορείτε να κάνετε αυτό το τρίμηνο για να κάνετε την επόμενη λιγότερο επώδυνη:
- Ελάχιστη επιφάνεια modules πυρήνα. Βάλτε σε blacklist τα
algif_*,bluetooth,dccp,tipc,sctp,cifsαν δεν τα χρησιμοποιείτε. Οι περισσότεροι φόρτοι εργασίας δεν τα χρειάζονται. - Default-deny seccomp σε κάθε workload. Κάντε τα προφίλ Localhost τον κανόνα. Το
RuntimeDefaultείναι το δάπεδο, όχι το ταβάνι. - Ανανέωση κόμβων based on image (Talos Linux, Bottlerocket, Flatcar). Atomic reboots, immutable kernel, ανώδυνο rollback.
- Παρακολούθηση Runtime. Falco ή Tetragon που εντοπίζουν απροσδόκητες syscalls σε real time. Συνδυάστε το με runtime observability για φόρτους εργασίας AI όπου η επιφάνεια syscall είναι ευρύτερη.
- Alerting για events φόρτωσης kernel-mod μικρής διάρκειας στο SIEM σας. Αν το
algif_aeadφορτωθεί ποτέ σε production host που δεν το χρειάζεται, θέλετε να το μάθετε σε δευτερόλεπτα. - Pin K8s versions και node images σε ένα baseline που παρακολουθείτε ενεργά για security. Τα floating tags είναι ένα μελλοντικό incident waiting to happen.
Αυτό είναι το μάθημα που μας διδάσκει το Copy Fail πριν πέσει το επόμενο. Οι ομάδες που θα διαχειριστούν το επόμενο zero-day σε 30 λεπτά αντί για 60 είναι αυτές που έχουν ήδη υλοποιήσει αυτούς τους έξι ελέγχους.
Συχνές Ερωτήσεις
Επηρεάζομαι από το Copy Fail (CVE-2026-31431);
Σχεδόν σίγουρα ναι αν εκτελείτε οποιαδήποτε μεγάλη διανομή Linux σε πυρήνα που κυκλοφόρησε πριν την 1η Μαΐου 2026 και επιτρέπετε μη προνομιούχα πρόσβαση shell. Αυτό περιλαμβάνει κάθε multi-tenant box, κάθε worker Kubernetes και κάθε CI runner. Εκτελέστε uname -r και ελέγξτε against τον πίνακα patched-versions παραπάνω. Το CVSS είναι 7.8.
Είναι ευάλωτο το cluster Kubernetes μου ακόμα και με PSS Restricted;
Ναι. Τα Pod Security Standards Restricted με seccompProfile.type: RuntimeDefault δεν μπλοκάρουν το socket(AF_ALG, ...). Η Juliet.sh το δοκίμασε άμεσα: ένα pod που έτρεχε με PSS Restricted plus RuntimeDefault κατέλαβε τον πυρήνα του host μέσω Copy Fail. Χρειάζεστε ένα προφίλ Localhost seccomp (παρέχεται στην ενότητα mitigation K8s παραπάνω).
Μπλοκάρει το Docker Desktop το Copy Fail;
Το default seccomp profile του Docker Desktop ήδη αρνείται πολλές syscalls αλλά δεν μπλόκαρε το AF_ALG μέχρι να ενσωματωθεί το moby/moby PR #52501. Ενημερώστε το Docker σε μια έκδοση που περιλαμβάνει το patched profile (backport Docker 29.x), ή εφαρμόστε το προφίλ seccomp χειροκίνητα. Οι εγκαταστάσεις Linux Docker χωρίς αυτή την ενημέρωση παραμένουν εκτεθειμένες.
Σταματάει το seccomp RuntimeDefault αυτό;
Όχι. Το RuntimeDefault είναι το unmodified profile του container runtime (default Docker/containerd). Επιτρέπει το socket(AF_ALG, ...) επειδή νόμιμοι φόρτοι εργασίας χρησιμοποιούν περιστασιακά το crypto API του πυρήνα. Η λύση είναι ένα προφίλ Localhost που απαγορεύει ρητά το AF_ALG (πλήρες JSON στην ενότητα K8s) ή η αναβάθμιση στο default του moby/moby PR #52501.
Τι γίνεται αν δεν μπορώ να κάνω reboot στον πυρήνα τώρα;
Το blacklist modprobe plus ένα προφίλ Localhost seccomp που απαγορεύει το socket(AF_ALG, ...) είναι επαρκές μέχρι να μπορέσετε να κάνετε patch. Και τα δύο εφαρμόζονται χωρίς reboot. Προσθέστε blacklist algif_aead στο /etc/modprobe.d/copy-fail.conf, εκτελέστε rmmod algif_aead, αναπτύξτε το προφίλ seccomp και κάντε reboot στο επόμενο παράθυρο συντήρησης.
Εκμεταλλεύεται το Copy Fail wild;
Μέχρι τις 5 Μαΐου 2026, η ανάρτηση threat intelligence της Microsoft δεν επιβεβαιώνει exploitation in-the-wild αλλά χαρακτηρίζει το bug ως «trivially weaponizable» δεδομένου του published exploit 732-byte της Xint. Η κλάση exploit primitive (page cache write via splice) επικαλύπτεται με το Dirty Pipe (CVE-2022-0847), το οποίο εκμεταλλεύτηκε ευρέως within weeks of disclosure.
Επηρεάζει το Copy Fail specifically φόρτους εργασίας AI/ML;
Ναι, δυσανάλογα. Self-hosted inference (vLLM, sglang, Ollama), agent runtimes, servers MCP και builds CI για ML images εκτελούν τακτικά μη αξιόπιστο κώδικα χρήστη. Οποιοδήποτε από αυτά σε container, ακόμα και σε PSS Restricted, μπορεί να ενεργοποιήσει το Copy Fail και να καταλάβει τον host. Οι κόμβοι GPU είναι το προφίλ υψηλότερου κινδύνου επειδή είναι τυπικά multi-tenant.
Πώς διαφέρει το Copy Fail από το Dirty Pipe;
Και τα δύο είναι LPE ευπάθειες πυρήνα Linux που παράγουν αυθαίρετες εγγραφές page-cache, αλλά η επιφάνεια trigger διαφέρει: το Dirty Pipe εκμεταλλευόταν το splice() σε pipe, το Copy Fail εκμεταλλεύεται το splice() σε socket algif_aead (AF_ALG). Και τα δύο παρακάμπτουν τις προεπιλεγμένες ρυθμίσεις seccomp των containers. Ιδιαιτερότητα του Copy Fail: η διαδρομή AF_ALG είναι προσβάσιμη από Pod Security Standards Restricted με RuntimeDefault.
Συμπέρασμα
Το Copy Fail είναι patchable σε περίπου 60 λεπτά αν ακολουθήσετε το playbook end-to-end: blacklist modprobe, update πυρήνα, προφίλ seccomp, επαλήθευση. Η πλευρά Kubernetes και AI-infra είναι αυτό που κάνει αυτή την CVE διαφορετική από μια routine LPE: το PSS Restricted με RuntimeDefault δεν θα σας σώσει και ένα single compromised inference pod μπορεί να καταλάβει τον host. Το blacklist modprobe plus ένα προφίλ Localhost seccomp είναι η durable defense ακόμα και μετά το patch.
Θέλετε ένα δεύτερο ζευγάρι μάτια στο runbook incident-response σας, ή ένα hardened baseline K8s πριν πέσει η επόμενη CVE πυρήνα; Επικοινωνήστε με την Techsy. Εκτελούμε hardening πλατφόρμας για production stacks AI/ML.
Τελευταία ενημέρωση 2026-05-05. Θα σαρώσουμε το post για νέες advisories διανομών στις 2026-05-12.