Lỗ hổng Nghiêm trọng CVE-2025-7783 trong form-data JavaScript: Nguy cơ Chèn Tham số

Một lỗ hổng bảo mật nghiêm trọng đã được phát hiện trong gói JavaScript form-data, một thư viện được sử dụng rộng rãi. Lỗ hổng này có khả năng khiến hàng ngàn ứng dụng gặp rủi ro bị tấn công từ xa thông qua việc tạo ra các giá trị ranh giới (boundary values) có thể dự đoán được.

Tổng quan về Lỗ hổng CVE-2025-7783 trong form-data JavaScript

Lỗ hổng này, được định danh là CVE-2025-7783, đã được công bố bởi Jordan Harband (ljharb), một nhà phát triển JavaScript nổi tiếng và cựu biên tập viên đặc tả TC39. Điểm cốt lõi của lỗ hổng nằm ở việc gói form-data sử dụng hàm JavaScript Math.random() để tạo ra các giá trị boundary cho dữ liệu được mã hóa đa phần (multipart form-encoded data).

Việc lựa chọn thiết kế này tạo ra một điểm yếu bảo mật nghiêm trọng. Hàm Math.random() tạo ra các giá trị giả ngẫu nhiên (pseudo-random) và có thể dự đoán được, cho phép những kẻ tấn công có kinh nghiệm khai thác để chèn các tham số độc hại vào các yêu cầu HTTP. Điều này có thể dẫn đến việc kiểm soát ngoài ý muốn đối với các tham số yêu cầu, tiềm ẩn nguy cơ phá vỡ tính toàn vẹn dữ liệu và hệ thống.

Các Phiên bản form-data bị Ảnh hưởng

Lỗ hổng CVE-2025-7783 ảnh hưởng đến nhiều phiên bản của gói form-data. Các tổ chức đang sử dụng bất kỳ phiên bản nào trong số này phải đối mặt với rủi ro tức thì về các cuộc tấn công chèn tham số (parameter injection attacks), có thể gây tổn hại đến các hệ thống nội bộ và làm lộ dữ liệu nhạy cảm. Các phiên bản dễ bị tấn công bao gồm:

  • Tất cả các phiên bản trước 2.5.4
  • Các phiên bản từ 3.0.0 đến 3.0.3
  • Các phiên bản từ 4.0.0 đến 4.0.3

Cơ chế Khai thác Lỗ hổng

Kẻ tấn công có thể khai thác lỗ hổng này bằng cách quan sát các giá trị Math.random() được tạo ra bởi các ứng dụng mục tiêu và sử dụng các kỹ thuật toán học để dự đoán trạng thái nội bộ của bộ tạo số giả ngẫu nhiên (PRNG – Pseudo-Random Number Generator).

Quy trình Tấn công Parameter Injection

Khi trạng thái PRNG đã được xác định, kẻ tấn công có thể dự đoán các giá trị boundary trong tương lai. Với khả năng này, chúng có thể tạo ra các payload độc hại chứa các boundary đã dự đoán, sau đó là các trường dữ liệu do kẻ tấn công kiểm soát. Quy trình tấn công diễn ra theo các bước sau:

  1. Quan sát giá trị Math.random(): Kẻ tấn công thu thập các mẫu giá trị được tạo bởi Math.random() từ ứng dụng mục tiêu. Các mẫu này có thể được thu thập thông qua nhiều kênh khác nhau, chẳng hạn như các tiêu đề yêu cầu (request ID headers) được sử dụng cho theo dõi phân tán (distributed tracing), nơi thường xuyên sử dụng Math.random() để tạo ID.
  2. Dự đoán trạng thái PRNG: Dựa trên các giá trị quan sát được, kẻ tấn công sử dụng các thuật toán hoặc công cụ chuyên biệt để tái tạo hoặc dự đoán trạng thái nội bộ của bộ tạo số giả ngẫu nhiên của Math.random(). Do Math.random() không phải là hàm ngẫu nhiên bảo mật bằng mật mã (cryptographically secure), trạng thái của nó có thể bị suy luận nếu đủ mẫu được thu thập.
  3. Dự báo giá trị boundary tương lai: Một khi trạng thái PRNG đã được biết, kẻ tấn công có thể tính toán và dự báo chính xác chuỗi các giá trị ngẫu nhiên tiếp theo mà Math.random() sẽ tạo ra. Điều này cho phép chúng biết trước các giá trị boundary sẽ được sử dụng trong các yêu cầu form-data trong tương lai.
  4. Chế tạo payload độc hại: Với kiến thức về các giá trị boundary dự kiến, kẻ tấn công xây dựng một yêu cầu HTTP hợp lệ. Yêu cầu này bao gồm các giá trị boundary được dự đoán chính xác, theo sau là các trường dữ liệu do kẻ tấn công kiểm soát. Các trường này có thể là các tham số mới hoặc ghi đè lên các tham số hiện có mà ứng dụng dự định sử dụng.
  5. Thực hiện chèn tham số: Bằng cách gửi payload được chế tạo, kẻ tấn công có thể chèn các tham số tùy ý vào yêu cầu. Việc này tiềm ẩn nguy cơ ghi đè các giá trị được mong muốn hoặc thêm dữ liệu độc hại. Các tham số được chèn có thể vượt qua các kiểm soát bảo mật, dẫn đến các hành vi trái phép như leo thang đặc quyền, truy cập dữ liệu nhạy cảm hoặc thực thi mã độc từ xa.

