
CVE-2026-79983에 대한 실행 가능한 개념 증명 재현기로, Apache Camel camel-ftp 컨슈머의 경로 순회 취약점이며, 악성 FTP 서버 픽스처와 취약 빌드 대 수정 빌드를 포함합니다.
Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현 도구로, 원격 파일 consumer가 원격 서버의
디렉터리를 폴링하고 각 파일의 절대 원격 경로를 구성된 디렉터리와 서버의 디렉터리 목록에 보고된 파일 이름을
연결하여 구성하며, 어휘적 정규화도 없고 결과가 폴링된 디렉터리 내부에 머무는지 확인하지도 않습니다. 그 경로는
이후 검색(항상)의 피연산자가 되며, delete=true, move, preMove, moveFailed 또는 readLock=rename이
구성된 경우 삭제나 이름 변경의 피연산자도 됩니다.
목록의 이름은 라우트가 제어하는 데이터가 아닙니다 — 이는 원격 서버가 제공하는 것이며, FTP 제어 채널에는
무결성 보호가 없으므로 경로상의 공격자가 LIST 응답을 재작성할 수 있고, 침해되었거나 다중 테넌트인 서버는
그러한 이름을 직접 내보낼 수 있습니다. 문서화되어 있고 기본으로 켜져 있는 jailStartingDirectory 옵션은 이
원격 피연산자를 제한하지 못했습니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-ftp 4.22.0 (영향받음; 4.22.1에서 수정) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-ftp 3.29.0 (Camel 4.15.0, 영향받음) |
수정 사항은 Camel 4.18.5 / 4.22.1 / 4.23.0에 포함됩니다; Spring Boot 모듈은 영향받는 빌드(4.22.0)와 수정된 빌드(4.22.1)를 모두 실행합니다. 아직 수정된 Camel을 번들로 포함한 Camel Quarkus 릴리스는 없습니다.
이 앱은 의도적으로 악성 FTP 서버(인메모리 VFS를 사용하는 Apache MINA FtpServer)를 내장하며, 이 서버는
폴링되는 디렉터리 /upload에 다음을 나열합니다:
normal.txt — 디렉터리 내부의 정상 파일, 그리고d/../../outside.txt — 이름이 단일 경로 세그먼트가 아닌 조작된 항목. 점으로 시작하지 않으므로
(Camel의 숨김 파일 규칙에 걸리지 않음) /upload + d/../../outside.txt는 폴링된 디렉터리보다 한 단계
위인 /outside.txt로 해석됩니다.일반적인 Camel FTP consumer가 /upload를 폴링합니다. 영향받는 빌드에서는 두 항목을 모두 검색합니다 —
접근해서는 안 되는 파일인 /outside.txt까지 포함해서요. 수정된 빌드에서는 normal.txt를 유지하고
탈출하는 항목을 건너뛰며, Skipping file as it resolves outside the starting directory: upload/d/../../outside.txt를
로깅합니다.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
영향을 받은 빌드에서 예상되는 출력:
What the Camel consumer retrieved:
name=[normal.txt] (inside)
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
Paths the server was asked to read:
upload/normal.txt -> /upload/normal.txt
upload/d/../../outside.txt -> /outside.txt
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-ftp (ftp, ftps, sftp 스킴) |
| CWE | CWE-22 (경로명에 대한 부적절한 제한 - 제한된 디렉터리) |
| 심각도 | HIGH |
| 공격 벡터 | 단일 경로 세그먼트가 아닌 LIST 항목(서버가 제공하며, 인증되지 않은 FTP 제어 채널에서 재작성 가능) |
| 영향 | 엔드포인트의 자격 증명을 사용하여 폴링된 디렉터리 외부의 파일을 읽고, delete/move/readLock=rename과 함께 사용 시 삭제 또는 이름 변경 |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24487 |
| 크레딧 | Dilrevx from NSSL, SJTU |
권고문: https://camel.apache.org/security/CVE-2026-79983.html
구분자 인식 GenericFileHelper.isWithinDirectory 오버로드와 GenericFileConsumer.isWithinStartingDirectory
전략(jailStartingDirectory가 활성화된 경우 isValidFile에서 참조됨)이 확인된 경로를 압축하고,
경로 세그먼트 경계에서 해당 경로가 여전히 폴링된 디렉터리 내부로 확인되는지 검증합니다. 외부로 확인되는 파일은
경고와 함께 건너뜁니다(따라서 동일한 목록의 다른 정당한 항목은 계속 처리됩니다). RemoteFileConsumer와
SmbConsumer가 이 검사를 재정의하며, 로컬 기본 구현은 로컬 목록 이름이 항상 단일 세그먼트이므로
아무 동작도 하지 않습니다.
전송 중에 목록이 재작성될 수 없도록 ftp 대신 sftp/ftps를 선호하고, 호스트 키/인증서를 검증하십시오.
filter, antInclude 또는 include로 컨슈머를 제한하여 단일 세그먼트 이름만 허용하고, 목록이 완전히
신뢰되지 않는 서버에 대해서는 delete=true/move/preMove/moveFailed/readLock=rename을 피하십시오.
가능한 경우 서버 계정을 폴링된 디렉터리로 제한하십시오.
이 저장소는 교육 및 방어 목적으로 게시됩니다: Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 검증할 수 있도록 돕기 위함입니다. 악성 서버와 "secret"은 동작하지 않는 로컬 픽스처입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.