Hai lỗ hổng thực thi mã từ xa (RCE) nghiêm trọng ảnh hưởng trực tiếp đến môi trường chạy PHP cốt lõi vừa được công bố với mã định danh CVE-2026-109618 và CVE-2026-109619. Hai lỗ hổng này là thành phần RCE thuộc nhóm lỗ hổng rộng hơn trong lõi PHP được công ty nghiên cứu bảo mật đám mây Wiz đặt tên là PHP2Shell. Theo Wiz, PHP2Shell bao gồm nhiều lỗ hổng nghiêm trọng—từ làm lộ bộ nhớ kiểu Heartbleed đến RCE không cần xác thực—ảnh hưởng đến mọi phiên bản PHP phát hành trong suốt một thập kỷ qua kể từ PHP 5.4, đe doạ các máy chủ vận hành 70% số website toàn cầu. Quản trị viên hệ thống cần rà soát và nâng cấp các tiến trình xử lý web ngay lập tức, trong khi người dùng Internet thông thường cần thực hiện các biện pháp phòng ngừa khi tương tác với các dịch vụ trực tuyến.

Bài phân tích này đi sâu vào nguyên nhân kỹ thuật của hai lỗi hỏng bộ nhớ, cung cấp bảng đối chiếu các nhánh phiên bản PHP chính thức, hướng dẫn các bước bảo vệ thiết thực cho người dùng phổ thông và tóm tắt quy trình khắc phục sự cố dành cho quản trị viên máy chủ.

Diễn biến sự việc: Cặp lỗ hổng php2shell

Theo cảnh báo bảo mật được Cơ sở dữ liệu Lỗ hổng Quốc gia (NVD) công bố ngày 21/10/2026, hai lỗ hổng nghiêm trọng nằm bên trong bộ cấp phát bộ nhớ và vòng đời xử lý yêu cầu của Zend Engine, thành phần cốt lõi vận hành PHP.

Khi một lỗi nghiêm trọng hoặc tình trạng cạn kiệt bộ nhớ (OOM) xảy ra trong quá trình xử lý yêu cầu web, PHP sử dụng cấu trúc longjmp để lập tức dừng ngữ cảnh hiện tại và tháo gỡ ngăn xếp thực thi. Trên các phiên bản chưa được vá, quá trình hủy đột ngột này phá vỡ các cấu trúc quản lý bộ nhớ nội bộ, dẫn đến hai kịch bản nguy hiểm:

  1. Tái sử dụng bộ nhớ chưa khởi tạo (CVE-2026-109618): Khi việc cấp phát bộ nhớ thất bại giữa chừng, các vùng nhớ dành cho biến yêu cầu bị bỏ lại ở trạng thái chưa khởi tạo. Quy trình dọn dẹp sau đó của tiến trình worker tiếp tục đọc hoặc phân nhánh dựa trên vùng nhớ này, gây hỏng heap và tạo điều kiện thực thi mã từ xa.
  2. Tham chiếu trạng thái toàn cục đã cũ (CVE-2026-109619): Các con trỏ trạng thái toàn cục nội bộ tạm thời trỏ vào cấu trúc heap của yêu cầu không được làm mới hoàn toàn sau khi hủy bất thường. Khi cùng một worker tiếp nhận yêu cầu tiếp theo, nó tương tác với các địa chỉ bộ nhớ cũ đã bị giải phóng, cho phép kẻ tấn công kiểm soát luồng điều khiển của ứng dụng.

Vì các tiến trình PHP chạy liên tục (như PHP-FPM hoặc container ứng dụng) xử lý hàng trăm yêu cầu liên tiếp trước khi khởi động lại, kẻ tấn công từ xa có thể gửi chuỗi yêu cầu HTTP được thiết kế đặc biệt để gây cạn bộ nhớ và chiếm quyền thực thi câu lệnh trên hệ điều hành mà không cần thông tin đăng nhập.

