보안 설정 오류 - XXE 상세 정보
“XML 외부 엔티티”(XXE) 취약점은 XML 파서와 관련된 보안 설정 오류의 한 유형입니다.
XML 표준에는 파일이나 URL과 같은 “엔티티”를 참조하는 방법이 포함되어 있습니다. 파서가 외부 엔티티를 완전히 해석하도록 설정된 경우가 많아, 공격자가 XML 문서를 통해 파일이나 기타 민감한 정보를 탈취할 위험이 있습니다.
간단한 예시
외부 엔티티를 사용하는 XML 문서의 예시를 살펴보겠습니다.
xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
<!ENTITY externalEntity SYSTEM "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>
먼저 문서 내에 존재할 수 있고 파서가 처리할 수 있는 구조 및 요소 유형을 정의하는 ‘doctype’을 선언합니다.
그 안에서 ‘externalEntity’라는 SYSTEM 유형의 엔티티를 지정합니다. 이 엔티티는 ‘/etc/passwd’ 파일을 가리킵니다.
‘doctype’ 정의 다음에는 실제 XML 데이터가 옵니다. ‘outerElement’를 정의한 후, ‘&’ 기호를 사용하여 ‘externalEntity’ 엔티티에 대한 참조를 추가합니다.
이 시점에서 인터프리터는 엔티티 정의를 찾아 URL을 해석하고, 그 결과를 ‘&externalEntity;’ 위치에 삽입합니다.
파싱 과정이 끝나면 다음과 같은 형태의 문서가 생성됩니다.
xml
<?xml version="1.0" ?>
<outerElement>
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
....
</outerElement>
완화 방법
XXE로부터 완벽하게 보호하기 위한 구체적인 방법은 사용하는 언어, 프레임워크 및 버전에 따라 크게 달라집니다.
각 조합에 따라 파일 해석을 방지하기 위해 파서의 일부 기능을 비활성화할 수 있지만, HTTP 경로까지 차단하지 못할 수도 있습니다. 또는 엔티티 확장이 여전히 허용되어 그 자체로 서비스 거부(DoS) 취약점으로 이어질 수도 있습니다.
.NET
.NET 4.5.1 이하 버전을 사용하는 경우, 다음 클래스들이 기본적으로 취약합니다.
- XmlDocument (‘xmlDocument.XmlResolver = null;’로 비활성화)
- XmlTextReader (‘xmlTextReader.ProhibitDtd = true;’로 비활성화)
- XPathNavigator
실무에 바로 적용하는 보안 코딩
OWASP Top 10과 같은 소프트웨어 취약점을 이해하고 완화하기 위한 보안 코딩 가이드라인을 살펴보고, 실제 앱 시뮬레이션을 통해 실습할 수 있는 가이드형 교육 미션을 시작해 보세요.