Lỗ Hổng PHP SQL Injection & DoS Nghiêm Trọng: Cập Nhật Khẩn Cấp

Các nhà nghiên cứu bảo mật đã công bố hai lỗ hổng đáng kể trong PHP, ngôn ngữ kịch bản phía máy chủ phổ biến. Các lỗ hổng này có thể cho phép kẻ tấn công thực hiện các cuộc tấn công SQL Injection (SQLi)Denial of Service (DoS).

Theo báo cáo chính thức GHSA-hrwm-9436-5mv3, các quản trị viên và nhà phát triển được khuyến nghị cập nhật ngay lập tức các cài đặt PHP của họ để giảm thiểu rủi ro này.

CVE-2025-1735: Lỗi SQL Injection và Treo Hệ Thống qua Mở Rộng pgsql

Mô tả Lỗ Hổng

Một lỗ hổng có mức độ nghiêm trọng trung bình đã được xác định trong mở rộng pgsql của PHP, vốn được sử dụng để giao tiếp với cơ sở dữ liệu PostgreSQL. Lỗ hổng này phát sinh do mở rộng không kiểm tra lỗi đúng cách trong quá trình thoát dữ liệu do người dùng cung cấp.

Cụ thể hơn, PHP không truyền các tham số lỗi cần thiết tới hàm PQescapeStringConn(), ngăn chặn hàm này báo cáo các lỗi mã hóa có thể xảy ra. Hàm PQescapeStringConn() có vai trò quan trọng trong việc bảo vệ ứng dụng khỏi các cuộc tấn công SQL Injection bằng cách thoát các ký tự đặc biệt trong dữ liệu đầu vào trước khi chúng được sử dụng trong các truy vấn SQL. Việc không truyền đúng tham số lỗi có nghĩa là ngay cả khi có lỗi mã hóa xảy ra trong quá trình này, ứng dụng PHP vẫn sẽ không nhận được thông báo về chúng, dẫn đến việc xử lý dữ liệu không an toàn và tiềm ẩn nguy cơ khai thác.

Ngoài ra, một số lời gọi đến hàm PQescapeIdentifier() không kiểm tra giá trị trả về NULL. Hàm PQescapeIdentifier() được dùng để thoát các định danh (như tên bảng hoặc tên cột) trong các truy vấn SQL. Nếu hàm này trả về NULL (thường báo hiệu lỗi hoặc điều kiện không hợp lệ) mà ứng dụng không kiểm tra, điều này có thể dẫn đến các hành vi không xác định hoặc làm cho ứng dụng bị treo (crash). Trong kịch bản này, việc không xử lý giá trị NULL một cách an toàn có thể trực tiếp gây ra lỗi phân đoạn (segmentation fault) hoặc các lỗi nghiêm trọng khác, dẫn đến gián đoạn dịch vụ đột ngột.

Ảnh Hưởng

Lỗ hổng CVE-2025-1735 có hai tác động chính đối với ứng dụng và hệ thống:

  • SQL Injection (SQLi): Do việc thoát dữ liệu không đúng cách và không báo cáo lỗi mã hóa, kẻ tấn công có thể chèn các chuỗi truy vấn độc hại vào dữ liệu đầu vào của người dùng. Khi chuỗi này được ứng dụng xử lý và truyền tới cơ sở dữ liệu PostgreSQL, nó có thể bị diễn giải như một phần của truy vấn SQL hợp lệ. Điều này cho phép kẻ tấn công thực hiện các thao tác không được phép như truy xuất dữ liệu nhạy cảm (ví dụ: thông tin người dùng, dữ liệu kinh doanh), sửa đổi hoặc xóa dữ liệu, hoặc thậm chí thực thi các lệnh từ xa trên máy chủ cơ sở dữ liệu. Mức độ nghiêm trọng của một cuộc tấn công SQLi có thể từ việc tiết lộ thông tin cá nhân đến chiếm quyền kiểm soát hoàn toàn cơ sở dữ liệu và hệ thống liên quan.
  • Treo Ứng Dụng (Application Crash): Việc không kiểm tra giá trị trả về NULL từ PQescapeIdentifier() có thể dẫn đến việc ứng dụng cố gắng truy cập vào một vùng nhớ không hợp lệ hoặc thực hiện một thao tác không hợp lệ, gây ra lỗi phân đoạn (segmentation fault) và làm cho tiến trình PHP bị dừng đột ngột. Điều này dẫn đến tình trạng từ chối dịch vụ (DoS) một phần hoặc toàn bộ đối với ứng dụng web, làm gián đoạn hoạt động kinh doanh và khả năng truy cập của người dùng.

Phiên Bản Bị Ảnh Hưởng và Vá Lỗi

Thông tin chi tiết về các phiên bản cụ thể của PHP bị ảnh hưởng và các phiên bản đã được vá lỗi không được cung cấp trong nội dung ban đầu. Quản trị viên và nhà phát triển cần tham khảo báo cáo bảo mật chính thức của PHP hoặc các kênh thông báo bảo mật để có danh sách chính xác các phiên bản cần được cập nhật.

CVE-2025-6491: NULL Pointer Dereference trong Mở Rộng SOAP

Mô tả Lỗ Hổng

Lỗ hổng thứ hai ảnh hưởng đến mở rộng SOAP của PHP, thường được sử dụng để xây dựng và tiêu thụ các dịch vụ web dựa trên giao thức SOAP (Simple Object Access Protocol). Lỗ hổng này xảy ra khi một thể hiện (instance) của SoapVar được tạo ra với một tên đủ điều kiện (fully qualified name) có kích thước lớn hơn 2GB.

