
camel-azure-storage-datalake의 Apache Camel 경로 탐색 취약점(CVE-2026-60093)에 대한 개념 증명(PoC) 재현 코드로, downloadToFile을 통한 임의 파일 쓰기(arbitrary file write)를 시연합니다.
downloadToFile 경로 탐색동일한 Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 코드로, 런타임별로 하나씩 제공됩니다:
두 런타임 모두 영향을 받는 버전입니다(이 문제는 4.14.9 / 4.18.4 / 4.22.0에서 수정됨). 두 버전 모두 동일한 결함을 보여줍니다: camel-azure-storage-datalake 컴포넌트는 downloadToFile 작업을 통해 ADLS Gen2 파일을 로컬 파일시스템으로 다운로드할 수 있으며, fileDir 옵션으로 지정된 디렉터리에 파일을 씁니다.
DataLakeFileOperations.downloadToFile는 Azure SDK가 보고한 원격 경로 이름을 fileDir과 그대로 결합하여(new File(fileDir, fileClientWrapper.getFileName())) 로컬 대상을 구성했습니다 — 어휘적 정규화가 없었고, 확인된 위치가 fileDir 내부에 유지되는지에 대한 검사도 없었습니다. 원격 이름은 라우트에 의해 제어되지 않습니다: 컨슈머가 파일시스템을 열거하고(DataLakeConsumer.createBatchExchangesFromPath) 모든 항목을 다운로드합니다. 따라서 ../ 세그먼트를 포함하는 경로 이름은 fileDir 외부로 확인됩니다(CWE-22, 경로 탐색 → 임의 파일 쓰기).
테스트 하네스에 대한 참고 사항. Azure Data Lake Gen2 API는 사용 가능한 로컬 에뮬레이터에서 구현되지 않습니다 — Azurite는 Gen2
listPaths및 파일 작업에 대해 HTTP 400을 반환합니다. 따라서 이 재현 코드들은 정확히 취약한 코드(DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName()))를 직접 구동하며,getFileName()이 원격 이름을 반환하는 Data Lake 파일 클라이언트 래퍼를 제공합니다 — 컨슈머가PathItem.getName()에서 읽은 이름을 그대로 제공하는 것과 동일합니다. 형제 컴포넌트인camel-azure-storage-blob도 동일한 수정 사항을 공유하며(CVE-2026-66906), 해당 컴포넌트에서는 동일한 결함이 실제 Azurite 에뮬레이터를 대상으로 종단 간(end-to-end) 재현됩니다.
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
영향을 받는 빌드에서의 예상 출력(두 변형 모두):
2) Download of a file named '../../../../../../tmp/pwned-60093.txt':
resolved local target: /app/downloads/../../../../../../tmp/pwned-60093.txt
File written OUTSIDE it, at /tmp/pwned-60093.txt: true
content: PWNED via path traversal — CVE-2026-60093
>>> PROVEN: DataLakeFileOperations.downloadToFile built the local target as new File(fileDir, fileName) ... : true
권고: https://camel.apache.org/security/CVE-2026-60093.html
이제 컨슈머는 다운로드 대상을 구성된 fileDir 디렉터리 내로 확인하고 제한하며(AzureFileNameHelper.resolveWithinDirectory 사용), 해당 디렉터리를 벗어나는 경로 이름을 거부합니다 — camel-azure-storage-blob에도 적용되는 동일한 수정 사항입니다(CVE-2026-66906).
이 저장소는 교육 및 방어 목적으로 게시되었습니다: Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드로 해결되는지 확인할 수 있도록 돕기 위해서입니다. 쓰여지는 파일은 /tmp 아래의 무해한 마커입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.
| 런타임 | 디렉터리 | 스택 |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-azure-storage-datalake 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (Camel 4.20.0 번들 포함) |
| 속성 | 값 |
|---|
| 컴포넌트 | camel-azure-storage-datalake (Spring Boot: camel-azure-storage-datalake-starter; Quarkus: camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22 (경로명을 제한된 디렉터리로 제한하지 않음 — 경로 탐색) |
| 공격 벡터 | 경로 이름에 ../ 세그먼트가 포함된 Gen2 파일로, fileDir이 설정된 컨슈머가 다운로드함 |
| 영향 | 구성된 fileDir 디렉터리 외부에 임의 파일 쓰기 |
| 영향을 받는 버전 | 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-23942 |
| 공로자 | n0mi1k; Hiep Nguyen |