CVE-2026-66907
Apache Camel: Camel-Google-Storage: потребитель присоединял имя удалённого объекта к настроенному каталогу downloadFileName, не ограничивая результат
- Опубликовано
- 24 авг. 2026 г.
- Обновлено
- 25 авг. 2026 г.
- Назначение CNA
- apache
- Наблюдены доказательства
- 24 авг. 2026 г.
Первичный CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:NНизкий · следующие 30 дней
- Процентиль
- 46,1 %
- Дата модели
- 21 сент. 2026 г.
EPSS – это статистическая оценка, а не достоверность или мера воздействия. Объедините это с CVSS, статусом KEV, воздействием и вашей средой.
Резюме
Уязвимость обхода пути (path traversal) в компоненте Google Storage Apache Camel. Проблема затрагивает Apache Camel: с 4.0.0 до 4.14.9, с 4.15.0 до 4.18.4, с 4.19.0 до 4.22.0. Потребитель (consumer) camel-google-storage загружает объекты Google Cloud Storage в локальную файловую систему, когда установлен параметр downloadFileName. Этот параметр документирован как папка или имя файла, и когда его значение не содержит токенов выражений, потребитель формирует локальный путь назначения, добавляя к нему имя объекта: evaluateFileExpression устанавливает заголовок Exchange file-name в имя удалённого объекта и вычисляет downloadFileName + "/${file:name}". Токен ${file:name} возвращает заголовок file-name без изменений, в отличие от ${file:onlyname}, который применяет к нему FileUtil.stripPath. Результирующая строка передавалась напрямую в new File(result) и blob.downloadTo(file.toPath()) без лексической нормализации и без проверки того, что путь назначения остаётся внутри настроенной директории. Имя объекта не является данными, контролируемыми маршрутом: потребитель получает список объектов в bucket, перебирает все возвращённые blob и создаёт по одному exchange на объект из blob.getBlobId().getName() без изменений, а параметр filter, который мог бы ограничить эти имена, вообще не применяется, если он не был явно задан. Имена объектов Google Cloud Storage представляют собой непрозрачные ключи UTF-8, которые сервис хранит и перечисляет точно в том виде, в каком они были записаны, без серверной канонизации, а косая черта — это лишь соглашение об отображении для псевдокаталогов, поэтому ключ, содержащий сегменты родительского каталога, сохраняется без изменений при полном цикле записи и чтения. Таким образом, имя объекта, содержащее такие сегменты, преобразовывалось в расположение за пределами настроенной директории downloadFileName, что позволяло любому, кто может влиять на имена объектов в потребляемом bucket, заставить Camel создать или перезаписать файл в выбранном им месте с правами процесса Camel. В зависимости от того, куда процесс может выполнять запись, перезапись файла за пределами директории загрузки может привести к эскалации за пределы потери целостности этого файла. Параметр downloadFileName является обычным параметром потребителя и не имеет маркера безопасности, поэтому ничто не сигнализировало пользователям о том, что его значение не применяется как граница изоляции. Дефект затрагивает только потребителя; у производителя (producer) нет приёмника загрузки в файл. Другие потребители загрузки файлов Camel — camel-file, camel-ftp, camel-smb, camel-mina-sftp, camel-azure-files и пути загрузки Azure Storage — уже ограничивали локальные загрузки настроенной директорией с помощью проверки границ сегментов пути; camel-google-storage оставался единственным приёмником загрузки из объектного хранилища, не охваченным этой работой. Пользователям рекомендуется обновиться до версии 4.22.0, в которой проблема устранена. Если пользователи находятся на ветке выпусков LTS 4.14.x, им рекомендуется обновиться до 4.14.9. Если пользователи находятся на ветке выпусков 4.18.x, им рекомендуется обновиться до 4.18.4. Для развёртываний, которые не могут обновиться немедленно, следует задать параметр filter как регулярное выражение, принимающее только простые односегментные имена объектов, чтобы любое имя, содержащее разделитель пути или сегмент родительского каталога, исключалось до создания exchange; обратите внимание, что при неустановленном параметре фильтрация не применяется вовсе, а выражение сопоставляется со всем именем объекта. В качестве альтернативы можно задать downloadFileName явное выражение, которое не пропускает удалённый путь, например построенное на ${file:onlyname} вместо неявного ${file:name}, помня, что downloadFileName, содержащий выражение, считается контролируемым автором маршрута и не покрывается проверкой изоляции, добавленной в исправлении. В качестве эшелонированной защиты относитесь к именам объектов в любом внешне записываемом bucket как к недоверенным входным данным и не выводите из них локальные пути файловой системы.
Ответственное использование
Используйте информацию об уязвимостях только в тех системах, которыми вы владеете или имеете право тестировать. Kitploit ссылается на метаданные общедоступных исследований и не хранит код эксплойта или вредоносные полезные данные.