Trong lĩnh vực an toàn thông tin, không có bất kỳ một giải pháp đơn lẻ nào có thể đảm bảo an toàn tuyệt đối một trăm phần trăm cho một hệ thống đang vận hành, đặc biệt là đối với các cỗ máy chủ chạy phiên bản ngôn ngữ kế thừa. Sự xuất hiện của hai lỗ hổng nghiêm trọng mang mã định danh CVE-2026-109618 và CVE-2026-109619 một lần nữa gióng lên hồi chuông cảnh báo về nguy cơ thực thi mã từ xa trước xác thực đối với các dịch vụ web sử dụng ngôn ngữ PHP.
Đối với nhiều doanh nghiệp và cơ quan, việc nâng cấp toàn bộ mã nguồn lên phiên bản mới ngay lập tức thường gặp vô vàn rào cản về tính tương thích và chi phí vận hành. Từ kinh nghiệm thực tế của phantam.top trong việc quản trị hạ tầng phần mềm, cá nhân tôi cho rằng thay vì trông chờ vào một viên đạn bạc vô thực, cách tiếp cận khoa học nhất là xây dựng một chiến lược phòng thủ chiều sâu nhiều lớp nhằm nâng cao tối đa rào cản khai thác, bẻ gãy các vector tấn công tự động và giảm thiểu rủi ro xuống mức thấp nhất có thể.
Bên cạnh các thiết lập nội tại trên máy chủ, việc kết hợp hàng rào kiểm soát lưu lượng từ mạng biên như tôi từng phân tích trong bài viết 16 năm cùng Cloudflare đóng vai trò như một lớp sàng lọc ban đầu, giúp làm chậm và ngăn chặn phần lớn các cuộc dò quét tự động từ Internet.
Bản chất kỹ thuật của chuỗi khai thác thực thi mã từ xa
Chuỗi tấn công của CVE-2026-109618 và CVE-2026-109619 khai thác sự kết hợp giữa tính năng theo dõi tiến trình tải tệp và cơ chế quản lý phiên làm việc tự động trong nhân PHP. Một chuỗi khai thác Exploit Chain thông thường dựa trên ba mắt xích liên hoàn:
- Khởi tạo phiên ngoài ý muốn: Khi tiếp nhận một yêu cầu gửi dữ liệu dạng đa phần có chứa trường dữ liệu trùng với cấu hình theo dõi tiến trình tải tệp, nhân PHP sẽ tự động khởi tạo một tệp phiên làm việc trên đĩa cứng ngay cả khi ứng dụng web không chủ động bắt đầu phiên.
- Tiêm nhiễm mã độc thô: Kẻ tấn công cố tình đưa mã độc PHP vào giá trị của trường dữ liệu theo dõi. Giá trị này được tuần tự hóa và ghi trực tiếp vào tệp phiên tạm thời trong thư mục hệ thống.
- Kích hoạt thực thi mã: Bằng cách lợi dụng một điểm bao hàm tệp cục bộ LFI sẵn có trong mã nguồn hoặc kết hợp kỹ thuật chạy đua thời gian Race Condition, kẻ tấn công tìm cách ép máy chủ đọc lại tệp phiên đã bị tiêm nhiễm để kích hoạt mã nguồn độc hại.
Mặc dù việc bẻ gãy một trong ba mắt xích này có thể vô hiệu hóa kịch bản khai thác chuẩn mực, bản thân tôi luôn lưu ý các kỹ sư rằng kẻ tấn công có trình độ cao vẫn có thể tìm kiếm các biến thể khác. Do đó, việc triển khai đồng thời bốn lớp phòng ngự độc lập dưới đây là yêu cầu mang tính bắt buộc.
Chiến lược phòng thủ chiều sâu 4 lớp giảm thiểu rủi ro
Lớp 1: Thu hẹp bề mặt tấn công tại nhân xử lý PHP
Biện pháp đầu tiên và có chi phí thấp nhất là vô hiệu hóa tính năng theo dõi tiến trình tải tệp qua phiên làm việc nếu ứng dụng của bạn không thực sự cần đến nó. Mở tệp cấu hình php.ini áp dụng cho cả giao diện dòng lệnh CLI và dịch vụ FPM để thiết lập các thông số sau:
; Tắt tính năng theo dõi tiến trình upload qua session để triệt tiêu vector tạo file tự động
session.upload_progress.enabled = Off
; Ngăn chặn client tự gán Session ID tùy ý nhằm giảm thiểu nguy cơ Session Fixation
session.use_strict_mode = 1
; Không tự động nạp session khi mã nguồn chưa yêu cầu
session.auto_start = 0
; Vô hiệu hóa tính năng mở và nạp tệp tin từ xa
allow_url_fopen = Off
allow_url_include = Off
Sau khi lưu cấu hình, bắt buộc phải khởi động lại tiến trình xử lý PHP để các giá trị mới được nạp vào bộ nhớ:
sudo systemctl restart php-fpm
# Hoặc khởi động lại dịch vụ tương ứng với phiên bản đang chạy
sudo systemctl restart php7.4-fpm
Lớp 2: Thiết lập bộ lọc tại máy chủ web Nginx và mạng biên WAF
Dựng rào chắn ngay tại cửa ngõ máy chủ web giúp loại bỏ sớm các yêu cầu chứa mẫu khai thác thô trước khi chúng chạm tới nhân PHP.
Đối với máy chủ Nginx, bạn có thể bổ sung điều kiện kiểm tra chuỗi truy vấn bên trong khối định tuyến xử lý tệp PHP:
location ~ \.php$ {
# Từ chối yêu cầu nếu chuỗi tham số chứa định danh khai thác phổ biến
if ($args ~* "PHP_SESSION_UPLOAD_PROGRESS") {
return 403;
}
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Nếu website đang đứng sau lớp bảo vệ của Cloudflare, việc thiết lập một quy tắc tường lửa Custom WAF Rule sẽ giúp chặn đứng các công cụ quét tự động từ Internet:
(http.request.uri.query contains "PHP_SESSION_UPLOAD_PROGRESS") or
(http.request.body.raw contains "PHP_SESSION_UPLOAD_PROGRESS")
Tuy nhiên, cá nhân tôi cần lưu ý rằng các bộ lọc WAF dựa trên chuỗi văn bản thuần túy không thể bao quát toàn bộ mọi biến thể nếu kẻ tấn công sử dụng các kỹ thuật phân đoạn dữ liệu tinh vi. Do đó, Lớp 2 không thể thay thế cho các lớp kiểm soát bên dưới.
Lớp 3: Cô lập không gian lưu trữ phiên và kích hoạt vùng giới hạn
Kẻ tấn công thường mặc định tệp phiên sẽ nằm tại các thư mục tạm dùng chung của hệ điều hành. Việc di dời thư mục này sang một phân vùng riêng biệt và thiết lập quyền truy cập tối thiểu sẽ khiến kịch bản dò tìm đường dẫn tệp trở nên khó khăn hơn:
# Khởi tạo thư mục phiên riêng biệt và cấp quyền khép kín
sudo mkdir -p /var/lib/php_sessions_private
sudo chown -R www-data:www-data /var/lib/php_sessions_private
sudo chmod 700 /var/lib/php_sessions_private
Đồng thời, cấu hình thông số giới hạn phạm vi truy cập tệp trong php.ini để ngăn chặn việc bao hàm các tệp tin nằm ngoài cây thư mục được cấp phép:
session.save_path = "/var/lib/php_sessions_private"
open_basedir = "/var/www/html/:/var/lib/php_sessions_private/"
Lớp 4: Khóa quyền gọi lệnh hệ thống và thiết lập quyền hạn tối thiểu
Trong tình huống xấu nhất khi mã độc vẫn tìm được cách thực thi trong ngữ cảnh ứng dụng, chúng ta cần ngăn chặn kẻ tấn công mở rộng phạm vi kiểm soát sang hệ điều hành máy chủ:
- Vô hiệu hóa các hàm thực thi lệnh shell: Thiết lập danh sách các hàm bị cấm trong tệp cấu hình:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,show_source. - Thiết lập quyền chỉ đọc cho thư mục mã nguồn: Đảm bảo tài khoản thực thi dịch vụ web chỉ có quyền đọc đối với các tệp mã nguồn và chỉ được cấp quyền ghi ở các thư mục bắt buộc:
find /var/www/html/ -type f -exec chmod 644 {} \; find /var/www/html/ -type d -exec chmod 755 {} \; # Chỉ cấp quyền ghi cho thư mục lưu trữ tệp người dùng tải lên chmod -R 775 /var/www/html/uploads
Bảng đánh giá mức độ suy giảm rủi ro theo từng tầng phòng thủ
| Tầng phòng thủ | Biện pháp kỹ thuật | Mức độ giảm thiểu rủi ro |
|---|---|---|
| Nhân xử lý PHP Engine | Tắt session.upload_progress.enabled | Rất cao, đóng vector tạo tệp phiên tự động chuẩn mực |
| Mạng biên và Tường lửa WAF | Lọc chuỗi PHP_SESSION_UPLOAD_PROGRESS | Khá, lọc sạch các đợt rà quét tự động diện rộng |
| Hệ thống lưu trữ OS | Đổi session.save_path và bật open_basedir | Cao, cô lập phạm vi đọc tệp của ứng dụng |
| Môi trường thực thi Runtime | Khóa disable_functions các hàm shell | Cao, hạn chế tối đa nguy cơ leo thang đặc quyền |
Tổng kết góc nhìn vận hành thực chiến
Đối với cá nhân tôi, bảo mật trong môi trường doanh nghiệp thực tế là một bài toán quản trị rủi ro không ngừng nghỉ. Việc triển khai đồng bộ bốn lớp phòng thủ trên không mang lại sự an tâm tuyệt đối vĩnh viễn, nhưng nó giúp bạn dựng nên nhiều tầng chướng ngại vật vững chắc, buộc kẻ tấn công phải trả giá rất đắt về mặt thời gian và công sức để tìm ra một kịch bản khai thác thành công.
Hãy xem đây là một giải pháp tình thế an toàn và hiệu quả, giúp mua thêm thời gian quý báu cho đội ngũ kỹ thuật trong lúc chuẩn bị lộ trình nâng cấp hệ thống một cách căn cơ và bền vững nhất.
- CVE: Hệ thống mã danh xưng tiêu chuẩn quốc tế dùng để định danh và theo dõi các lỗ hổng bảo mật phần mềm đã được xác thực.
- Pre-auth: Khái niệm chỉ các lỗ hổng bảo mật có thể bị khai thác từ xa mà không yêu cầu kẻ tấn công phải đăng nhập hay có quyền xác thực tài khoản trước.
- RCE: Lỗ hổng thực thi mã từ xa cho phép kẻ tấn công chạy các câu lệnh mã nguồn hoặc lệnh hệ điều hành tùy ý trên máy chủ nạn nhân.
- LFI: Lỗ hổng bao hàm tệp cục bộ xảy ra khi ứng dụng web cho phép người dùng nạp và thực thi các tệp tin có sẵn trên hệ thống máy chủ lưu trữ.
- Exploit Chain: Chuỗi khai thác liên hoàn kết hợp nhiều lỗ hổng hoặc điểm yếu logic nhỏ để tạo nên một cuộc tấn công có sức tàn phá nghiêm trọng.
- Mitigation: Các biện pháp kỹ thuật nhằm giảm thiểu mức độ nghiêm trọng hoặc thu hẹp bề mặt tấn công của một lỗ hổng khi chưa thể vá lỗi tận gốc.
- Race Condition: Lỗi chạy đua thời gian xảy ra khi hệ thống xử lý các tác vụ đa luồng không đồng bộ, tạo ra khoảng trống thời gian ngắn để kẻ tấn công can thiệp vào dữ liệu tạm.
- WAF: Tường lửa ứng dụng web chuyên dụng có nhiệm vụ phân tích và ngăn chặn các mẫu tấn công độc hại truyền qua giao thức web.
- FPM: Trình quản lý tiến trình FastCGI chuyên dụng của PHP giúp tối ưu hóa hiệu năng xử lý cho các website có lưu lượng truy cập lớn.
Bản thân tôi cần nhấn mạnh một cách trung thực rằng các biện pháp phòng ngự giảm nhẹ thông qua cấu hình không thể thay thế hoàn toàn cho một bản vá chính thức từ nhà phát triển. Nếu mã nguồn ứng dụng của bạn tồn tại các lỗ hổng giải tuần tự hóa dữ liệu không an toàn khác hoặc có các điểm tải tệp tùy ý trong các mô-đun nghiệp vụ, kẻ tấn công vẫn có thể tìm ra những con đường vòng để tiêm nhiễm mã độc. Do đó, việc duy trì hệ thống giám sát nhật ký truy cập thường xuyên và lên kế hoạch nâng cấp phiên bản PHP dài hạn vẫn là trách nhiệm bắt buộc của mọi quản trị viên hệ thống.