Java: Vì sao không nên deserialize dữ liệu không tin cậy bằng ObjectInputStream?

Đang tìm đáp án

25 lượt xem · 3 trả lời

Cộng đồng đang cùng tìm lời giải

Người đặt câu hỏi có thể chọn câu trả lời hữu ích nhất làm đáp án.

1. 12:37 06/08/2026
Chào admin, Một hệ thống cũ của mình từng dùng Java native serialization để truyền object. Khi đọc tài liệu bảo mật, mình thấy nhiều cảnh báo về deserialization không tin cậy nhưng chưa hiểu rủi ro thực tế và hướng thay thế phù hợp. Nếu cần trao đổi dữ liệu giữa service, mình nên thiết kế format và validate thế nào?
0 Facebook
2. 12:37 06/08/2026
Chào bạn Hân, Native Java deserialization với dữ liệu không tin cậy có thể kích hoạt hành vi ngoài ý muốn thông qua object graph hoặc gadget chain, nên không nên dùng ObjectInputStream như một parser đầu vào công khai. Filtering giúp giảm rủi ro trong hệ thống legacy nhưng không phải lý do để tiếp tục thiết kế mới theo hướng đó. Ưu tiên format dữ liệu rõ ràng như JSON, Protobuf hoặc Avro tùy nhu cầu, với schema hoặc DTO riêng cho boundary. Chỉ parse kiểu dữ liệu mong đợi, giới hạn kích thước/độ sâu payload, validate giá trị nghiệp vụ và không map trực tiếp input vào domain entity nhạy cảm. Thiết lập versioning contract, xác thực/ủy quyền ở transport, dùng TLS và log lỗi parse mà không ghi payload nhạy cảm. Migration từ legacy nên thực hiện theo từng endpoint có test tương thích.
0
3. 13:53 10/10/2026
Trả lời Hân Lê Chào admin, Một hệ thống cũ của mình từng dùng Java native serialization để truyền object. Khi đọc tài liệu bảo mật, mìn…
Việc sử dụng `ObjectInputStream` để deserialize dữ liệu từ các nguồn không đáng tin cậy rất nguy hiểm vì nó cho phép thực thi mã tùy ý; một đối tượng bị thao túng có thể kích hoạt các hàm `readObject`, mở rộng `ObjectInputValidation` hoặc thậm chí tải các lớp từ xa, dẫn đến chiếm quyền điều khiển hoàn toàn. Thay vào đó, hãy sử dụng một định dạng văn bản hoặc nhị phân có cấu trúc với xác thực nghiêm ngặt: JSON (Jackson/Gson) với một schema (ví dụ: JSON Schema), protobuf hoặc Avro cho các cấu trúc có cấu trúc, hoặc XML với XSD. Các định dạng này không cho
0
4. 13:14 12/10/2026
Trả lời Hân Lê Chào admin, Một hệ thống cũ của mình từng dùng Java native serialization để truyền object. Khi đọc tài liệu bảo mật, mìn…
Vấn đề cốt lõi nằm ở cơ chế `readObject` cho phép thực thi code tùy ý trong quá trình khôi phục trạng thái object. Kẻ tấn công chỉ cần gửi một chuỗi byte được chế tác đặc biệt (gadget chain) từ các thư viện phổ biến như Commons Collections hay Spring đang có trên classpath để thực thi lệnh hệ thống (RCE) ngay khi `readObject()` được gọi. Đây không phải lỗi logic mà là thiết kế cho phép dữ liệu điều khiển hành vi chương trình. Thay thế an toàn: Dùng JSON (Jackson/Gson) hoặc Protobuf/Avro với schema chặt chẽ. Chỉ deserialize vào DTO đơn giản (POJO không logic, không interface phức tạp), sau đó validate thủ công (allowlist field, kiểm tra range, regex) trước khi map sang domain object. Tuyệt đối không dùng `ObjectInputStream` cho dữ liệu từ network, file upload hay database có thể bị can thiệp. Ngoài ra, có thể cấu hình `ObjectInputFilter` (Java 9+) để chặn class nguy hiểm như `java.lang.ProcessBuilder` hay các class trong gadget chain đã biết, nhưng đây chỉ là lớp phòng thủ thứ hai. Mình thấy các team thường chủ quan khi dùng thư viện serialization "tiện" cho internal service, bạn thấy nên enforce policy ở gateway hay tại từng service consumer?
0
Vui lòng đăng nhập để tham gia trả lời chủ đề này.
Điều hướng nhanh

Bạn muốn khám phá điều gì?

Tìm chủ đề, bài viết hoặc đi thẳng đến một khu vực của cộng đồng.

Esc để đóng Ctrl K để mở lại