Lỗ hổng "Copy Fail": Chỉ 732 Byte để leo thang đặc quyền Root trên mọi bản phân phối Linux lớn
Lỗ hổng logic mới trong kernel Linux, được đặt tên là "Copy Fail" (CVE-2026-31431), cho phép người dùng không có đặc quyền ghi dữ liệu vào bộ nhớ đệm trang của hệ thống. Chỉ với một đoạn mã khai thác Python dài 732 byte, kẻ tấn công có thể leo thang lên quyền root trên hầu hết các bản phân phối Linux lớn như Ubuntu, RHEL và Amazon Linux, thậm chí vượt qua ranh giới bảo mật của container.

Lỗ hổng "Copy Fail": Chỉ 732 Byte để leo thang đặc quyền Root trên mọi bản phân phối Linux lớn
Nhóm nghiên cứu Xint Code vừa công bố một lỗ hổng bảo mật nghiêm trọng trong nhân Linux, được đặt tên là Copy Fail (CVE-2026-31431). Đây là một lỗi logic trong mẫu mã hóa authencesn, cho phép người dùng cục bộ không có đặc quyền thực hiện một thao tác ghi có kiểm soát vào bộ nhớ đệm trang (page cache) của bất kỳ tệp nào trên hệ thống.
Điều đáng báo động là một đoạn mã khai thác (exploit) bằng Python chỉ dài 732 byte có thể sửa đổi các tệp nhị phân setuid để lấy quyền root trên hầu hết các bản phân phối Linux chính hiện nay, bao gồm Ubuntu, Amazon Linux, RHEL và SUSE.
Minh họa lỗ hổng bảo mật Linux
Điểm khác biệt của Copy Fail
Linux từng phải đối mặt với các lỗ hổng leo thang đặc quyền nổi tiếng như Dirty Cow hay Dirty Pipe. Tuy nhiên, Copy Fail khác biệt ở several điểm quan trọng:
- Tính xác định: Không giống như Dirty Cow phụ thuộc vào điều kiện tranh chấp (race condition) hay Dirty Pipe yêu cầu thao tác chính xác trên bộ đệm ống (pipe buffer), Copy Fail là một lỗi logic đường thẳng. Nó kích hoạt mà không cần canh thời gian hay thử lại nhiều lần.
- Tính di động: Cùng một đoạn mã khai thác hoạt động trên mọi bản phân phối và kiến trúc đã được thử nghiệm mà không cần biên dịch lại hay tính toán bù trừ (offset) cho từng phiên bản.
- Kích thước nhỏ gọn: Toàn bộ mã khai thác chỉ là một script Python ngắn sử dụng thư viện chuẩn, không cần payload biên dịch hay cài đặt thư viện phụ thuộc.
- Tính lẩn lút: Thao tác ghi này bỏ qua đường dẫn ghi VFS thông thường. Nhân không đánh dấu trang bị hỏng là "dirty" để ghi lại đĩa, do đó tệp trên đĩa cứng vẫn nguyên vẹn. Các công cụ kiểm tra toàn toàn tệp dựa trên checksum trên đĩa sẽ không phát hiện ra sự thay đổi này, dù phiên bản trong bộ nhớ đã bị chỉnh sửa.
- Ảnh hưởng xuyên Container: Vì bộ nhớ đệm trang được chia sẻ trên toàn hệ thống, lỗ hổng này không chỉ là leo thang đặc quyền cục bộ mà còn là một vector để thoát khỏi container và xâm nhập vào node Kubernetes.
Nguyên nhân gốc rễ: Scatterlist có thể ghi và Page Cache
Vấn đề bắt nguồn từ sự kết hợp giữa AF_ALG (một loại socket tiếp xúc với hệ thống mã hóa của nhân cho người dùng không có đặc quyền) và hàm splice().
Khi người dùng sử dụng splice() để chuyển dữ liệu từ tệp vào socket AF_ALG, các trang bộ nhớ đệm của tệp đó được đưa vào scatterlist đầu vào bằng tham chiếu. Trong quá trình giải mã AEAD, mã nguồn trong algif_aead.c thiết lập hoạt động tại chỗ (in-place), nghĩa là scatterlist đầu vào và đầu ra là nhau.
Mặc dù dữ liệu AAD và ciphertext được sao chép sang bộ đệm đầu ra, nhưng thẻ xác thực (authentication tag) lại được nối (chain) trực tiếp từ scatterlist đầu vào. Điều này khiến các trang bộ nhớ đệm trang của tệp gốc nằm trong scatterlist đầu ra có thể ghi.
Kích hoạt: Ghi tạm thời của authencesn
Mẫu mã hóa authencesn, được sử dụng bởi IPsec để hỗ trợ Extended Sequence Number (ESN), là thủ phạm gây ra lỗi ghi này. Để tính toán HMAC, authencesn cần sắp xếp lại các byte ESN.
Nó thực hiện việc này bằng cách sử dụng bộ đệm đích của người gọi làm vùng nhớ tạm (scratch space). Cụ thể, hàm crypto_authenc_esn_decrypt() thực hiện một thao tác ghi 4 byte tại vị trí assoclen + cryptlen — vị trí nằm ngay sau thẻ xác thực.
Trong các thuật toán AEAD tiêu chuẩn khác, vùng ghi bị giới hạn trong vùng đích hợp lệ. Tuy nhiên, authencesn lại ghi vượt quá giới hạn này. Trong đường dẫn AF_ALG in-place, thao tác ghi này vượt qua bộ đệm người dùng và ghi trực tiếp 4 byte vào các trang bộ nhớ đệm trang được nối từ tệp đích.
Kẻ tấn công có thể kiểm soát hoàn toàn 3 yếu tố: tệp nào bị ghi (bất kỳ tệp nào có thể đọc), vị trí offset nào bị ghi, và giá trị 4 byte nào được ghi.
Quy trình khai thác lỗ hổng
Cách khai thác
Mã khai thác mặc định nhắm vào /usr/bin/su, một tệp nhị phân setuid-root có mặt trên hầu hết các bản phân phối Linux.
Quy trình khai thác diễn ra như sau:
- Thiết lập socket
AF_ALGvà liên kết vớiauthencesn(hmac(sha256),cbc(aes)). - Xây dựng dữ liệu ghi: Sử dụng
sendmsg()để cung cấp AAD (chứa 4 byte cần ghi) vàsplice()để đưa các trang bộ nhớ đệm của tệp đích vào làm ciphertext và tag. - Kích hoạt ghi: Hàm
recv()kích hoạt giải mã. Bên trongauthencesn, 4 byte được ghi vào bộ nhớ đệm trang của/usr/bin/su. - Thực thi: Gọi
execve("/usr/bin/su"). Nhân tải tệp nhị phân từ bộ nhớ đệm trang (đã bị chỉnh sửa) thay vì đĩa cứng. Vìsulàsetuid-root, shellcode được chèn sẽ chạy với quyền UID 0 (Root).
Bản vá và Khắc phục
Bản vá (commit a664bf3d603d) đã giải quyết vấn đề bằng cách hoàn tác hoạt động in-place trong algif_aead.c, tách biệt scatterlist nguồn (src) và đích (dst). Điều này loại bỏ cơ chế sg_chain đưa các trang bộ nhớ đệm vào scatterlist đích có thể ghi.
Để bảo vệ hệ thống trước khi áp dụng bản vá, quản trị viên có thể chặn việc tạo socket AF_ALG thông qua seccomp hoặc chặn module algif_aead:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
Lỗ hổng này là một ví dụ điển hình về cách các tối ưu hóa hiệu suất trong quá khứ (từ năm 2017) có thể tạo ra các lỗ hổng bảo mật tinh vi khi kết hợp với các mã nguồn cũ khác. Việc phát hiện ra lỗi này cũng có sự hỗ trợ của công cụ AI Xint Code, cho thấy vai trò ngày càng lớn của trí tuệ nhân tạo trong nghiên cứu bảo mật.
Bài viết liên quan
Công nghệ
Tại sao các lập trình viên Functional nên dành một cái nhìn cho Zig
30 tháng 4, 2026

Công nghệ
Nghiên cứu: Finetuning kích hoạt khả năng "nhớ lại" nguyên văn sách có bản quyền trong LLM
30 tháng 4, 2026

Công nghệ
Taxi bay điện của Joby thực hiện chuyến bay lịch sử từ JFK, mở ra tương lai giao thông tại New York
30 tháng 4, 2026