Điều kiện Tiên quyết để Khai thác

Kịch bản tấn công này yêu cầu hai điều kiện tiên quyết quan trọng:

  • Kẻ tấn công phải quan sát được các giá trị Math.random() khác được tạo ra bởi ứng dụng mục tiêu. Việc này thường thông qua các kênh công khai hoặc dễ tiếp cận.
  • Kẻ tấn công phải kiểm soát ít nhất một trường trong một yêu cầu form-data. Điều này cho phép kẻ tấn công tạo ra một phần của dữ liệu multipart form-encoded để chèn payload độc hại.

Các ứng dụng trở nên dễ bị tấn công khi chúng sử dụng form-data để truyền dữ liệu do người dùng kiểm soát đến các hệ thống backend, đồng thời tiết lộ các giá trị Math.random() thông qua các kênh khác nhau. Sự kết hợp này tạo ra một “kênh bên” (side channel) mà kẻ tấn công có thể tận dụng.

Đánh giá Mức độ Nghiêm trọng (CVSS 4.0)

Lỗ hổng CVE-2025-7783 đã nhận được xếp hạng CVSS 4.0Nghiêm trọng (Critical). Mức độ nghiêm trọng này là do vector tấn công dựa trên mạng (network-based attack vector) và tiềm năng gây ra tác động cao đến cả dữ liệu bảo mật (confidential data) và tính toàn vẹn hệ thống (system integrity). Điều này có nghĩa là kẻ tấn công có thể thực hiện tấn công từ xa mà không cần quyền truy cập vật lý hoặc đặc quyền cao, và hậu quả của việc khai thác thành công có thể rất nghiêm trọng đối với tổ chức bị ảnh hưởng.

Việc khai thác thành công cho phép kẻ tấn công chèn các tham số tùy ý vào các yêu cầu, có khả năng ghi đè các giá trị được mong muốn hoặc thêm dữ liệu độc hại vượt qua các kiểm soát bảo mật. Điều này có thể dẫn đến việc thực thi các lệnh trái phép, truy cập thông tin nhạy cảm, hoặc thậm chí kiểm soát hoàn toàn ứng dụng hoặc hệ thống backend.

Các nhà nghiên cứu bảo mật đã phát triển các PoC (Proof-of-Concept) khai thác, chứng minh các kịch bản khai thác thực tế của lỗ hổng này. Sự tồn tại của PoC làm tăng nguy cơ khai thác trong thực tế, nhấn mạnh sự cần thiết phải hành động ngay lập tức.

Giải pháp Khắc phục và Khuyến nghị

Các tổ chức phải nâng cấp ngay lập tức lên các phiên bản đã được vá lỗi của gói form-data để giảm thiểu rủi ro từ lỗ hổng CVE-2025-7783. Các bản vá đã được phát hành thay thế Math.random() bằng bộ tạo số ngẫu nhiên bảo mật bằng mật mã (cryptographically secure random number generation), loại bỏ tính chất có thể dự đoán được cho phép các cuộc tấn công này.

Nâng cấp Khẩn cấp

Tùy thuộc vào phiên bản form-data hiện tại đang được triển khai, các tổ chức cần nâng cấp lên một trong các phiên bản sau:

  • Phiên bản 2.5.4
  • Phiên bản 3.0.4
  • Phiên bản 4.0.4

Việc sử dụng các hàm ngẫu nhiên bảo mật bằng mật mã là một thực tiễn tốt nhất trong phát triển phần mềm, đặc biệt là khi liên quan đến việc tạo ra các giá trị cần tính không thể dự đoán được như session ID, khóa mật mã, hoặc các giá trị boundary trong giao thức mạng. Bản vá này đã khắc phục tận gốc vấn đề bằng cách loại bỏ nguồn gốc của tính dễ dự đoán.