
Работающий воспроизводитель на Spring Boot и Quarkus для CVE-2026-85300, демонстрирующий, как camel-pqc записывает приватные ключи с разрешениями файлов, производными от разрешительной umask, и проверяющий исправление.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой FileBasedKeyLifecycleManager из camel-pqc записывал сгенерированный ключевой материал на диск с правами, которые создавала стандартная umask процесса, вместо того чтобы ограничить файл его владельцем. На хосте, чья umask допускает чтение группой или остальными (распространённое значение 022), незашифрованный закрытый ключ был доступен для чтения другим локальным учётным записям. Угроза исходит от локальной стороны, а не от удалённого отправителя, но там, где она применима, последствия полны: обладание закрытым ключом сводит на нет каждую подпись и каждый обмен ключами, которые выполняет развёртывание с его использованием.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-pqc 4.22.0 (уязвим; исправлено в 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-pqc (Camel 4.22.0, уязвим; исправлено в контрольной версии CQ 3.40.0 / Camel 4.22.1) |
Оба модуля демонстрируют как уязвимое, так и исправленное поведение. Оба запускаются под umask 022 (распространённое значение по умолчанию), что является предпосылкой уязвимости.
Драйвер использует настоящий FileBasedKeyLifecycleManager: он сохраняет пару ключей RSA в новый каталог
(manager.storeKey("k1", keyPair, new KeyMetadata("k","RSA"))), а затем считывает POSIX-права записанного файла
k1.private.json.
rw-r--r-- (0644) при umask 022 — поэтому группа
и остальные могут прочитать незашифрованный закрытый ключ.rw------- (0600, только владелец) независимо от umask.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: rw-r--r-- private key; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
umask 022 && java -jar target/cve-2026-85300-pqc-key-permissions-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rw------- ; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): rw-r--r-- private key
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
umask 022 && java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rw-------
| Свойство | Значение |
|---|---|
| Компонент | camel-pqc (FileBasedKeyLifecycleManager.storeKey) |
| CWE | CWE-276 (Некорректные разрешения по умолчанию) |
| Уровень серьёзности | MEDIUM |
| Вектор атаки | Локальная учётная запись, способная читать каталог ключей на хосте с разрешающей (например, 022) umask |
| Воздействие | Раскрытие незашифрованного закрытого ключа другим локальным учётным записям |
| Затронутые версии | С 4.12.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24447 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-85300.html
Затронутый модуль Quarkus основан на CQ 3.39.0 (Camel 4.22.0):
camel-quarkus-pqcвпервые сопоставляется с затронутой версией Camel именно там (CQ 3.29.0 / Camel 4.15.0 предшествует используемому здесь файловому менеджеру жизненного цикла ключей).
FileBasedKeyLifecycleManager теперь ограничивает каталог ключей и каждый
файл закрытого ключа правами их владельца (rwx------ / rw------- через setPosixFilePermissions, с запасным вариантом
java.io.File для не-POSIX файловых систем) перед записью, а также ужесточает права ранее существовавшего файла ключа,
доступного на чтение всем, при перезаписи (файл усекается, а не создаётся заново, поэтому иначе он сохранил бы старые
разрешения). Ключевой материал, уже записанный с разрешающими правами, следует считать скомпрометированным и выполнить
его ротацию.
Разместите каталог ключей по пути, доступ к которому может осуществлять только служебная учётная запись, и ужесточите umask процесса; любой ключ, уже записанный с разрешающими правами, считайте скомпрометированным и выполните его ротацию.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление устраняет её. Пара ключей RSA генерируется в процессе работы во временном каталоге и удаляется после проверки. Не используйте этот материал против систем, которыми вы не владеете и которые не эксплуатируете.