
Apache Camel camel-smooks의 XXE(CWE-611) 취약점인 CVE-2026-88901을 재현하는 실행 가능한 Spring Boot 개념 증명으로, 취약 버전과 패치 버전의 대조 실행을 포함합니다.
Smooks 데이터 포맷(.unmarshal().smooks(...))과 Smooks 컴포넌트(smooks:)가 수신 XML 본문을 Smooks가 기본적으로
해석하는 리더(Woodstox SAX 파서)로 파싱하여 외부 일반 엔티티와 파라미터 엔티티를 해석하고 외부 DTD를 로드하며,
camel-smooks는 다른 Camel XML 컴포넌트들이 적용하는 파서 강화 조치를 전혀 적용하지 않았던 Apache Camel 취약점에 대한
실행 가능한 개념 증명 재현기입니다. 따라서 XML 문서에 선언된 외부 서브셋을 가진 DOCTYPE 또는 외부 일반 엔티티는
본문이 언마샬링되는 동안 해석되고 확장되며, 해석된 내용은 결과에 바인딩됩니다. XML이 camel-smooks 데이터 포맷이나
엔드포인트에 도달하는 외부 발신자는 Camel 프로세스가 읽을 수 있는 파일을 읽거나, 프로세스가 내부 호스트로 요청을
보내도록 만들 수 있습니다(CWE-611). 기본값이 아닌 옵션은 필요하지 않습니다 — 외부 엔티티 해석이 기본 동작이었습니다.
Spring Boot 전용. 이 재현기는 단일 Camel Spring Boot 모듈을 제공합니다.
camel-smooks에는camel-quarkus-smooks확장이 없으므로 재현할 Quarkus 대응물이 없습니다. Spring Boot 모듈은 영향을 받는 동작 및 수정된 동작을 보여줍니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smooks 4.22.0 (영향받음; 4.22.1에서 수정) |
드라이버는 수정 사항 자체의 회귀 테스트(SmooksDataFormatXmlSecurityTest)를 그대로 따릅니다. 무해한 마커 파일이
임시 디렉터리에 작성되고, XML <customer> 문서가 기본 smooks-config.xml(문서를 Customer 빈으로 바인딩)과 함께
실제 SmooksDataFormat을 통해 언마샬링됩니다. 문서의 firstName은 마커 파일을 가리키는 외부 엔티티입니다:
<!DOCTYPE customer [<!ENTITY xxe SYSTEM "file:///…/secret.txt">]>
<customer><firstName>&xxe;</firstName>…</customer>
Customer.firstName에 바인딩됩니다 — 파일이
언마셜된 빈으로 유출됩니다.DocumentBuilder(외부 엔티티 및 외부 DTD 로딩
비활성화)로 사전 파싱되므로, 엔티티가 해석되지 않고 마커가 절대 나타나지 않습니다.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: firstName = the marker file content; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-88901-smooks-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: firstName null, marker not leaked; >>> Not exploited
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-smooks (Smooks 데이터 형식 및 구성 요소) |
| CWE | CWE-611 (XML 외부 엔티티 참조의 부적절한 제한) |
| 심각도 | HIGH |
| 공격 벡터 | 외부 발신자가 기본 XML 리더를 사용하는 camel-smooks 데이터 형식 또는 엔드포인트에 의해 언마샬링되는 XML 메시지 본문을 제공함 |
| 영향 | Camel 프로세스가 읽을 수 있는 로컬 파일 읽기; 문서에 명시된 내부 호스트로의 SSRF |
| 영향받는 버전 | 4.7.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24677 |
| 보고자 | h1ei1 |
권고문: https://camel.apache.org/security/CVE-2026-88901.html
camel-smooks는 이제 FEATURE_SECURE_PROCESSING이 설정되고 외부 일반 엔티티, 외부 파라미터 엔티티 및 외부 DTD 로딩이 비활성화된 javax.xml.parsers.DocumentBuilder로 신뢰할 수 없는 XML을 사전 파싱한 후, 그 결과로 생성된 DOM을 Smooks에 전달합니다. 이는 XmlConverter 및 기타 Camel XML 구성 요소에서 사용하는 보안 구성과 일치합니다. 이 강화 조치는 Smooks 구성이 기본 리더로 XML을 파싱할 때만 적용됩니다(따라서 EDI, CSV, JSON 및 사용자 정의 리더 구성과 마샬링 방향은 변경되지 않음). 기본적으로 비활성화된 새로운 allowExternalEntities 옵션은 신뢰할 수 있는 레거시 구성에 대해 이전 동작을 복원합니다.
신뢰할 수 없는 발신자로부터 수신한 XML에는 camel-smooks를 적용하지 마십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다. 즉, Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 확인할 수 있도록 돕기 위한 것입니다. "secret" 파일은 재현 프로그램 자체가 임시 디렉터리에 생성하며 무해한 마커 문자열만 포함합니다. 이 파일은 검사 후 삭제됩니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.