lxml XMLParser의 안전하지 않은 옵션 사용

신뢰할 수 없는 XML을 처리할 때 외부 엔티티와 불필요한 파서 기능을 비활성화하세요.

설명

lxml.etree.XMLParser에서 외부 엔티티 해석, DTD 로드, 네트워크 접근, 과도한 트리 크기 허용 같은 옵션을 켜면 신뢰할 수 없는 XML 입력을 처리할 때 XXE, SSRF, 로컬 파일 노출, 메모리 고갈 공격에 노출될 수 있습니다.

잠재적 영향

  • XML 외부 엔티티를 통해 로컬 파일이나 내부 네트워크 리소스가 노출될 수 있습니다.
  • DTD와 네트워크 로드로 SSRF가 발생할 수 있습니다.
  • huge_tree=True 사용 시 큰 XML 입력으로 메모리 고갈이 발생할 수 있습니다.

해결 방법

  • resolve_entities=False, load_dtd=False, no_network=True를 명시합니다.
  • 필요하지 않다면 huge_tree=True를 사용하지 않습니다.
  • 신뢰할 수 없는 XML은 하드닝된 파서 설정으로만 처리합니다.
  • 가능하면 XML 대신 JSON 같은 더 단순한 데이터 형식 사용을 검토합니다.

예시

변경 전

python
from flask import request
from lxml import etree

def bad_parse():
    xml_body = request.get_data()
    parser = etree.XMLParser(resolve_entities=True, load_dtd=True)
    return etree.fromstring(xml_body, parser=parser)

변경 후

python
from flask import request
from lxml import etree

def safe_parse():
    xml_body = request.get_data()
    parser = etree.XMLParser(resolve_entities=False, load_dtd=False, no_network=True)
    return etree.fromstring(xml_body, parser=parser)

설명:

  • 변경 전: 외부 엔티티와 DTD 로드를 허용한 파서로 사용자 XML을 처리합니다.
  • 변경 후: 외부 엔티티, DTD, 네트워크 접근을 비활성화한 파서를 사용합니다.

참조