
Рабочий воспроизводитель proof-of-concept для CVE-2026-79984 — обхода путей в Apache Camel camel-mina-sftp, с фикстурами вредоносного SFTP-сервера и сборками уязвимой и исправленной версий.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой consumer mina-sftp — который
происходит от того же базового класса RemoteFileConsumer, что и другие consumer'ы удалённых файлов — строит абсолютный
удалённый путь каждого опрашиваемого файла путём конкатенации настроенного каталога с именем, указанным в листинге
каталога сервера, без лексической нормализации и без проверки нахождения внутри каталога. Этот путь затем становится операндом для
извлечения (всегда), а также для удаления или переименования, когда настроены delete=true, move, preMove, moveFailed или
readLock=rename.
Имя записи каталога SFTP — это необработанная строка протокола, предоставляемая сервером, поэтому скомпрометированный, вредоносный или многопользовательский сервер может сообщить имя, не являющееся одним сегментом пути.
Это
mina-sftp-аналог CVE-2026-79983 (camel-ftp); оба имеют одну и ту же первопричину и одно и то же исправление.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina-sftp 4.22.0 (уязвим; исправлено в 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-mina-sftp 3.39.0 (Camel 4.22.0, уязвим; исправленный контроль 3.40.0 / Camel 4.22.1) |
camel-mina-sftpбыл представлен в Camel 4.18.0, поэтому компонент отсутствует в Camel 4.15.0, поставляемом с последней по номеру версией Camel Quarkus; этот воспроизводитель использует Camel Quarkus 3.39.0 (Camel 4.22.0, уязвим), с 3.40.0 (Camel 4.22.1) в качестве исправленного контроля. Таким образом, оба модуля демонстрируют как уязвимое, так и исправленное поведение.
Приложение встраивает намеренно вредоносный SFTP-сервер (Apache MINA SSHD). Он обслуживает реальное дерево временного каталога,
но переписывает в своём ответе SSH_FXP_READDIR имя одного файла в опрашиваемом каталоге /upload на
строку обхода d/../../outside.txt (через переопределение getShortName). Имя не начинается с точки, поэтому
правило Camel о скрытых файлах его не перехватывает, и /upload + d/../../outside.txt разрешается в /outside.txt, на один
уровень выше опрашиваемого каталога. Обычный consumer mina-sftp опрашивает /upload.
normal.txt, так и выходящий за пределы /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
Ожидаемый вывод на затронутой сборке:
name=[d/../../outside.txt] <<< FILE FROM OUTSIDE THE POLLED DIRECTORY
content: OUTSIDE-SECRET (/outside.txt, a file the consumer should never reach)
name=[normal.txt] (inside)
| Свойство | Значение |
|---|---|
| Компонент | camel-mina-sftp (схема mina-sftp) |
| CWE | CWE-22 (Некорректное ограничение пути к каталогу) |
| Критичность | ВЫСОКАЯ |
| Вектор атаки | Имя записи READDIR (предоставляемое сервером), не являющееся одним сегментом пути |
| Воздействие | Чтение — а при delete/move/readLock=rename также удаление или переименование — файлов за пределами опрашиваемого каталога с использованием учётных данных эндпоинта |
| Затронутые версии | С 4.18.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24487 |
| Благодарность | Dilrevx из NSSL, SJTU |
Уведомление: https://camel.apache.org/security/CVE-2026-79984.html
GenericFileConsumer.isWithinStartingDirectory (переопределяемый в RemoteFileConsumer, от которого наследуется
потребитель mina-sftp) нормализует разрешённый путь и проверяет на границах сегментов пути, что он остаётся внутри
опрашиваемого каталога; запись, разрешающаяся за его пределами, пропускается с предупреждением, при этом легитимные
записи по-прежнему обрабатываются.
Проверяйте хост-ключ сервера, ограничьте потребителя с помощью filter/antInclude/include, чтобы принимать только
имена из одного сегмента, и избегайте delete/move/preMove/moveFailed/readLock=rename при работе с серверами,
чьи листинги не являются полностью доверенными. Где возможно, ограничьте учётную запись сервера опрашиваемым каталогом.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. Вредоносный сервер и «секрет» — это инертные локальные фикстуры. Не используйте этот материал против систем, которыми вы не владеете и не управляете.