
CVE-2026-95628에 대한 실행 가능한 개념 증명 재현기로, Apache Camel camel-docling의 절대 경로 검증 공백을 다루며 Spring Boot 및 Quarkus 하네스와 수정 검증을 포함합니다.
validatePathSafety가 절대 경로를 거부하지 못함 (CVE-2026-40047의 불완전한 수정)Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 프로그램으로, CVE-2026-40047의 수정 사항에서 도입된 사용자 정의 인자 경로 검사가 상대 경로 순회만 탐지했던 문제를 다룹니다. 이 검사는 ../를 포함하는 값과 정규화된 형태에 여전히 .. 요소가 남아 있는 값을 거부했지만, 값이 절대 경로인지 여부는 확인하지 않았으며, 순회 세그먼트가 없는 절대 경로에는 두 가지 모두 포함되지 않습니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.1 |
| Camel Quarkus | camel-quarkus/ | Camel Quarkus 3.39.0 (Quarkus 3.39.0, Camel 4.22.0) |
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until [ "$(curl -s http://localhost:8080/exploit/ready)" = "Started" ]; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down
영향을 받는 빌드에서의 출력(두 런타임 모두 동일):
1) A relative traversal value, which the CVE-2026-40047 fix does reject
header CamelDoclingCustomArguments = [--artifacts-path, ../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
2) Traversal hidden behind redundant separators - also rejected (normalized first)
header CamelDoclingCustomArguments = [--artifacts-path, models/./../../../../etc]
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 contains a relative path traversal sequence
3) An ABSOLUTE path, which contains no traversal sequence at all
header CamelDoclingCustomArguments = [--artifacts-path, /etc]
argv docling received: --artifacts-path /etc --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
4) The same, attached to the flag after an equals sign
header CamelDoclingCustomArguments = [--artifacts-path=/root/.ssh]
argv docling received: --artifacts-path=/root/.ssh --to md --ocr-lang en --output /tmp/docling-... /tmp/docling-.../docling-....tmp
>>> PROVEN: ...
프로브 1과 2는 CVE-2026-40047 수정이 제 역할을 하고 있음을 보여준다. 프로브 3과 4가 바로 그 빈틈이다. 해당 플래그는 그 수정의 허용 목록에 포함되어 있으며(--artifacts-path는 docling에게 모델 아티팩트를 찾을 위치를 알려준다), 그리고 그 값은 두 가지 인자 형태 모두에서 그대로 통과한다 — 플래그 뒤에 오는 별도의 목록 요소, 그리고 = 뒤에 붙는 형태. 따라서 커스텀 인자를 선택할 수 있는 주체는 docling 프로세스를 Camel 프로세스가 접근할 수 있는 임의의 디렉터리로 향하게 할 수 있으며, 이는 검사가 경로 값을 가두려 했던 작업 디렉터리 밖이다. 이는 앞선 수정이 방지하려 했던 바로 그 결과이다.
docling 설치가 필요 없다. 결함은 Camel이 빌드하는 명령줄에 있으므로, 엔드포인트의 doclingCommand 옵션은 CLI를 대신하는 기록용 스탠드인을 가리키며, 이 스탠드인은 전달받은 인자 벡터를 파일에 기록한다. 실제 DoclingProducer, 실제 validateCustomArguments(), 실제 validatePathSafety()가 실행되며, 외부 도구만 교체된다.
기본값인 CLI 모드만 커스텀 인자를 docling에 전달한다.
CamelDoclingCustomArguments는 Camel 헤더 네임스페이스에 속하며, Camel의 기본 헤더 필터링을 적용하는 컨슈머(예: JMS 및 Kafka 컨슈머)는 수신 메시지에서 이를 제거한다. 따라서 이 문제는 라우트가 외부에서 영향을 받은 값을 헤더로 전달하거나, 컨슈머가 해당 필터링 없이 수신 헤더를 매핑하는 경우에 도달된다.
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-docling (DoclingProducer.validatePathSafety()) |
| CWE | CWE-22 (경로명을 제한된 디렉터리로 부적절하게 제한) |
| 심각도 | 중간 |
| 공격 벡터 | CamelDoclingCustomArguments의 허용 목록에 있는 경로 유사 플래그의 값으로 절대 경로 사용 |
| 영향 | docling 프로세스를 Camel 프로세스가 접근할 수 있는 임의의 디렉터리로 향하게 함 |
| 영향받는 버전 | 4.15.0부터 4.18.5 이전, 4.19.0부터 4.22.2 이전 |
| 수정된 버전 | 4.18.5, 4.22.2, 4.23.0 |
| JIRA | CAMEL-24893 |
| 크레딧 | Zhixi "Jace" Sun, 독립 보안 연구원 |
권고: https://camel.apache.org/security/CVE-2026-95628.html
관련: 이는 CVE-2026-40047의 불완전한 수정이며, 동일 구성 요소의 출력 경로 헤더는 **CVE-2026-95629**이다.
validatePathSafety는 이제 절대 경로인 경로 유사 커스텀 인자 값도 거부하며, 해당 인자는 절대 경로여서는 안 된다는 IllegalArgumentException과 함께 교환을 실패시킨다. 검사가 모든 경로 유사 값을 검증하는 공유 헬퍼에 위치하므로 두 가지 인자 형태 모두 커버된다.
main에서 apache/camel#26738 (fd3bc8e7)로 수정되었으며, camel-4.22.x에는 #26743 (e9233c37)으로, camel-4.18.x에는 #26744 (59d30af1)로 백포트되었다.
camel.version을 4.22.2로 설정하고 다시 실행한다. 4.22.1 → 4.22.2에 대해 검증됨:
3) An ABSOLUTE path, which contains no traversal sequence at all
REJECTED by Camel: IllegalArgumentException: Custom argument at index 1 must not be an absolute path
4) The same, attached to the flag after an equals sign
REJECTED by Camel: IllegalArgumentException: Custom argument at index 0 must not be an absolute path
>>> NOT reproduced: the absolute path was rejected too.
배포 외부에서 유래한 값으로 CamelDoclingCustomArguments를 구성하지 마십시오. 외부에서 도착하는 메시지가 docling 엔드포인트에 도달하기 전에 해당 헤더를 제거하고, 수신 헤더를 매핑하는 컨슈머가 Camel 헤더 네임스페이스를 제거하도록 하여 라우트만이 커스텀 인자를 선택하도록 하십시오.
이 저장소는 교육 및 방어 목적으로 게시되었습니다. Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 이를 해결하는지 검증할 수 있도록 돕기 위함입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.