Danh mục OWASP: MASVS-CODE: Chất lượng mã
Tổng quan
XML eXternal Entity injection (XXE) là một cuộc tấn công nhằm vào các ứng dụng phân tích cú pháp đầu vào XML. Tấn công XXE xảy ra khi đầu vào XML không đáng tin cậy có tham chiếu đến một thực thể bên ngoài được xử lý bằng một trình phân tích cú pháp XML được định cấu hình yếu. Cuộc tấn công này có thể được dùng để dàn dựng nhiều sự cố, bao gồm cả từ chối dịch vụ, truy cập vào hệ thống tệp hoặc đánh cắp dữ liệu.
Tác động
Khi phân tích cú pháp một tài liệu XML, ứng dụng có thể xử lý mọi DTD (Định nghĩa loại tài liệu, còn được gọi là thực thể bên ngoài) có trong tài liệu. Kẻ tấn công có thể khai thác hành vi này bằng cách chèn mã độc dưới dạng DTD. Sau đó, mã này có thể truy cập vào các phần của hệ thống tệp trên thiết bị, chỉ có thể truy cập vào ứng dụng và có khả năng chứa dữ liệu nhạy cảm. Hơn nữa, mã độc này có thể đưa ra các yêu cầu từ thiết bị, có khả năng bỏ qua các biện pháp bảo mật chu vi.
Cuối cùng, nếu ứng dụng mở rộng DTD, điều này có thể tạo ra tình huống có nhiều lần lặp lại của các thực thể được tham chiếu, làm cạn kiệt tài nguyên của thiết bị và dẫn đến tình trạng từ chối dịch vụ.
Giải pháp giảm thiểu
Tắt DTD
Cách an toàn nhất để ngăn chặn XXE là luôn tắt hoàn toàn DTD (thực thể bên ngoài). Tuỳ thuộc vào trình phân tích cú pháp đang được sử dụng, phương thức này có thể tương tự như ví dụ sau đây cho thư viện Trình phân tích cú pháp kéo XML:
Java
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
Kotlin
val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
Việc tắt DTD cũng giúp trình phân tích cú pháp bảo mật trước các cuộc tấn công từ chối dịch vụ. Nếu không thể tắt hoàn toàn DTD, thì các thực thể bên ngoài và khai báo loại tài liệu bên ngoài phải bị vô hiệu hoá theo cách dành riêng cho từng trình phân tích cú pháp.
Do số lượng lớn các công cụ phân tích cú pháp XML trên thị trường, các cách ngăn chặn các cuộc tấn công XXE khác nhau giữa các công cụ. Bạn có thể cần tham khảo tài liệu về công cụ để biết thêm thông tin.
Thực hiện quy trình làm sạch dữ liệu đầu vào
Bạn nên định cấu hình lại ứng dụng để ứng dụng không cho phép người dùng chèn mã tuỳ ý vào phần mở đầu của tài liệu XML. Bạn phải xác minh phía máy chủ, vì các chế độ kiểm soát phía máy khách có thể bị bỏ qua.
Sử dụng một thư viện khác
Nếu không thể định cấu hình thư viện hoặc phương thức được sử dụng theo cách an toàn, bạn nên cân nhắc sử dụng một thư viện hoặc phương thức khác. Bạn có thể định cấu hình cả Trình phân tích cú pháp kéo XML và Trình phân tích cú pháp SAX theo cách an toàn, không cho phép DTD và thực thể.
Tài nguyên
- OWASP XXE
- Bản tóm tắt về cách ngăn chặn XXE của OWASP
- Hằng số XML: FEATURE_SECURE_PROCESSING
- Trình phân tích cú pháp kéo XML
- Trình phân tích cú pháp SAX