flawopen.com/XXE/Pembaca XML .NET
Apakah XmlReader di .NET aman dari XXE?
Anggap DTD sebagai izin bagi parser untuk mengambil dokumen yang disebutkan dalam XML. XmlReader.Create menolak DTD secara bawaan, jadi dokumen tak tepercaya tidak dapat memakai jalur itu kecuali aplikasi mengaktifkannya. API lama dan framework target juga penting: larang DTD secara eksplisit dan matikan resolusi eksternal pada batas parsing.
// Reader lama yang dipakai langsung dapat mengaktifkan DTD // resolver eksternal dapat mengambil sumber yang dirujuk. var legacy = new XmlTextReader(stream) { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() }; while (legacy.Read()) { } // Mengaktifkan DTD untuk XML tak tepercaya berisiko: var unsafeSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() }; using var reader = XmlReader.Create(stream, unsafeSettings);
var settings = new XmlReaderSettings {
// Tolak setiap dokumen yang memuat DTD.
DtdProcessing = DtdProcessing.Prohibit,
// Pertahanan berlapis: jangan ambil sumber eksternal.
XmlResolver = null,
// Pilih batas sesuai input sah aplikasi.
MaxCharactersInDocument = 1_000_000,
MaxCharactersFromEntities = 1_024,
};
using var reader = XmlReader.Create(stream, settings);
var doc = new XmlDocument { XmlResolver = null };
doc.Load(reader);
API XML dan versi .NET apa yang Anda gunakan?
.NET has several XML APIs whose defaults have differed, and whose defaults have also changed across framework versions. The practical summary:
- ✓XmlReader.Create dengan pengaturan bawaan — nilai bawaan DtdProcessing.Prohibit. Tetapkan secara eksplisit pada batas input tak tepercaya agar perubahan pengaturan nanti tidak diam-diam mengaktifkan DTD.
- ✓XmlReaderSettings.XmlResolver — .NET Framework 4.5.2 mengubah nilai bawaan menjadi null; target lebih lama dapat memakai XmlUrlResolver. Tetapkan null secara eksplisit dan periksa switch kompatibilitas EnableLegacyXmlSettings.
- ✓XmlTextReader — penggunaan langsung API lama ini memiliki default berbeda dan dapat mem-parsing DTD. Pilih XmlReader.Create dengan pengaturan eksplisit; jangan hubungkan resolver jaringan atau berkas ke XML tak tepercaya.
- ✓XmlDocument dan LINQ to XML — perilaku bergantung pada cara pemuatan dan framework target. Berikan XmlReader yang diperkuat dan tetapkan resolver yang tersedia menjadi null.
Perubahan .NET Framework 4.5.2 menetapkan XmlReaderSettings.XmlResolver menjadi null dan menginisialisasi MaxCharactersFromEntities ke 10 juta; perubahan itu tidak menyamakan semua API XML atau konfigurasi. Switch kompatibilitas dapat memulihkan default lama. Tetapkan kebijakan parser secara eksplisit, batasi ukuran dokumen, dan periksa framework target serta konfigurasi runtime yang benar-benar digunakan.
Pertanyaan umum
Ya. XmlReaderSettings.DtdProcessing bernilai bawaan Prohibit dan melempar exception saat menemukan DTD. Tetapkan tetap secara eksplisit dan gunakan XmlResolver = null sebagai pertahanan berlapis.
Demi keamanan, default XmlReaderSettings.XmlResolver menjadi null, dan MaxCharactersFromEntities diinisialisasi ke 10 juta. EnableLegacyXmlSettings dapat memulihkan perilaku lama; periksa konfigurasi deployment, bukan hanya framework target.
Bisa. Format tersebut memuat XML, tetapi dampaknya bergantung pada parser dan pengaturannya. Gunakan reader yang diperkuat untuk setiap titik masuk XML tak tepercaya, batasi ukuran input, dan ikuti panduan keamanan pustaka format terkait.
Sumber dan referensi
- Microsoft Learn — XmlReaderSettings dan pertimbangan keamanan
- Microsoft Learn — perubahan parsing XML .NET Framework 4.5.2
- Microsoft Learn — XmlReader.Create dan resolver
- Microsoft Learn — XmlTextReader.XmlResolver
- OWASP — pencegahan XXE
- CWE-611 — referensi entitas eksternal XML
- Default XXE Java DocumentBuilderFactory