TL;DR

Ngày 29/4/2026, Theori công bố CVE-2026-31431 - đặt tên "Copy Fail" - một lỗ hổng leo thang đặc quyền (LPE) nghiêm trọng trong Linux kernel, tồn tại từ năm 2017 đến nay. Bất kỳ user thường nào trên hệ thống dễ bị tổn thương đều có thể leo lên root trong vài giây, với một script Python vỏn vẹn 732 byte. Không cần race condition, không cần kernel offset, hoạt động đáng tin cậy 100% trên Ubuntu, Amazon Linux, RHEL và SUSE.

Copy Fail CVE-2026-31431 - Linux kernel zero-day announced by Theori

Điều đáng chú ý hơn: lỗ hổng này được phát hiện bởi AI tool Xint Code của Theori - chỉ mất khoảng 1 giờ scan, một lệnh prompt, không cần harnessing thủ công.

Nguồn gốc chín năm ẩn náu

Copy Fail là kết quả hội tụ của ba thay đổi kernel hoàn toàn hợp lý, được thực hiện ở ba thời điểm khác nhau:

  • 2011: Kernel bổ sung authencesn - một AEAD cryptographic wrapper dùng cho IPsec.
  • 2015: AF_ALG AEAD socket support được thêm vào, cho phép userspace gọi trực tiếp các cipher của kernel qua socket.
  • 2017: Commit 72548b093ee3 thêm một "in-place optimization" vào algif_aead.c, cho phép AEAD operations xử lý tại chỗ để tăng tốc. Đây là điểm gây ra lỗ hổng.

Không ai kết nối ba điểm này lại trong suốt chín năm. Lỗ hổng âm thầm tồn tại qua từng bản cập nhật kernel, từ 4.14 đến 7.0-rc.

Kỹ thuật đằng sau

Vấn đề nằm ở cách authencesn xử lý scratch space khi thực hiện Extended Sequence Number rearrangement. Cụ thể, thuật toán ghi 4 byte tại offset assoclen + cryptlen vào destination buffer. Trong kịch bản bình thường thì an toàn - nhưng sau optimization 2017, kernel set req->src = req->dst và chain tag pages từ source scatterlist vào output scatterlist qua sg_chain().

Khi userspace feed file vào socket qua splice(), những tag pages đó chính là các trang trong page cache (vùng RAM kernel dùng để cache file) của file được splice. Kết quả: 4 byte scratch write của authencesn đổ thẳng vào page cache của file đó - bypassing hoàn toàn permission của file.

Tóm lại: exploit chain dùng ba syscall cơ bản (socket, splice, sendmsg) để ghi tùy ý 4 byte vào page cache của bất kỳ file nào user có thể đọc. Không cần privilege. Không cần compiled payload. Một Python script xử lý toàn bộ.

Từ user thường đến root trong vài giây

PoC công khai (732 byte Python) nhắm vào /usr/bin/su - binary setuid mà kernel load từ page cache khi thực thi. Exploit lặp lại primitive ở các offset liên tiếp để stage shellcode nhỏ vào cached pages của binary. Lần tiếp theo bất kỳ ai chạy su, binary đã bị patch trong bộ nhớ sẽ thực thi shellcode và trả về root shell.

Ba yếu tố làm Copy Fail đặc biệt nguy hiểm hơn các LPE tiền nhiệm:

  • Không cần race condition - khác Dirty Cow (CVE-2016-5195), exploit chạy thẳng, không fail, không crash.
  • Không để lại dấu vết trên disk - corruption chỉ tồn tại trong RAM. File trên ổ đĩa vẫn nguyên vẹn, hash vẫn khớp package chính thức. File integrity monitoring hoàn toàn bị bypass.
  • Container escape - page cache được chia sẻ toàn host, xuyên qua container boundaries. Một container bị compromise có thể đầu độc binaries của host và mọi tenant khác.
So sánhDirty CowDirty PipeCopy Fail
Race conditionBắt buộcKhôngKhông
Kernel offsetKhông cần
Exploit sizePhức tạpTrung bình732 byte Python
UniversalKhôngGiới hạnMọi distro từ 2017

Ai đang ở tuyến đầu rủi ro

Theori khuyến nghị ưu tiên patching theo thứ tự:

  1. Kubernetes clusters & multi-tenant container platforms: một pod bị compromise = toàn bộ cluster có thể bị kiểm soát.
  2. CI/CD runners (GitHub Actions self-hosted, GitLab shared runners, Jenkins): một PR độc hại trong fork có thể escalate root ngay trên runner của tổ chức.
  3. AI agent sandboxes: bất kỳ nền tảng nào cho AI execute shell commands trong container thông thường đều không đủ isolation.
  4. Shared servers: dev boxes, build servers, jump hosts.

Những môi trường không bị ảnh hưởng: AWS Lambda/Fargate (Firecracker microVMs - mỗi tenant có kernel riêng), Cloudflare Workers (V8 isolates), gVisor (userspace kernel không share algif_aead của host).

Phòng thủ ngay bây giờ

Bước 1: Patch kernel. Cập nhật lên phiên bản đã fix:

  • 6.18.x: nâng lên 6.18.22
  • 6.12.x: nâng lên 6.12.85
  • 6.6.x: nâng lên 6.6.137
  • 5.15.x: nâng lên 5.15.204
  • 5.10.x: nâng lên 5.10.254

Bước 2: Nếu chưa patch được ngay, disable module algif_aead:

echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead 2>/dev/null || true

Lưu ý: lệnh trên chỉ hoạt động nếu module được load động (CONFIG_CRYPTO_USER_API_AEAD=m). Nếu compiled trực tiếp vào kernel (=y), cần dùng kernel boot parameters.

Bước 3: Detection. Disk-based file integrity monitoring sẽ không phát hiện được khai thác này vì corruption chỉ tồn tại trong RAM. Cần behavioral monitoring - theo dõi unprivileged user thực thi setuid binary bất thường. Sysdig Secure có rule "AF_ALG Page Cache Poisoning"; Falco có open-source rules tương ứng.

Bước 4: Với môi trường chạy untrusted code, block AF_ALG socket creation hoàn toàn qua seccomp profiles hoặc container runtime defaults - ngay cả sau khi patch, để đóng toàn bộ lớp tấn công này.

Timeline & điều gì tiếp theo

  • 2017: Lỗ hổng xuất hiện cùng commit tối ưu hóa performance của algif_aead.c.
  • 23/3/2026: Theori báo cáo cho Linux kernel security team. Phát hiện bởi AI tool Xint Code trong ~1 giờ.
  • 1/4/2026: Patch commit vào mainline (a664bf3d603d), revert optimization 2017.
  • 22/4/2026: CVE-2026-31431 được gán.
  • 29/4/2026: Public disclosure + PoC được publish.

Điểm quan trọng hơn cả bản vá: Theori xác nhận cùng nghiên cứu AI đã phát hiện thêm nhiều lỗ hổng kernel khác, ít nhất một lỗ hổng cũng là privilege escalation - đang trong quá trình coordinated disclosure.

Copy Fail là dấu hiệu rõ ràng rằng chi phí tìm ra kernel-grade logic bug đã giảm mạnh. Nếu threat model của bạn vẫn xem kernel LPE là hiếm gặp, đã đến lúc cập nhật lại giả định đó.

Nguồn: Help Net Security, The Register, Tenable, Sysdig.