Các phiên bản PHP bị ảnh hưởng và bản vá chính thức

Đội ngũ phát triển PHP đã phát hành các bản vá lỗi chính thức cho tất cả các nhánh còn được duy trì vào ngày 22/10/2026. Mọi tổ chức đang vận hành dịch vụ web cần kiểm tra hệ thống theo bảng đối chiếu phiên bản chính thức dưới đây:

Nhánh Phiên bản dính lỗi Bản vá chính thức Trạng thái hỗ trợ
PHP 8.5 8.5.0 đến 8.5.11 8.5.12 Hỗ trợ tích cực (Active support)
PHP 8.4 8.4.0 đến 8.4.26 8.4.27 Hỗ trợ tích cực (Active support)
PHP 8.3 8.3.0 đến 8.3.35 8.3.36 Chỉ vá bảo mật (Security fixes only)
PHP 8.2 8.2.0 đến 8.2.34 8.2.35 Chỉ vá bảo mật (kết thúc 31/12/2026)
PHP 8.1 trở về trước Toàn bộ phiên bản Không có Hết vòng đời (End of Life - cần nâng cấp)

Theo tài liệu Phiên bản Hỗ trợ chính thức của PHP, các nhánh thuộc diện Hỗ trợ tích cực (PHP 8.4 và PHP 8.5) được cung cấp cả các bản sửa lỗi định kỳ lẫn bản vá bảo mật. Các nhánh thuộc diện Chỉ vá bảo mật (PHP 8.2 và PHP 8.3) chỉ nhận các bản sửa lỗi bảo mật khẩn cấp; đáng chú ý, PHP 8.2 sẽ chính thức kết thúc vòng đời hoàn toàn vào ngày 31/12/2026.

Mọi hệ thống vẫn chạy PHP 8.1 hoặc cũ hơn sẽ vĩnh viễn tồn tại lỗ hổng vì các nhánh đã hết hạn không còn nhận được các bản vá từ cộng đồng phát triển. Các tổ chức cần lập kế hoạch nâng cấp ngay sang các phiên bản được hỗ trợ.

Điều này có ý nghĩa gì đối với bạn

Theo công bố của Wiz, PHP hiện vận hành khoảng 70% tổng số website trên thế giới, bao gồm các hệ quản trị nội dung phổ biến, trang thương mại điện tử và cổng thanh toán. Ngay cả khi bạn không trực tiếp quản trị máy chủ, các dịch vụ trực tuyến bạn dùng hằng ngày vẫn có thể phụ thuộc vào nền tảng này.

Dù người dùng phổ thông không thể tự vá máy chủ từ xa, bạn nên thực hiện các biện pháp an toàn sau:

  • Lưu ý các thông báo an toàn từ nhà cung cấp dịch vụ: Nếu một nền tảng mua sắm, mạng xã hội hoặc dịch vụ bạn sử dụng thông báo về sự cố an ninh hoặc lộ lọt dữ liệu, hãy đổi mật khẩu tài khoản trên dịch vụ đó ngay lập tức.
  • Không bao giờ dùng chung một mật khẩu: Dùng một mật khẩu cho nhiều trang web là rủi ro bảo mật rất lớn. Khi máy chủ của một trang web bị kẻ xấu chiếm quyền và trích xuất dữ liệu, chúng sẽ thử mật khẩu thu được trên hàng loạt dịch vụ ngân hàng, email cá nhân. Hãy dùng mật khẩu riêng biệt, phức tạp cho từng tài khoản.
  • Bật xác thực hai yếu tố (2FA): Kích hoạt xác thực 2 bước cho mọi tài khoản có hỗ trợ tính năng này, ưu tiên ứng dụng tạo mã xác thực hoặc khóa bảo mật vật lý thay vì nhận mã qua tin nhắn SMS. Xác thực 2 bước giúp ngăn chặn việc chiếm quyền tài khoản ngay cả khi mật khẩu bị lộ.
  • Cảnh giác trước các yêu cầu cập nhật trình duyệt lạ: Kẻ tấn công khi kiểm soát máy chủ web có thể chèn mã độc vào giao diện trang để hiển thị thông báo giả mạo, dụ dỗ bạn tải tệp cập nhật trình duyệt hoặc phần mềm xem phim. Tuyệt đối không cài đặt tiện ích hay phần mềm từ các thông báo bật lên trên web; chỉ cập nhật ứng dụng từ phần cài đặt chính thức của trình duyệt hoặc cửa hàng ứng dụng của hệ điều hành.
  • Bảo vệ đường truyền mạng: Khi dùng Wi-Fi công cộng, VPN mã hoá lưu lượng giữa thiết bị và máy chủ VPN để người khác trong cùng mạng không đọc được. Tải VPNRice.

