Skip to content

chore: NexusPropertyPage의 DocumentBuilderFactory 외부 엔티티 차단 - #150

Closed
EricSeokgon wants to merge 1 commit into
eGovFramework:mainfrom
EricSeokgon:chore/xxe-nexuspropertypage
Closed

chore: NexusPropertyPage의 DocumentBuilderFactory 외부 엔티티 차단#150
EricSeokgon wants to merge 1 commit into
eGovFramework:mainfrom
EricSeokgon:chore/xxe-nexuspropertypage

Conversation

@EricSeokgon

Copy link
Copy Markdown
Contributor

#138 리뷰에서 @swanpark8538 님이 알려주신 미방어 파서 4번째 항목입니다.

먼저 밝혀둘 점

이 자리(410행)의 파싱 대상은 바로 윗줄에서 생성된 고정 문자열입니다.

String xmlStr = "<repositories>\n\t</repositories>";
...
Document doc = builder.parse(new InputSource(new StringReader(xmlStr)));

외부 입력이 닿지 않으므로 실제 XXE 공격 경로는 없습니다. 사용자 pom.xml 을 읽는 경로는 같은 메서드 앞부분의 XmlUtil.getRootNode() 이며, 그쪽은 #138 에서 이미 차단되었습니다.

그래도 넣는 이유

  • 정적 분석 도구가 설정 없는 DocumentBuilderFactory 를 일괄적으로 검출하므로, 파일 간 방어 수준을 맞춰두면 이후 검토 비용이 줄어듭니다.
  • 나중에 xmlStr 이 사용자 입력을 포함하도록 바뀜 경우에 대한 안전장치가 됩니다.

불필요하다고 판단하시면 닫아도 괜찮습니다. 다만 같은 유형 4건을 모두 올려달라고 하셔서 사실 관계를 붙여 개별 PR 로 올립니다.

회귀 확인

<repositories> 문자열 파싱 결과의 노드 구조는 변경 전후 동일하며, DOCTYPE 이 없는 문서이므로 추가한 설정은 파싱 결과에 영향을 주지 않습니다.

관련: #138

파싱 대상이 고정 문자열이라 실제 공격 경로는 없으나, 동일 유형 설정을 일관되게 적용해 방어를 맞춘다.
swanpark8538 added a commit that referenced this pull request Sep 8, 2026
…요소를 직접 만들도록 변경

performOk 는 pom.xml 에 <repositories> 가 없고 <dependencies> 는 있을 때,
코드 안의 고정 문자열 "<repositories>\n\t</repositories>" 를 설정 없는
DocumentBuilderFactory 로 파싱한 뒤 importNode 로 옮겨 dependencies 앞에
끼워 넣었다. 외부 입력이 닿지 않아 XXE 경로는 없지만, 상수 하나를 만들기 위해
XML 파서를 만드는 자리라 정적 분석에 무방어 파서로 검출되었고(#150),
방어 설정을 덧붙이면 다른 파일과 같은 인라인 복사본이 하나 더 생긴다.

ownerDoc.createElement 와 createTextNode 로 같은 요소를 직접 만들어 파서와
관련 import 를 없앤다. 기존 방식과 새 방식이 같은 DOM 을 만드는 것을
직렬화 결과 비교로 확인했다. 주석 처리된 채 남아 있던 preValueText 두 줄도
함께 제거한다.

Refs: #150
@swanpark8538

Copy link
Copy Markdown
Collaborator

검토 결과를 공유드리고 이 PR 은 닫으려고 합니다.

말씀하신 대로 이 자리는 고정 문자열 를 파싱하는 곳이라 XXE 경로는 없습니다. 그런데 이번에 core XmlUtil 에 newSecureDocumentBuilderFactory() 를 추가하면서 인라인 방어 설정을 모두 그쪽으로 모았기 때문에(cf1407b), 같은 4줄을 이 파일에 또 넣는 것보다는 상수 하나를 만들기 위해 XML 파서를 쓰는 구조 자체를 없애는 편이 낫다고 판단했습니다. fdf297a 에서 ownerDoc.createElement("repositories") 로 요소를 직접 만들도록 바꿔 DocumentBuilderFactory 와 관련 import 를 제거했고, 기존 방식과 같은 DOM 이 만들어지는 것을 확인했습니다. 정적 분석 경고도 함께 사라집니다.

같은 유형 4건을 모두 개별 PR 로 올려 주신 덕분에 번들별로 정리할 수 있었습니다. 감사합니다.

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.

2 participants