FlawOpen

flawopen.com/XXE/Pembaca XML .NET

Apakah XmlReader di .NET aman dari XXE?

CWE-611: XML External Entity ReferenceJawaban singkat
Jawaban singkat

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.

TIDAK AMAN — pola lama atau yang dilemahkan
// 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);
DIPERKUAT — larang DTD dan sumber eksternal
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:

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

Apakah XmlReader.Create melarang DTD secara bawaan?

Ya. XmlReaderSettings.DtdProcessing bernilai bawaan Prohibit dan melempar exception saat menemukan DTD. Tetapkan tetap secara eksplisit dan gunakan XmlResolver = null sebagai pertahanan berlapis.

Apa yang berubah pada .NET Framework 4.5.2?

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.

Apakah ini berdampak pada parsing SOAP, SAML, atau dokumen Office?

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

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