Giải Mã PHP2Shell: CVE-2026-109618, Bản Vá Khẩn Cấp Và Câu Hỏi Mở 14 Năm
Lỗ hổng nghiêm trọng CVSS 9.2 trên nhân PHP cho phép thực thi mã từ xa không cần xác thực. Cơ chế lỗi bộ nhớ, danh sách phiên bản cần cập nhật và nghi vấn khai thác ngầm nhiều năm.
Đội ngũ phát triển PHP phát hành các bản vá khẩn cấp ngày 21/10/2026 để xử lý hai lỗ hổng thực thi mã từ xa (RCE) đặc biệt nghiêm trọng trong nhân PHP (core engine). Được định danh là CVE-2026-109618 và CVE-2026-109619, hay còn gọi là PHP2Shell, lỗ hổng cho phép kẻ tấn công thực thi lệnh tùy ý trên máy chủ web mà không cần đăng nhập hay xác thực trước. Lỗ hổng được chấm 9.2 điểm trên thang đo chuẩn CVSS v4.0.
Việc rò rỉ chi tiết khai thác vào ngày 20/10 đã buộc nhóm bảo mật PHP và các hãng bảo mật phải đẩy nhanh lịch công bố, dời từ ngày 22/10 lên 21/10. Calif và Wiz độc lập phát hiện các lỗ hổng từ tháng 8/2026 (Calif vào ngày 1/8, Wiz báo cáo vào ngày 24/8); watchTowr đã tái lập thành công exploit và công bố chi tiết vào ngày 20/10. Chương trình "Patch the Planet" của OpenAI cũng tham gia đóng góp cho nghiên cứu này. Do lỗi nằm ở tầng C trong nhân PHP chứ không phải một plugin CMS hay framework riêng lẻ, hàng triệu hệ thống WordPress, Laravel, Drupal và Magento đối mặt nguy cơ bị chiếm quyền điều khiển nếu chưa được nâng cấp runtime.
Sự cố này làm dấy lên nghi vấn lớn về lịch sử vận hành: đoạn mã chứa lỗi xuất hiện từ phiên bản PHP 5.4.0 phát hành vào tháng 3/2012. Suốt 14 năm qua, các hệ thống chạy PHP toàn cầu luôn chứa sẵn một cửa ngõ thực thi mã độc trong bộ nhớ mà gần như không để lại dấu vết trong log ứng dụng thông thường.
Cơ Chế Khai Thác CVE-2026-109618 Và CVE-2026-109619
PHP2Shell kết hợp hai lỗi quản lý bộ nhớ để tạo thành chuỗi khai thác ổn định mà không cần quyền quản trị.
Request Multipart Đi Vào
│
▼
Bộ Phân Tích MIME Cấp Phát Bộ Nhớ Heap
│
▼
Kích Hoạt Ngưỡng Cạn Bộ Nhớ (OOM)
│
▼
Lệnh longjmp() Trong C Ngắt Stack Đột Ngột
(Bỏ qua toàn bộ hàm dọn dẹp bộ nhớ và giải phóng con trỏ)
│
▼
Biến Toàn Cục Vẫn Giữ Địa Chỉ Vùng Nhớ Đã Giải Phóng (CVE-2026-109619)
│
▼
HashTable Và Session Cũ Bị Dùng Nhầm Là Dữ Liệu Hợp Lệ -> Ghi Đè Bộ Nhớ -> RCELỗ hổng chính CVE-2026-109618 là lỗi hỏng bộ nhớ do cạn RAM (OOM) trong giai đoạn khởi tạo request. Một lỗi nghiêm trọng (fatal error) ngắt ngang quá trình khởi tạo cấu trúc HashTable trước khi chuỗi dọn dẹp kịp chạy, để lại bảng HashTable dang dở mà tiến trình shutdown sau đó vẫn coi là hợp lệ và tiếp tục xử lý. Bộ phân tích multipart chỉ đóng vai trò là con đường đưa payload vào (delivery vector) chứ không phải vị trí gốc của lỗi. Khi nhận dữ liệu multipart, PHP cấp phát bộ nhớ heap để đệm tiêu đề và dữ liệu payload. Nếu request cố tình đẩy mức tiêu thụ bộ nhớ vượt ngưỡng memory_limit, PHP kích hoạt trình xử lý lỗi nghiêm trọng.
Để ngắt tiến trình trong C, PHP gọi hàm longjmp(). Cú nhảy này bỏ qua toàn bộ chuỗi dọn dẹp bộ nhớ, reset con trỏ và đưa engine về trạng thái an toàn. Trong các luồng khởi tạo request (gồm multipart và URL-encoded POST), việc ngắt đột ngột khiến các vùng nhớ heap vừa cấp phát bị kẹt lại ở trạng thái chưa khởi tạo hoàn chỉnh hoặc sai lệch liên kết. Ngoài ra, lỗi này còn có thể làm lộ bộ nhớ tiến trình (như mật khẩu, session token hoặc TLS private key) qua cookie PHPSESSID trả về client.
CVE-2026-109619 là nửa còn lại của chuỗi khai thác. Một số biến toàn cục trong PHP core lưu tạm tham chiếu tới vùng nhớ cấp phát trong lúc phân tích request. Khi longjmp() hủy request, các biến toàn cục này không được reset về NULL mà vẫn lưu địa chỉ vùng nhớ vừa bị giải phóng (lỗi Use-After-Free). Sau khi ứng dụng decode sau startup (như gọi session_start() hoặc unserialize()), request multipart thứ hai có cấu trúc phù hợp sẽ tái sử dụng vùng nhớ cũ này để điều khiển cấu trúc dữ liệu nội bộ, chuyển hướng luồng thực thi sang thực thi mã tùy ý.
Câu Hỏi 14 Năm Và Nguy Cơ Bị Khai Thác Âm Thầm
Calif xác định đường dẫn mã nguồn bị ảnh hưởng sớm nhất xuất hiện từ phiên bản PHP 5.4.0 phát hành vào tháng 3/2012. Vấn đề quản lý bộ nhớ liên quan từng được ghi nhận trên hệ thống theo dõi lỗi của PHP (#78876) vào năm 2020 và trong đợt đánh giá bảo mật năm 2024, nhưng các maintainer khi đó chưa thống nhất được phương án vá an toàn.
PHP hiện chiếm khoảng 69% thị phần trong số các website xác định được ngôn ngữ phía server (theo W3Techs, tháng 10/2026). Suốt 14 năm qua, các bản phân phối Linux phổ biến, hosting control panel và base image container đều mang theo đoạn mã này. Trên Apache mod_php, chỉ một request multipart POST được tạo thủ công là đủ để kích hoạt nhánh mã lỗi trước khi code ứng dụng kịp chạy. Với PHP-FPM, việc khai thác đòi hỏi ứng dụng phải thực hiện thao tác decode sau startup (như gọi session_start() hoặc unserialize()) rồi mới gửi tiếp request multipart thứ hai, bởi FPM sẽ tự động hủy worker nếu quá trình startup thất bại.
PHP2Shell có đặc tính khiến việc phát hiện trong quá khứ rất khó khăn:
- Không ghi file mã độc ra đĩa: Khác với webshell thông thường phải ghi file
.phpvào thư mục uploads hay/tmp, PHP2Shell chạy trực tiếp trong RAM của tiến trình. - Dấu vết dễ bị nhầm với lỗi vận hành thông thường: Lượt khai thác thử nghiệm hoặc thất bại chỉ tạo ra lỗi cạn bộ nhớ (OOM) hoặc segmentation fault, thường bị xem là hiện tượng thiếu RAM hoặc bug ứng dụng thông thường.
- Worker tự khởi động lại âm thầm: Với PHP-FPM, worker bị crash sẽ được master tạo mới trong vài mili-giây. Nginx hoặc Apache chỉ ghi nhận mã 502 Bad Gateway thoáng qua mà không có cảnh báo xâm nhập nào xuất hiện.
Đội ngũ Amazon Threat Intelligence ghi nhận nỗ lực khai thác từ ngày 17/10/2026, bốn ngày trước thời điểm công bố, và Cloudflare cũng phát hiện các cuộc tấn công sớm vào 07:43 UTC ngày 21/10 trước khi bản vá chính thức xuất hiện. Dù việc các nhóm tấn công dai dẳng (APT) có từng vũ khí hóa lỗ hổng này từ nhiều năm trước hay không vẫn chưa có bằng chứng xác thực, thời gian tồn tại 14 năm cùng cơ chế lỗi âm thầm khiến đây là một nguy cơ hoàn toàn có cơ sở.
Danh Sách Bản Vá Và Hướng Dẫn Cập Nhật
Quản trị viên bắt buộc phải cập nhật gói PHP trên hệ điều hành hoặc rebuild base image. Cập nhật qua Composer không có tác dụng vì lỗi nằm ở tầng mã C của trình thông dịch.
Tổ chức PHP đã phát hành bản vá ngày 21/10/2026 cho các nhánh đang hỗ trợ:
| Nhánh PHP | Phiên Bản Đã Vá | Trạng Thái Hỗ Trợ |
|---|---|---|
| PHP 8.5 | 8.5.12 |
Hỗ trợ đầy đủ |
| PHP 8.4 | 8.4.27 |
Hỗ trợ đầy đủ |
| PHP 8.3 | 8.3.36 |
Hỗ trợ đầy đủ |
| PHP 8.2 | 8.2.35 |
Chỉ vá bảo mật |
| PHP 7.4 - 8.1 | Chỉ có bản vá mã nguồn (không có binary chính thức) | Hết hạn hỗ trợ |
| PHP 5.4 - 7.3 | Không có bản vá | Hết hạn hỗ trợ |
Hệ thống chạy PHP hết hạn hỗ trợ không nhận được binary tự động từ upstream, bắt buộc dùng gói backport từ OS (Ubuntu ESM, RHEL, Debian LTS) hoặc nâng cấp lên phiên bản mới.
Biện Pháp Giảm Thiểu Tạm Thời Và Khuyến Cáo Từ AWS
Nhiều đơn vị đã đưa ra khuyến nghị tạm thời trong khi chờ nâng cấp runtime. Bản tin bảo mật AWS 2026-143-AWS xác nhận rằng dù hạ tầng dịch vụ của AWS an toàn, ứng dụng PHP của khách hàng trên Elastic Beanstalk, Amazon Linux, Lightsail và WorkMail đều cần cập nhật. AWS đã phát hành nền tảng Elastic Beanstalk v4.13.12 vào ngày 21/10, kèm kế hoạch cập nhật bản vá upstream vào ngày 22/10, đồng thời hướng dẫn thiết lập luật AWS WAF để phòng thủ ảo (virtual patching):
- Lọc kích thước request body: Kích hoạt luật
SizeRestrictions_BODYtrong bộ AWS WAF Core Rule Set (CRS) nhằm chặn payload lớn cố tình gây cạn bộ nhớ heap. - Kiểm tra tiến trình upload session: Cấu hình WebACL tùy chỉnh từ chối các request POST chứa
PHP_SESSION_UPLOAD_PROGRESStrong body kèm theoPHPSESSIDở cookie hoặc body.
watchTowr và AWS đều lưu ý rằng WAF hay tắt upload progress trong php.ini chỉ là giải pháp tình thế, không chặn được các biến thể multipart khác. Nâng cấp trực tiếp binary PHP và rebuild container image là cách duy nhất để xử lý triệt để.
Kiến Trúc Phòng Thủ Vượt Ra Ngoài Phạm Vi Runtime
Lỗ hổng 14 năm trong engine web phổ biến nhất cho thấy bài học cốt lõi: không bao giờ tin tưởng tuyệt đối vào độ an toàn của runtime.
Khi một tiến trình bị chiếm quyền qua lỗi bộ nhớ, lá chắn quyết định là ranh giới cô lập bên ngoài. Các hệ thống áp dụng cơ chế cô lập môi trường thực thi luôn cô lập worker trong container tối giản, bật file system chỉ đọc (read-only root), loại bỏ các Linux capability không cần thiết và kiểm soát chặt đường mạng ra ngoài qua egress proxy. Nhờ đó, dù kẻ tấn công mở được shell trong PHP-FPM, chúng không thể leo thang tấn công sang các máy chủ khác hay truy cập metadata cloud.
Cùng với đó, việc thiết lập hệ thống quy chuẩn kiểm thử tự động quét lỗ hổng image và phân tầng rủi ro trên toàn bộ chuỗi phân phối phần mềm là yêu cầu tiên quyết cho mọi hạ tầng sản xuất.
Tài Liệu Tham Khảo
- watchTowr Intelligence: PHP CVE-2026-109618 FAQ
- Calif Research: php2shell technical writeup
- Wiz: PHP2Shell: AI uncovers critical RCE
- W3Techs: PHP usage statistics
- Bản Tin Bảo Mật AWS 2026-143-AWS: PHP Web Runtimes
- AWS: Amazon Threat Intelligence identifies PHP2Shell exploitation in MadPot
- PHP Group Security Advisory: Releases 8.5.12, 8.4.27, 8.3.36, 8.2.35
- NIST National Vulnerability Database: Phân Tích CVE-2026-109618