fix: PomParser의 XML 외부 엔티티(XXE) 취약점 수정 - #147
Conversation
SAXBuilder가 외부 엔티티를 해석하지 않도록 EntityResolver와 파서 feature를 설정한다. 내부 엔티티 치환과 정상 pom.xml 파싱 결과는 기존과 동일하다.
PR #147 은 PomParser 에만 외부 엔티티 차단을 인라인으로 넣었고, 같은 번들에서 같은 호출 경로(TableList)로 사용자 프로젝트의 services.xml 과 사용자가 입력한 경로의 파일을 읽는 ServicesParser 는 기본 SAXBuilder 로 남아 있어 오염된 services.xml 로 로컬 파일 읽기·SSRF(CWE-611) 가 여전히 가능했다. 방어 설정을 egovframework.rte.rdt.xml.SecureSAXBuilder 로 올리고 두 파서가 함께 쓰도록 한다. JDOM 1.1.1 의 SAXBuilder.setFeature 는 값을 저장만 하고 build() 시점에 파서가 인식하지 못하는 feature 를 JDOMException 으로 바꾸므로, Xerces 계열이 아닌 SAX 드라이버에서는 Apache 전용 feature 때문에 정상 문서까지 파싱에 실패했다. 이를 피해 configureParser 에서 XMLReader 에 직접 적용하면서 미인식 feature 는 건너뛴다. 외부 일반 엔티티는 JDOM 이 external-general-entities feature 를 expandEntities 값으로 덮어쓰므로 빈 스트림을 돌려주는 EntityResolver 로 차단하며, 내부 엔티티 치환은 기존과 동일하게 동작한다. Refs: #147
|
PR #138에 이어 추가 PR을 해 주셔서 감사합니다. 리뷰 과정에서 확인한 내용과 후속 조치를 공유드립니다.
또한, JDOM 1.1.1의 두 가지를 함께 처리하기 위해 이번 PR의 방어 설정을 전자정부 표준프레임워크에 기여해 주셔서 감사합니다. |
문제
PomParser.parse(File)는 사용자 workspace 의pom.xml을 JDOMSAXBuilder로 파싱하면서 외부 엔티티 처리를 제한하지 않습니다. 오염된pom.xml을 가진 프로젝트를 IDE 로 열면 XXE(CWE-611) 로 로컬 파일 읽기·SSRF 가 가능합니다.#138 리뷰에서 @swanpark8538 님이 알려주신 동일 유형의 미방어 파서 중 하나이며, 요청하신 대로 개별 PR 로 분리했습니다.
변경
EntityResolver설정external-parameter-entities,nonvalidating/load-external-dtd비활성화JDOM 특이사항 (실측)
DOM 계열과 달리
SAXBuilder.setFeature("http://xml.org/sax/features/external-general-entities", false)는 효과가 없습니다. JDOM 1.1.1 의 SAXBuilder 가 파서를 구성할 때 이 feature 를expandEntities값(기본 true)으로 덮어쓰기 때문입니다. 그래서EntityResolver로 차단했습니다.secret-file-content(유출)secret-file-content(차단 실패)검증
egovframework.rte.rdt의 pom 패키지를lib/jdom.jar(1.1.1) 와 함께 컴파일하고, 변경 전/후PomParser.parse()를 실제 pom.xml 3종으로 실행해 비교했습니다.<!ENTITY egovVer "9.9.9-ENT">): version 이9.9.9-ENT로 기존과 동일하게 치환 — XmlUtil의 XML 외부 엔티티(XXE) 취약점 수정 #138 리뷰에서 지적해 주신setExpandEntityReferences(false)류의 부작용은 없습니다<!ENTITY xxe SYSTEM "file:///...">): 기존secret-file-content→ 변경 후 빈 값참고
원본 파일 끝에 개행이 없어 GitHub 웹 편집기가 저장하면서 EOF 개행 1줄을 자동으로 추가했습니다(diff 의
\ No newline at end of file항목). 코드 변경은 아닙니다.관련: #138