FlawOpen

flawopen.com/XXE/Keamanan parser XML Java

Java XXE: Apakah DocumentBuilderFactory aman secara bawaan?

CWE-611: Improper Restriction of XML External Entity ReferencePanduan referensi Java XML
Jawaban singkat: akses eksternal tidak diblokir secara bawaan

JDK mengaktifkan beberapa batas pemrosesan aman secara bawaan, tetapi konfigurasi DOM dan SAX tidak memblokir akses ke sumber eksternal. XML dapat memicu akses file atau jaringan jika aplikasi tidak membatasinya secara eksplisit. Provider JAXP pihak ketiga juga dapat mengubah perilaku. Konfigurasikan parser yang benar-benar digunakan; jangan menilai keamanan hanya dari versi Java.

TIDAK AMAN
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
    factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

// Java 9+: aktifkan pembatasan JAXP secara eksplisit.
// Jika pengaturan wajib gagal, hentikan dengan aman.
// Parser mungkin mengizinkan akses eksternal secara bawaan.
DIPERKUAT
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newDefaultInstance();

// Jangan uji dengan file atau layanan nyata.
factory.setFeature(
    XMLConstants.FEATURE_SECURE_PROCESSING, true);
factory.setFeature(
    "http://apache.org/xml/features/"
    + "disallow-doctype-decl", true);
factory.setAttribute(
    XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setXIncludeAware(false);

// Batas ukuran diterapkan secara terpisah.
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

Mengapa menolak DOCTYPE menjadi kontrol DOM yang disarankan

Jika didukung parser, menolak DOCTYPE mencegah pemrosesan entitas eksternal dan deklarasi yang didefinisikan dalam DTD. Aktifkan FEATURE_SECURE_PROCESSING secara eksplisit dan batasi akses DTD eksternal sebagai pertahanan tambahan; FSP bawaan JDK tidak berarti koneksi eksternal ditolak. Biarkan XInclude nonaktif kecuali diperlukan. Jika provider menolak pengaturan wajib, gagalkan inisialisasi parser, bukan lanjut dengan perlindungan parsial.

Jika aplikasi harus menerima DTD, jangan izinkan akses eksternal. Nonaktifkan entitas eksternal umum dan parameter serta pemuatan DTD eksternal; setel ACCESS_EXTERNAL_DTD ke string kosong dan pertahankan batas pemrosesan. setExpandEntityReferences(false) mengubah representasi pohon, bukan memblokir sumber eksternal.

Amankan setiap prosesor JAXP secara terpisah

Kebijakan yang sama berlaku pada pemrosesan XML, tetapi kontrolnya berbeda per API. Periksa SAXParserFactory/XMLReader, StAX XMLInputFactory, TransformerFactory, SchemaFactory, Validator, dan JAXB. StAX tidak mendukung FEATURE_SECURE_PROCESSING; nonaktifkan DTD dan entitas eksternal dengan properti tersendiri. Batasi juga schema dan stylesheet eksternal. Gunakan contoh OWASP per API dan verifikasi provider aktif.

Jangan anggap setelan satu parser melindungi seluruh JVM. Pencarian provider JAXP dapat memilih implementasi pihak ketiga; prosesor gabungan juga dapat membuat parser internal. Uji runtime, provider, dan jalur kode yang benar-benar dipakai di produksi.

Pertanyaan umum

Apakah FEATURE_SECURE_PROCESSING memblokir entitas eksternal secara bawaan?

Tidak jika hanya aktif secara bawaan. Oracle menjelaskan bahwa FSP bawaan menerapkan batas pemrosesan, tetapi koneksi eksternal tetap diizinkan sampai FSP diaktifkan eksplisit melalui API atau properti akses eksternal diatur. Tetapkan kebijakan secara eksplisit dan verifikasi provider.

Apakah JDK baru mengubah nilai bawaan?

Rilis JDK menambah pembatasan dan batas pemrosesan, tetapi panduan JAXP Oracle tetap membedakan FSP bawaan dari penolakan akses eksternal eksplisit. Provider pihak ketiga juga dapat berbeda. Tetapkan kontrolnya, jangan bergantung pada versi atau nilai bawaan classpath.

Bagaimana jika dokumen valid memerlukan DTD?

Utamakan katalog atau resolver lokal tepercaya. Jika DTD diperlukan, blokir protokol eksternal dan pemuatan entitas eksternal, pertahankan batas JAXP, dan nonaktifkan XInclude jika tak diperlukan. Kebijakan ini lebih rumit daripada menolak DOCTYPE; uji dengan provider dan dokumen yang diperlukan.

Sumber dan referensi

Lihat juga Injeksi XML External Entity (XXE, CWE-611): cara kerja dan cara mencegahnya — flawopen.com Keamanan XXE XML Python: ElementTree, Expat, lxml Apakah .NET XmlReader aman dari XXE?