Hướng dẫn xử lý dành cho quản trị viên máy chủ

Nếu bạn đang quản lý hạ tầng máy chủ web hoặc cụm máy chủ nội bộ, hãy áp dụng ngay các bước xử lý sau:

1. Nâng cấp gói phần mềm và đối chiếu bản tin bảo mật distro

Nếu máy chủ sử dụng kho gói chính thức của các bản phân phối Linux (như Debian hoặc Ubuntu), các nhà duy trì hệ điều hành vá lỗi bằng phương pháp backport vào gói ổn định hiện tại mà không đổi số phiên bản gốc (ví dụ phiên bản PHP cơ sở vẫn có thể hiển thị dạng 8.2.26 hay 8.4.15 dù đã được vá).

Trước tiên, cập nhật danh sách gói và tiến hành nâng cấp gói PHP đang hoạt động (các tên gói dưới đây mang tính minh họa, cần điều chỉnh theo phiên bản PHP thực tế trên kho của bạn):

sudo apt-get update
sudo apt-get --only-upgrade install php8.4-fpm php8.4-cli php8.4-common

Sau đó, kiểm tra nhật ký thay đổi của gói hoặc đối chiếu số hiệu bản phát hành gói đã cài đặt với bản tin bảo mật chính thức của bản phân phối (chẳng hạn như Debian Security Advisory - DSA hoặc Ubuntu Security Notice - USN):

apt-cache policy php8.4-fpm

Xem nhật ký gói để xác nhận các bản vá CVE đã được tích hợp:

apt-get changelog php8.4-fpm | head -n 20

Chỉ khi bạn biên dịch trực tiếp từ mã nguồn gốc php.net, sử dụng kho PPA của Ondřej Surý hoặc chạy ảnh container Docker chính thức thì lệnh php -v mới hiển thị trực tiếp các số phiên bản 8.2.35, 8.3.36, 8.4.27 hoặc 8.5.12.

2. Dựng lại ảnh container

Nâng cấp hệ điều hành máy chủ không thay đổi các ảnh container đã đóng gói. Nếu chạy ứng dụng trên Docker hoặc Kubernetes, hãy cập nhật Dockerfile trỏ về phiên bản mới:

FROM php:8.4.27-fpm-alpine

Dựng lại ảnh với tham số --no-cache để loại bỏ hoàn toàn các lớp đệm cũ có lỗ hổng:

docker build --no-cache -t web-app:latest .

3. Thiết lập lớp phòng ngự biên

Trong khi chờ rà soát và cập nhật toàn bộ máy chủ ứng dụng, hãy cấu hình tường lửa ứng dụng web hoặc proxy ngược để kiểm tra các yêu cầu HTTP gửi đến. Giới hạn độ dài tiêu đề yêu cầu, kiểm soát tần suất gửi tệp multipart và ngắt kết nối các yêu cầu dị thường trước khi chuyển tiếp vào tiến trình PHP phía sau.

Việc cập nhật phần mềm kịp thời kết hợp các biện pháp phòng vệ cẩn trọng sẽ giúp dữ liệu của bạn luôn an toàn trước các lỗ hổng web nghiêm trọng.