Gravity Forms Lỗi Upload File CVSS 9: Hướng Dẫn Kiểm Tra, Vá 3.0.3 Và Rà Soát Dấu Vết

Câu trả lời nhanh
Gravity Forms 3.0.2 trở xuống dính lỗ hổng Unauthenticated Arbitrary File Upload qua State/Chunk Hash Confusion, điểm CVSS 9.0, do Patchstack công bố ngày 1/9/2026. Kẻ tấn công không cần tài khoản vẫn upload được backdoor lên server. Kiểm tra phiên bản bằng WP-CLI, vá ngay lên 3.0.3, sau đó rà soát file PHP lạ trong thư mục uploads/gravity_forms và đổi toàn bộ mật khẩu admin.

Vào hôm nay 1/9/2026, Patchstack đăng tải một cảnh báo mà mình nghĩ bất kỳ ai đang dùng Gravity Forms đều phải đọc ngay: toàn bộ các phiên bản từ 3.0.2 trở xuống đều dính lỗ hổng Unauthenticated Arbitrary File Upload qua cơ chế State/Chunk Hash Confusion, điểm CVSS 9.0. Nghĩa là kẻ tấn công không cần tài khoản, chỉ cần gửi request đặc chế tới endpoint upload file của form là có thể đẩy backdoor lên server của bạn. Trong bài này mình sẽ đi từ kiểm tra phiên bản, vá lỗi, cho tới rà soát dấu vết nếu site bạn đã chạy bản cũ một thời gian.

Gravity Forms là một trong những plugin form trả phí phổ biến nhất hệ WordPress, nên phạm vi ảnh hưởng không hề nhỏ. Lỗi kiểu file upload không cần xác thực là loại nghiêm trọng nhất trong ngành này, vì nó mở đường trực tiếp tới RCE — kẻ tấn công upload file PHP giả danh ảnh, rồi truy cập trực tiếp để chạy mã.

Gravity Forms dính lỗi gì và nghiêm trọng tới mức nào?

Gravity Forms lỗi upload file CVSS 9.0 cần vá bản 3.0.3
Gravity Forms lỗi upload file CVSS 9.0 cần vá bản 3.0.3

Lỗ hổng nằm ở cơ chế upload file theo chunk (chia nhỏ file) của Gravity Forms. Hàm xử lý chunk dùng state và hash để ghép các phần file lại, nhưng do nhầm lẫn khi đối chiếu state/chunk hash, một request chưa xác thực có thể khiến hệ thống ghi đè hoặc tạo file tùy ý trên server. Patchstack chấm CVSS 9.0 và cảnh báo thẳng: loại lỗi này thường bị khai thác hàng loạt trong các chiến dịch mass-exploit, không phân biệt site lớn hay nhỏ. Nếu site bạn dùng Gravity Forms 3.0.2 trở xuống và có form cho phép upload file thì mức độ ưu tiên vá là ngay lập tức.

Làm sao kiểm tra site có đang dùng bản dính lỗi?

Cách nhanh nhất là dùng WP-CLI. Bạn SSH vào server rồi chạy:

sudo -u www-data wp plugin list --path=/var/www/example.com/public_html | grep gravity

Hoặc chỉ xem phiên bản:

sudo -u www-data wp plugin get gravityforms --field=version --path=/var/www/example.com/public_html

Nếu bạn không có quyền SSH, mở wp-admin rồi vào Plugins và tìm Gravity Forms. Phiên bản hiển thị ngay dưới tên plugin. Mọi phiên bản <= 3.0.2 đều phải vá lên 3.0.3. Lưu ý thêm: kể cả khi các form của bạn không bật trường upload file, mình vẫn khuyên cập nhật, vì các bản vá bảo mật của Gravity Forms thường kèm theo các hardening khác.

Cách vá lỗi chuẩn chỉnh trong 5 phút?

Gravity Forms là plugin trả phí nên bạn cần license key còn hiệu lực để nhận bản cập nhật. Quy trình mình làm như sau:

Bước 1: Backup toàn bộ site và database trước khi đụng vào bất cứ thứ gì:

