OWASP 카테고리: MASVS-CODE: 코드 품질
개요
XML 외부 항목 삽입 (XXE)은 XML 입력을 파싱하는 애플리케이션에 대한 공격입니다. XXE 공격은 외부 항목 참조가 포함된 신뢰할 수 없는 XML 입력이 약하게 구성된 XML 파서에 의해 처리될 때 발생합니다. 이 공격은 서비스 거부, 파일 시스템 액세스, 데이터 유출을 비롯한 여러 사고를 조정하는 데 사용할 수 있습니다.
영향
애플리케이션은 XML 문서를 파싱할 때 문서에 포함된 모든 DTD (문서 유형 정의, 외부 항목이라고도 함)를 처리할 수 있습니다. 공격자는 악성 코드를 DTD로 삽입하여 이 동작을 악용할 수 있습니다. 그러면 이 코드는 애플리케이션에서만 액세스할 수 있고 민감한 데이터가 포함될 수 있는 기기의 파일 시스템 부분에 액세스할 수 있습니다. 또한 이 악성 코드는 기기에서 요청을 실행하여 경계 보안 조치를 우회할 수 있습니다.
마지막으로 애플리케이션이 DTD를 확장하면 참조된 항목이 여러 번 반복되는 상황이 발생하여 기기의 리소스가 소진되고 서비스 거부가 발생할 수 있습니다.
완화 조치
DTD 사용 중지
XXE를 방지하는 가장 안전한 방법은 항상 DTD (외부 항목)를 완전히 사용 중지하는 것입니다. 사용 중인 파서에 따라 메서드는 XML 풀 파서 라이브러리의 다음 예와 유사할 수 있습니다.
자바
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
Kotlin
val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
DTD를 사용 중지하면 서비스 거부 공격으로부터 파서를 보호할 수도 있습니다. DTD를 완전히 사용 중지할 수 없다면 외부 항목 및 외부 문서 유형 선언을 각 파서에 고유한 방식으로 사용 중지해야 합니다.
시장에 나와 있는 XML 파싱 엔진이 많기 때문에 XXE 공격을 방지하는 방법은 엔진마다 다릅니다. 자세한 내용은 엔진 문서를 참고하세요.
입력 정리 수행
사용자가 XML 문서의 선언부에 임의의 코드를 삽입할 수 없도록 애플리케이션을 재구성해야 합니다. 클라이언트 측 제어는 우회될 수 있으므로 서버 측에서 확인해야 합니다.
다른 라이브러리 사용
사용되는 라이브러리 또는 메서드를 안전하게 구성할 수 없는 경우 다른 라이브러리 또는 메서드를 고려해야 합니다. XML 풀 파서와 SAX 파서는 모두 DTD 및 항목을 허용하지 않는 안전한 방식으로 구성할 수 있습니다.