XML 외부 항목 삽입 (XXE)

OWASP 카테고리: MASVS-CODE: 코드 품질

개요

XML eXternal Entity 삽입 (XXE)은 XML 입력을 파싱하는 애플리케이션에 대한 공격입니다. XXE 공격은 외부 항목에 대한 참조가 포함된 신뢰할 수 없는 XML 입력이 약하게 구성된 XML 파서에 의해 처리될 때 발생합니다. 이 공격은 서비스 거부, 파일 시스템 액세스, 데이터 무단 반출 등 여러 인시던트를 준비하는 데 사용될 수 있습니다.

영향

애플리케이션이 XML 문서를 파싱할 때 문서에 포함된 DTD (문서 유형 정의, 외부 항목이라고도 함)를 처리할 수 있습니다. 공격자는 DTD로 악성 코드를 삽입하여 이 동작을 악용할 수 있습니다. 그러면 이 코드는 애플리케이션만 액세스할 수 있고 민감한 정보가 포함될 수 있는 기기의 파일 시스템 부분에 액세스할 수 있습니다. 또한 이 악성 코드는 기기에서 요청을 할 수 있어 경계 보안 조치를 우회할 수 있습니다.

마지막으로 애플리케이션이 DTD를 확장하면 참조된 엔티티가 여러 번 반복되는 상황이 발생하여 기기의 리소스가 소진되고 서비스 거부가 발생할 수 있습니다.

완화 조치

DTD 사용 중지

XXE를 방지하는 가장 안전한 방법은 항상 DTD (외부 항목)를 완전히 사용 중지하는 것입니다. 사용 중인 파서에 따라 메서드는 XML Pull Parser 라이브러리의 다음 예와 비슷할 수 있습니다.

자바

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와 항목을 허용하지 않는 안전한 방식으로 구성할 수 있습니다.

리소스