Skip to content

XmlUtil의 XML 외부 엔티티(XXE) 취약점 수정 - #138

Open
EricSeokgon wants to merge 1 commit into
eGovFramework:mainfrom
EricSeokgon:fix/xmlutil-xxe
Open

XmlUtil의 XML 외부 엔티티(XXE) 취약점 수정#138
EricSeokgon wants to merge 1 commit into
eGovFramework:mainfrom
EricSeokgon:fix/xmlutil-xxe

Conversation

@EricSeokgon

Copy link
Copy Markdown
Contributor

수정 사유 Reason for modification

  • 버그수정 Bug fixes (보안 취약점, CWE-611 XXE)
  • 기능개선 Enhancements
  • 기능추가 Adding features
  • 기타 Others

수정된 소스 내용 Modified source

XmlUtil이 XML을 파싱할 때 DocumentBuilderFactory에 외부 엔티티 차단 설정을 하지 않아 XXE(XML External Entity Injection, CWE-611) 에 노출됩니다. 미방어 지점은 정적 팩토리 2개(45·46행)와 지역 인스턴스 3개(186·204·227행, 수정 전 기준)입니다.

XmlUtil은 이 저장소의 6개 플러그인에서 호출되며, 그중 HandlePomXMLFileUtil은 프로젝트의 pom.xml을 파싱합니다. 따라서 외부 엔티티가 포함된 XML(예: 악의적 pom.xml)이 든 프로젝트를 IDE로 열면 개발자 PC의 로컬 파일이 읽히거나 외부 URL 요청이 발생할 수 있습니다.

수정 내용

이 저장소는 이미 같은 방어 패턴을 갖고 있습니다 — egovframework.dev.imp.commngtComResourceUtils.java 213행이 setFeature 계열로 외부 엔티티를 차단합니다. 이 PR은 그 패턴을 XmlUtil에 맞춰 넣는 것으로 새 규칙을 도입하지 않습니다.

applyXxeProtection(DocumentBuilderFactory, boolean) private 헬퍼를 추가하고 5개 파싱 지점에 적용했습니다(+33/−0). 외부 일반/파라미터 엔티티를 차단해 검증 여부와 무관하게 XXE 파일 읽기를 막습니다. 스키마 검증용 vfactory(validating=true)는 DTD 로딩이 필요하므로 외부 엔티티 차단만 적용하고, 비검증 파서에는 외부 DTD 로딩 차단과 FEATURE_SECURE_PROCESSING까지 적용했습니다. 파서가 특정 기능을 미지원하면 ParserConfigurationException을 무시하고 나머지 방어를 적용합니다.

JUnit 테스트 JUnit tests

  • JUnit 테스트 JUnit tests
  • 수동 테스트 Manual testing

빌드: 번들된 lib/xalan.jar를 클래스패스로 javac 단독 컴파일 성공(JDK 21, 오류 0).

재현·검증 (수정 전/후 동일 하네스, JDK 21.0.10 — applyXxeProtection의 실제 로직을 복제해 실행). 공격 XML(<!DOCTYPE r [ <!ENTITY xxe SYSTEM "file://…"> ]>)로 로컬 파일 읽기를 시도:

파서 수정 전 수정 후
비검증(non-validating) 파일 유출 v=[TOP-SECRET-EGOV-2026] 차단 v=[]
검증(validating) 파일 유출 v=[TOP-SECRET-EGOV-2026] 차단 v=[]

정상 XML 회귀 확인(파싱은 계속 동작해야 함):

파서 수정 후
비검증 v=[정상데이터] (정상)
검증 v=[정상데이터] (정상)

수정 후 외부 엔티티는 빈 값으로 무력화되고, 정상 XML 파싱과 스키마 검증 경로는 그대로 동작합니다.

테스트 브라우저 Test Browser

  • 기타 Others — UI 변경 없음. XML 파서 설정만 수정했으며 위 하네스로 검증했습니다.

테스트 스크린샷 또는 캡처 영상 Test screenshots or captured video

UI 변경이 없어 스크린샷은 해당하지 않습니다. 위 표의 실측값을 근거로 제시합니다.


참고 — 같은 저장소의 동일 유형 (이 PR 범위 밖): 근본 원인이 같은 XXE 미방어 지점이 dev/mdev ComResourceUtils(각 2곳, 같은 파일의 다른 지점은 이미 방어됨), NexusPropertyPage, QueryIdSearchJob에도 있습니다. 이 PR은 호출자가 가장 많은 XmlUtil 한 파일로 범위를 한정했으며, 나머지도 동일 방식으로 후속 정리할 수 있습니다. 필요하시면 이 PR에 합치겠습니다.

DocumentBuilderFactory에 외부 엔티티 차단 설정을 추가해 CWE-611(XXE)을 방지한다. 정적 팩토리 2개와 지역 인스턴스 3개에 applyXxeProtection 헬퍼를 적용했으며, 저장소 자체 방어 패턴(ComResourceUtils:213)과 동형이다. 검증 파서는 DTD 로딩을 유지하도록 외부 엔티티만 차단한다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant