CVE-2025-25257: Lỗ hổng SQL Injection tiền xác thực FortiWeb gây RCE

Các nhà nghiên cứu bảo mật đã xác định một lỗ hổng tiêm nhiễm SQL (SQL injection) tiền xác thực nghiêm trọng trong FortiWeb Fabric Connector của Fortinet, được định danh là CVE-2025-25257. Lỗ hổng này cho phép những kẻ tấn công chưa được xác thực thực thi các lệnh SQL trái phép và có khả năng đạt được quyền thực thi mã từ xa (Remote Code Execution – RCE).

Ảnh hưởng và Phiên bản Bị Ảnh hưởng

Lỗ hổng này ảnh hưởng đến nhiều phiên bản của FortiWeb, bao gồm:

  • Phiên bản 7.6.0 đến 7.6.3
  • Phiên bản 7.4.0 đến 7.4.7
  • Phiên bản 7.2.0 đến 7.2.10
  • Phiên bản 7.0.0 đến 7.0.10

Các bản vá đã có sẵn trong các phiên bản mới hơn.

Fabric Connector của FortiWeb đóng vai trò là phần mềm trung gian tích hợp giữa các tường lửa ứng dụng web FortiWeb (WAF) và các sản phẩm khác trong hệ sinh thái Fortinet. Nó cho phép cập nhật chính sách bảo mật động dựa trên các thay đổi cơ sở hạ tầng theo thời gian thực và thông tin tình báo về mối đe dọa.

Nguyên nhân Kỹ thuật của Lỗ hổng

Lỗ hổng bắt nguồn từ việc xử lý đầu vào không đúng cách (improper input sanitization) trong hàm get_fabric_user_by_token thuộc cơ chế xác thực của FortiWeb. Các nhà nghiên cứu phát hiện ra rằng hàm này trực tiếp kết hợp dữ liệu đầu vào do người dùng kiểm soát từ các tiêu đề HTTP Authorization vào các truy vấn SQL mà không có sự xác thực hoặc thoát ký tự phù hợp.

Mã nguồn dễ bị tấn công sử dụng phương pháp định dạng chuỗi (format string approach) để xây dựng các truy vấn. Cụ thể, truy vấn được tạo ra có dạng tương tự như sau:

select id from fabric_user.user_table where token='%s'

Trong đó, phần giữ chỗ %s được thay thế bằng dữ liệu do kẻ tấn công kiểm soát lấy từ Authorization Bearer token.

Kỹ thuật Khai thác và Vượt qua Hạn chế

Quá trình xác thực trích xuất token từ tiêu đề Authorization bằng định dạng Bearer %128s. Điều này đặt ra cả cơ hội và ràng buộc cho việc khai thác. Mặc dù hàm sscanf giới hạn đầu vào ở 128 ký tự và ngừng phân tích tại ký tự khoảng trắng đầu tiên, những kẻ tấn công vẫn có thể vượt qua các hạn chế này. Điều này được thực hiện bằng cách sử dụng cú pháp bình luận của MySQL (/**/) để thay thế khoảng trắng trong các payload tiêm nhiễm của chúng.

Kỹ thuật này cho phép thực hiện các cuộc tấn công tiêm nhiễm SQL phức tạp mặc dù có các hạn chế đầu vào rõ ràng. Các nhà nghiên cứu bảo mật đã chứng minh cách lỗ hổng tiêm nhiễm SQL này có thể được leo thang để đạt được quyền thực thi mã từ xa (RCE) hoàn toàn thông qua một chuỗi tấn công tinh vi.

Việc khai thác tận dụng câu lệnh INTO OUTFILE của MySQL để ghi các tệp tùy ý vào hệ thống mục tiêu, kết hợp với các móc cấu hình dành riêng cho trang web của Python (Python’s site-specific configuration hooks) để thực thi mã. Chuỗi khai thác này vượt qua một số hạn chế của hệ thống và chứng minh cách một lỗ hổng tiêm nhiễm đơn giản có thể nhanh chóng leo thang thành một sự xâm nhập hoàn toàn vào hệ thống bị ảnh hưởng.

Biện pháp Khắc phục và Vá lỗi

Fortinet đã khắc phục lỗ hổng này trong các phiên bản đã vá lỗi bằng cách thay thế các truy vấn định dạng chuỗi dễ bị tấn công bằng các câu lệnh được chuẩn bị trước (prepared statements) sử dụng hàm mysql_stmt_prepare của MySQL. Việc triển khai được cập nhật sử dụng các truy vấn có tham số hóa với các phần giữ chỗ (ví dụ: SELECT id FROM fabric_user.user_table WHERE token = ?) giúp tách biệt mã SQL khỏi dữ liệu người dùng một cách chính xác, từ đó ngăn chặn các cuộc tấn công tiêm nhiễm.

Người dùng FortiWeb được khuyến cáo nâng cấp lên các phiên bản sau hoặc cao hơn:

  • FortiWeb 7.6.4 hoặc cao hơn
  • FortiWeb 7.4.8 hoặc cao hơn
  • FortiWeb 7.2.11 hoặc cao hơn
  • FortiWeb 7.0.11 hoặc cao hơn

Là một biện pháp giảm thiểu tức thời, các tổ chức có thể hạn chế quyền truy cập vào các API endpoint của Fabric Connector cho đến khi các bản vá được áp dụng. Tuy nhiên, điều này có thể ảnh hưởng đến chức năng tích hợp hợp pháp với các sản phẩm Fortinet khác.

Phát hiện và Giám sát

Các tổ chức đang chạy các phiên bản FortiWeb bị ảnh hưởng nên ngay lập tức triển khai các biện pháp phát hiện. Lỗ hổng có thể được phát hiện bằng cách giám sát các yêu cầu HTTP cụ thể tới các API endpoint liên quan đến Fabric Connector, đặc biệt là:

  • /api/fabric/device/status
  • /api/fabric/authenticate
  • Các đường dẫn /api/v[0-9]/fabric/widget

Các đội ngũ bảo mật nên theo dõi các tiêu đề Authorization có chứa các chỉ báo tiêm nhiễm SQL như:

  • Dấu nháy đơn (')
  • Cú pháp bình luận của MySQL (/**/)
  • Các câu lệnh logic boolean như 'or'1'='1

Các nỗ lực khai thác thành công thường trả về phản hồi HTTP 200 với dữ liệu JSON chứa thông tin thiết bị. Trong khi đó, các nỗ lực thất bại trên các hệ thống đã vá lỗi sẽ trả về phản hồi HTTP 401 Unauthorized.