FlawOpen

flawopen.com/XXE/.NET XML 리더

.NET의 XmlReader는 XXE에 안전한가요?

CWE-611: XML External Entity Reference짧은 답변
짧은 답변

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);
보강됨 — DTD와 외부 리소스 거부
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:

.NET Framework 4.5.2 변경으로 XmlReaderSettings.XmlResolver 기본값은 null이 됐고 MaxCharactersFromEntities는 초기화 시 1,000만으로 설정됐습니다. 모든 XML API나 설정이 같아진 것은 아닙니다. 호환성 스위치가 이전 기본값을 복원할 수 있습니다. 파서 정책을 명시하고 문서 크기를 제한하며 실제 대상 프레임워크와 런타임 설정을 확인하세요.

자주 묻는 질문

XmlReader.Create는 기본적으로 DTD를 금지하나요?

네. XmlReaderSettings.DtdProcessing의 기본값은 Prohibit이며 DTD를 만나면 예외를 발생시킵니다. 그래도 명시적으로 설정하고 심층 방어를 위해 XmlResolver = null을 사용하세요.

.NET Framework 4.5.2에서 무엇이 바뀌었나요?

보안을 위해 XmlReaderSettings.XmlResolver 기본값이 null이 됐으며 MaxCharactersFromEntities는 1,000만으로 초기화됩니다. EnableLegacyXmlSettings가 이전 동작을 복원할 수 있으므로 대상 프레임워크뿐 아니라 배포 설정도 확인하세요.

SOAP, SAML 또는 Office 문서 파싱에도 영향이 있나요?

영향이 있을 수 있습니다. 이런 형식에는 XML이 포함되지만 결과는 파서와 설정에 따라 다릅니다. 신뢰할 수 없는 XML 입력마다 강화된 reader를 사용하고 입력 크기를 제한하며 형식 라이브러리의 보안 지침도 따르세요.

출처 및 참고 자료

함께 보기 XML 외부 엔터티(XXE) 인젝션(CWE-611): 동작 원리와 방어 방법 — flawopen.com Java XXE: DocumentBuilderFactory는 기본적으로 안전한가요? Python XML XXE 보안: ElementTree, Expat, lxml