Nguyên nhân gốc rễ của vấn đề này nằm ở những hạn chế của thư viện libxml2, đặc biệt là các phiên bản trước 2.13. Thư viện libxml2 chịu trách nhiệm xử lý phân tích cú pháp XML trong PHP, và các phiên bản cũ hơn của nó không được thiết kế để xử lý các tiền tố không gian tên XML (XML namespace prefixes) có kích thước cực lớn một cách hiệu quả. Khi một SoapVar được khởi tạo với một tên đủ điều kiện vượt quá giới hạn xử lý của libxml2, nó có thể dẫn đến tình trạng NULL Pointer Dereference.

NULL Pointer Dereference là một lỗi lập trình trong đó một chương trình cố gắng truy cập vào một vị trí bộ nhớ thông qua một con trỏ có giá trị NULL. Điều này là bất hợp pháp và thường dẫn đến lỗi phân đoạn (segmentation fault), làm cho tiến trình của ứng dụng bị dừng đột ngột và sập hoàn toàn.

Ảnh Hưởng

Kẻ tấn công có thể khai thác lỗ hổng CVE-2025-6491 bằng cách gửi các yêu cầu SOAP được chế tạo đặc biệt đến ứng dụng PHP mục tiêu. Những yêu cầu này sẽ chứa một SoapVar với tên đủ điều kiện có kích thước lớn bất thường, gây ra lỗi NULL Pointer Dereference khi được phân tích cú pháp bởi libxml2 và xử lý bởi mở rộng SOAP của PHP. Hậu quả trực tiếp là tiến trình PHP xử lý yêu cầu đó sẽ bị treo (crash), dẫn đến tình trạng từ chối dịch vụ (DoS) đáng tin cậy.

Một cuộc tấn công DoS thành công sẽ làm cho ứng dụng hoặc dịch vụ web trở nên không khả dụng đối với người dùng hợp pháp. Điều này có thể gây ra thiệt hại đáng kể về tài chính, uy tín và hoạt động cho các tổ chức phụ thuộc vào các dịch vụ web được cung cấp bởi ứng dụng PHP dễ bị tổn thương, đặc biệt nếu dịch vụ đó là yếu tố cốt lõi trong hoạt động kinh doanh.

Phiên Bản Bị Ảnh Hưởng và Vá Lỗi

Tương tự như CVE-2025-1735, thông tin về các phiên bản cụ thể của PHP bị ảnh hưởng bởi lỗ hổng SOAP và các phiên bản đã được vá lỗi không được liệt kê trong nội dung ban đầu. Để đảm bảo an toàn, người dùng và quản trị viên hệ thống cần tham khảo các thông báo và bản vá chính thức từ PHP hoặc thư viện libxml2 để xác định phiên bản chính xác cần cập nhật.

Khuyến Nghị và Biện Pháp Giảm Thiểu

Với mức độ nghiêm trọng tiềm tàng của cả hai lỗ hổng SQL InjectionDenial of Service, quản trị viên và nhà phát triển cần ưu tiên xử lý các vấn đề này một cách khẩn cấp để bảo vệ các ứng dụng PHP và dữ liệu liên quan.

Biện pháp giảm thiểu hiệu quả và trực tiếp nhất là cập nhật ngay lập tức các cài đặt PHP lên phiên bản đã được vá lỗi. Việc duy trì phần mềm luôn ở trạng thái cập nhật mới nhất là một trong những thực hành bảo mật cơ bản và quan trọng nhất để bảo vệ hệ thống khỏi các lỗ hổng đã biết.

Ngoài ra, các nhà phát triển nên xem xét các thực hành mã hóa an toàn để tăng cường khả năng phòng thủ của ứng dụng:

  • Sử dụng Prepared Statements với tham số hóa cho tất cả các tương tác với cơ sở dữ liệu để ngăn chặn SQL Injection, thay vì nối chuỗi trực tiếp hoặc dựa vào các hàm thoát dữ liệu thủ công. Điều này giúp tách biệt lệnh SQL khỏi dữ liệu do người dùng cung cấp, làm cho các chuỗi độc hại trở nên vô hiệu.
  • Xác thực và làm sạch (sanitize) tất cả dữ liệu đầu vào của người dùng để đảm bảo rằng chúng tuân thủ định dạng và giới hạn kích thước mong đợi. Việc giới hạn kích thước chuỗi và kiểm tra kiểu dữ liệu có thể ngăn chặn các cuộc tấn công dựa trên việc truyền tải dữ liệu quá lớn hoặc không hợp lệ.
  • Triển khai cơ chế giám sát và ghi nhật ký mạnh mẽ để phát hiện và phản ứng kịp thời với các nỗ lực khai thác hoặc các hành vi bất thường, đặc biệt là các lỗi ứng dụng hoặc các truy vấn cơ sở dữ liệu đáng ngờ.
  • Xem xét giới hạn kích thước dữ liệu trong các yêu cầu gửi đến các điểm cuối SOAP, đặc biệt là các trường có thể chứa tên đủ điều kiện lớn, để ngăn chặn các cuộc tấn công DoS dựa trên kích thước. Áp dụng các giới hạn này ở cấp độ ứng dụng hoặc thông qua cấu hình máy chủ web có thể cung cấp thêm một lớp bảo vệ.

Việc không cập nhật và áp dụng các biện pháp phòng ngừa cần thiết có thể dẫn đến những hậu quả nghiêm trọng cho an ninh dữ liệu, tính toàn vẹn của hệ thống và độ tin cậy của dịch vụ.