
Apache Camel camel-google-storage 경로 탐색(CVE-2026-66907)에 대한 개념 증명 재현기로, downloadFileName을 통한 임의 파일 쓰기를 시연하며 영향을 받는 버전 및 수정된 버전 세부 정보를 포함합니다.
downloadFileName 경로 탐색동일한 Apache Camel 취약점에 대한 실행 가능한 PoC 재현 코드로, 런타임별로 하나씩 제공됩니다:
두 버전 모두 영향을 받는 버전입니다(문제는 4.14.9 / 4.18.4 / 4.22.0에서 수정됨). 둘 다 동일한 결함을 보여줍니다: camel-google-storage 컨슈머가 downloadFileName이 디렉터리일 때 버킷 객체를 로컬 파일시스템으로 다운로드하며, 원격 객체 이름을 여기에 덧붙여 로컬 대상을 구성합니다(downloadFileName + "/${file:name}"). ${file:name} 토큰은 객체 이름을 그대로 반환하며(경로를 제거하는 ${file:onlyname}과는 다름), 그 결과는 정규화 없이, 그리고 대상이 설정된 디렉터리 안에 머무르는지에 대한 검사 없이 new File(result) / blob.downloadTo(file.toPath())에 전달되었습니다. 객체 이름은 라우트에 의해 제어되지 않습니다 — 컨슈머는 버킷을 나열하고 모든 객체를 다운로드합니다 — 따라서 이름에 ../ 세그먼트가 포함된 객체는 downloadFileName 밖에 기록됩니다(CWE-22, 경로 탐색 → 임의 파일 쓰기).
각 하위 디렉터리는 자체적으로 완결되어 있습니다(자체 Dockerfile, fake-gcs-server 에뮬레이터를 실행하는 docker-compose.yml, 그리고 README 포함). 간단히 말해, 둘 중 어느 쪽이든:
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
영향을 받는 빌드에서의 예상 출력(두 변형 모두):
Files inside the intended download directory /app/downloads:
- report.txt
File written OUTSIDE it, at /tmp/pwned-66907.txt: true
content: PWNED via path traversal — CVE-2026-66907
>>> PROVEN: the object name's ../ segments escaped the configured downloadFileName directory ... : true
보안 권고: https://camel.apache.org/security/CVE-2026-66907.html
이제 컨슈머는 해석된 경로를 정규화하고, 그 경로가 설정된 downloadFileName 디렉터리 안에 머무르는지 단언합니다(GoogleCloudStorageFileNameHelper.assertWithinDirectory를 통해). 이를 벗어나려는 객체 이름은 거부됩니다.
docker-compose.yml은 fake-gcs-server를 -backend memory로 실행합니다. 그러면 객체 이름이 불투명한 맵 키로 유지되므로 ../가 포함된 이름도 보존됩니다. 기본 파일시스템 백엔드에서는 ../가 해석되어 객체를 나열할 수 없게 됩니다.
이 저장소는 교육 및 방어 목적으로 게시되었습니다: Apache Camel 사용자가 취약점을 이해하고, 자신이 영향을 받는지 확인하며, 업그레이드를 통해 해결되는지 확인할 수 있도록 돕기 위해서입니다. 기록되는 파일은 /tmp 아래의 무해한 마커입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.
| 런타임 | 디렉터리 | 스택 |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-google-storage 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (Camel 4.20.0을 번들로 포함) |
| 속성 | 값 |
|---|
| 구성 요소 | camel-google-storage (Spring Boot: camel-google-storage-starter; Quarkus: camel-quarkus-google-storage) |
| CWE | CWE-22 (제한된 디렉터리의 경로명에 대한 부적절한 제한 — 경로 탐색) |
| 공격 벡터 | 이름에 ../ 세그먼트가 포함된 버킷 객체 — downloadFileName이 디렉터리로 설정된 상태에서 컨슈머가 이를 다운로드함 |
| 영향 | 설정된 다운로드 디렉터리 밖에 임의 파일 쓰기 |
| 영향 받는 버전 | 4.0.0부터 4.14.9 이전, 4.15.0부터 4.18.4 이전, 4.19.0부터 4.22.0 이전 |
| 수정된 버전 | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24279 |
| 발견자 | n0mi1k |