flawopen.com/XXE/.NET XML 리더
.NET의 XmlReader는 XXE에 안전한가요?
DTD는 파서가 XML에 적힌 문서를 가져오도록 허용하는 통행증과 같습니다. XmlReader.Create는 기본적으로 DTD를 거부하므로 앱이 켜지 않는 한 신뢰할 수 없는 문서는 이 경로를 사용할 수 없습니다. 레거시 API와 대상 프레임워크도 중요합니다. DTD를 명시적으로 금지하고 파싱 경계에서 외부 해석을 끄세요.
// 직접 사용한 레거시 reader는 DTD 파싱을 켤 수 있습니다 // 외부 resolver는 참조된 리소스를 가져올 수 있습니다. var legacy = new XmlTextReader(stream) { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() }; while (legacy.Read()) { } // 신뢰할 수 없는 XML에서 DTD를 켜는 것은 위험합니다: var unsafeSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() }; using var reader = XmlReader.Create(stream, unsafeSettings);
var settings = new XmlReaderSettings {
// DTD가 있는 문서는 모두 거부합니다.
DtdProcessing = DtdProcessing.Prohibit,
// 심층 방어: 외부 리소스를 가져오지 않습니다.
XmlResolver = null,
// 앱의 정상 입력에 맞춰 한도를 선택하세요.
MaxCharactersInDocument = 1_000_000,
MaxCharactersFromEntities = 1_024,
};
using var reader = XmlReader.Create(stream, settings);
var doc = new XmlDocument { XmlResolver = null };
doc.Load(reader);
어떤 XML API와 .NET 버전을 사용하나요?
.NET has several XML APIs whose defaults have differed, and whose defaults have also changed across framework versions. The practical summary:
- ✓기본 설정의 XmlReader.Create — 기본값은 DtdProcessing.Prohibit입니다. 나중에 설정이 바뀌어 DTD가 뜻하지 않게 켜지지 않도록 신뢰할 수 없는 입력 경계에서 명시하세요.
- ✓XmlReaderSettings.XmlResolver — .NET Framework 4.5.2에서 기본값이 null로 변경됐습니다. 이전 대상은 XmlUrlResolver를 사용할 수 있었습니다. null을 명시하고 EnableLegacyXmlSettings 호환성 스위치를 확인하세요.
- ✓XmlTextReader — 이 레거시 API를 직접 사용하면 기본 동작이 다르고 DTD를 파싱할 수 있습니다. 명시적 설정이 있는 XmlReader.Create를 사용하고 신뢰할 수 없는 XML에 네트워크나 파일 resolver를 연결하지 마세요.
- ✓XmlDocument 및 LINQ to XML — 동작은 로드 방식과 대상 프레임워크에 따라 다릅니다. 강화된 XmlReader를 전달하고 사용 가능한 resolver는 null로 설정하세요.
.NET Framework 4.5.2 변경으로 XmlReaderSettings.XmlResolver 기본값은 null이 됐고 MaxCharactersFromEntities는 초기화 시 1,000만으로 설정됐습니다. 모든 XML API나 설정이 같아진 것은 아닙니다. 호환성 스위치가 이전 기본값을 복원할 수 있습니다. 파서 정책을 명시하고 문서 크기를 제한하며 실제 대상 프레임워크와 런타임 설정을 확인하세요.
자주 묻는 질문
네. XmlReaderSettings.DtdProcessing의 기본값은 Prohibit이며 DTD를 만나면 예외를 발생시킵니다. 그래도 명시적으로 설정하고 심층 방어를 위해 XmlResolver = null을 사용하세요.
보안을 위해 XmlReaderSettings.XmlResolver 기본값이 null이 됐으며 MaxCharactersFromEntities는 1,000만으로 초기화됩니다. EnableLegacyXmlSettings가 이전 동작을 복원할 수 있으므로 대상 프레임워크뿐 아니라 배포 설정도 확인하세요.
영향이 있을 수 있습니다. 이런 형식에는 XML이 포함되지만 결과는 파서와 설정에 따라 다릅니다. 신뢰할 수 없는 XML 입력마다 강화된 reader를 사용하고 입력 크기를 제한하며 형식 라이브러리의 보안 지침도 따르세요.