-
09/04/2020
-
109
-
984 bài viết
Lỗ hổng trong thư viện JavaScript có thể khiến ứng dụng bị điều khiển từ xa
Một lỗ hổng vừa được phát hiện trong thư viện form-data trên npm. Với mã định danh CVE-2025-7783, lỗ hổng này ảnh hưởng đến hàng triệu ứng dụng web và API đang sử dụng JavaScript/Node.js trên toàn cầu, đặc biệt là trong các hệ thống backend, microservices và serverless.
Nguyên nhân gốc rễ đến từ cách sinh chuỗi "boundary" không an toàn trong file "form_data.js", dòng 347:
Đây là cách tạo ra chuỗi phân cách (boundary) giữa các phần dữ liệu trong biểu mẫu dạng multipart/form-data. Vấn đề là Math.random() không đủ ngẫu nhiên, nó chỉ là một trình tạo số giả định (PRNG), nên nếu hacker quan sát được một vài giá trị được tạo ra từ Math.random(), họ hoàn toàn có thể dự đoán các giá trị tiếp theo, bao gồm cả boundary.
Nguyên nhân gốc rễ đến từ cách sinh chuỗi "boundary" không an toàn trong file "form_data.js", dòng 347:
boundary += Math.floor(Math.random() * 10).toString(16);
Đây là cách tạo ra chuỗi phân cách (boundary) giữa các phần dữ liệu trong biểu mẫu dạng multipart/form-data. Vấn đề là Math.random() không đủ ngẫu nhiên, nó chỉ là một trình tạo số giả định (PRNG), nên nếu hacker quan sát được một vài giá trị được tạo ra từ Math.random(), họ hoàn toàn có thể dự đoán các giá trị tiếp theo, bao gồm cả boundary.
Lỗ hổng hoạt động như thế nào?
- Ứng dụng dùng form-data để gửi dữ liệu người dùng dưới dạng "multipart/form-data" (ví dụ: ảnh, biểu mẫu đăng ký, tệp đính kèm...).
- Đồng thời, ứng dụng vô tình để lộ giá trị Math.random() ra ngoài, chẳng hạn qua header như "x-request-id", "trace-id" hoặc debug log.
- Hacker quan sát những giá trị đó, từ đó tính toán được trạng thái nội bộ của PRNG.
- Họ dùng nó để dự đoán chuỗi boundary trong các lần gửi tiếp theo.
- Sau đó, tạo ra gói tin độc hại chứa boundary chính xác, thêm vào các tham số giả mạo, tiêm dữ liệu độc hại vào hệ thống nội bộ, thậm chí truy cập trái phép vào các API backend.
Mức độ nguy hiểm và phạm vi ảnh hưởng
- Mức độ nghiêm trọng: "Critical" theo thang điểm CVSS v4.
- Ảnh hưởng rộng khắp: Các phiên bản bị ảnh hưởng gồm:
- Dưới 2.5.4
- 3.0.0 đến 3.0.3
- 4.0.0 đến 4.0.3
- Điều kiện khai thác không quá phức tạp nếu ứng dụng để lộ các giá trị ngẫu nhiên.
Giải pháp khuyến nghị cho người dùng:
- Cập nhật ngay gói form-data lên các bản đã vá:
- 4.0.4, 3.0.4 hoặc 2.5.4
- Thay thế Math.random() bằng trình tạo số ngẫu nhiên an toàn, như crypto.randomUUID() hoặc crypto.randomBytes() trong Node.js.
- Kiểm tra toàn bộ codebase để tìm và thay thế các đoạn code sử dụng Math.random() trong các chức năng bảo mật (như token, ID, xác thực…).
- Tránh để lộ thông tin nội bộ (như header chứa trace id) ra ngoài, nếu có dùng PRNG.
Theo Cyber Press