wp db export backup-truoc-vap-gravity.sql --path=/var/www/example.com/public_html
tar -czf backup-wp-content-$(date +%F).tar.gz /var/www/example.com/public_html/wp-content

Bước 2: Cập nhật lên 3.0.3 bằng WP-CLI cho nhanh:

sudo -u www-data wp plugin update gravityforms --path=/var/www/example.com/public_html

Bước 3: Xác nhận phiên bản mới:

sudo -u www-data wp plugin get gravityforms --field=version --path=/var/www/example.com/public_html

Kết quả phải trả về 3.0.3 trở lên. Sau đó bạn vào một form có trường upload, nộp thử một lần để chắc chắn quy trình upload vẫn hoạt động bình thường.

Bước 4: Nếu license hết hạn không update được, giải pháp tạm thời là bật mitigation rule của Patchstack, hoặc chặn truy cập trực tiếp vào thư mục upload của Gravity Forms bằng Nginx:

location ~* /wp-content/uploads/gravity_forms/.*\.php$ {
    deny all;
}

Đây chỉ là giảm thiểu, không thay thế được bản vá. Hãy gia hạn license và update sớm nhất có thể.

Sau khi vá cần rà soát dấu vết gì?

Vá xong chưa phải là hết việc. Nếu site bạn đã chạy bản dính lỗi, attacker có thể đã trồng backdoor từ trước. Mình rà soát theo checklist này:

1. Quét file PHP lạ trong thư mục upload của Gravity Forms:

find wp-content/uploads/gravity_forms/ -name "*.php" -mtime -30

Thư mục này về nguyên tắc không bao giờ được có file PHP. Nếu tìm thấy file nào, cô lập nó ngay và mang đi phân tích, đừng xóa vội vì đó là bằng chứng.

2. Kiểm tra user admin bất thường:

sudo -u www-data wp user list --role=administrator --path=/var/www/example.com/public_html

Xóa bất kỳ tài khoản nào bạn không nhận ra, đặc biệt các account mới tạo gần đây.

3. Đổi toàn bộ mật khẩu và secret key:

Đổi mật khẩu admin, đổi salt trong wp-config.php, và thu hồi toàn bộ Application Password trong mục Users → Profile. Nếu nghi ngờ nặng, đăng xuất tất cả session bằng lệnh:

wp user session destroy-admin_all

4. Đối chiếu access log:

grep -E "gravity_forms|gform" /var/log/nginx/access.log | grep -vE "GET.*(css|js|png|jpg)" | tail -100

Tìm các POST request lặp lại nhiều lần tới endpoint xử lý upload, đặc biệt từ một IP duy nhất. Đây thường là dấu vết của script khai thác tự động.

Mình rút ra bài học gì từ đợt này?

Điều đáng nói là lỗi nằm ở chính plugin form trả phí đắt tiền nhất thị trường, thứ mà nhiều người mặc định là an toàn. Bài học của mình rất đơn giản: trả tiền không đồng nghĩa với an toàn, và mọi plugin có chức năng upload file đều phải được theo dõi sát hơn bình thường. Với các site khách hàng, mình luôn bật auto-update cho các bản security và cấu hình alert khi có bản vá CVSS từ 7 trở lên — các bài như hướng dẫn về virtual patching của Patchstack mình đã chia sẻ trước đây giờ càng chứng minh giá trị. Cập nhật ngay hôm nay, đừng đợi tới mai.

Thanh Tùng

Mình là Thanh Tùng. Bạn bè gọi mình là "bác sĩ máy tính" vì hễ máy nào có vấn đề là mình muốn mò vào xem sao. Mình viết hướng dẫn theo cách mà mình mong người khác đã viết cho mình ngày xưa — từng bước rõ ràng, không bỏ sót, và nói luôn cái gì hay bị lỗi. Ngoài giờ làm mình chơi guitar, nuôi mèo, và có một con VPS riêng dành riêng cho việc cài thử đủ thứ linh tinh.

Xem tất cả bài viết →

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *