
Работающий proof-of-concept на Spring Boot и Quarkus, воспроизводящий CVE-2026-85296 — путаницу ключей подписи MDN между партнёрами в camel-as2 (CWE-488), с уязвимой и исправленной сборками.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой материал подписи для каждого запроса хранился в
состоянии, разделяемом между запросами, а не ограничивался обрабатываемым запросом. Единственный ResponseMDN
регистрируется на общем HttpProcessor и обслуживает каждый AS2-запрос; в конфигурации с динамическими ключами (один торговый
партнёр на путь, каждый со своими ключами, разрешаемыми для каждого запроса из HttpContext) затронутая сборка записывала
разрешённый ключ подписи для каждого запроса обратно в поле экземпляра. Там, где развёртывание обслуживает более одного партнёра,
параллельные или последовательные запросы могли, таким образом, наблюдать материал друг друга, и уведомление о размещении сообщения
(Message Disposition Notification) могло быть подписано ключом другого торгового партнёра. Развёртывания AS2 обычно
являются многопартнёрскими по своей природе, поэтому условие достигается при обычном параллельном трафике.
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-as2 4.22.0 (затронута; исправлено в 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-as2 (Camel 4.22.0, затронута; исправленный контроль CQ 3.40.0 / Camel 4.22.1) |
Оба модуля демонстрируют как затронутое, так и исправленное поведение.
Драйвер использует настоящий ResponseMDN (перехватчик AS2-ответов) в его форме с динамическими ключами. Он поочерёдно разрешает
материал подписи двух партнёров — Партнёра A, затем Партнёра B — через ResponseMDN.process(...) (каждый с RSA-ключом этого
партнёра в HttpContext), и после каждого читает поле signingPrivateKey экземпляра.
final и никогда не записывается; ключ для каждого запроса остаётся ограниченным запросом, поэтому
signingPrivateKey общего экземпляра остаётся null.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: per-request key on the shared instance; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85296-as2-signing-key-confusion-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: field stays null; >>> 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): per-request key on the shared instance
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
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: field stays null
| Свойство | Значение |
|---|---|
| Компонент | camel-as2 (обработка динамических ключей ResponseMDN) |
| CWE | CWE-488 (Раскрытие элемента данных не той сессии) |
| Уровень серьёзности | MEDIUM |
| Вектор атаки | Обычный параллельный трафик AS2 в развёртывании с несколькими партнёрами, использующем общий экземпляр ResponseMDN |
| Воздействие | Уведомление о диспозиции сообщения (MDN), подписанное закрытым ключом другого торгового партнёра; повторное использование материала подписи между партнёрами |
| Затронутые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24429 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-85296.html
Затронутый модуль Quarkus собран на CQ 3.39.0 (Camel 4.22.0): механизм динамических ключей подписи AS2 для каждого запроса, который задействует данный PoC, появился после CQ 3.29.0 (Camel 4.15.0), поэтому CQ 3.39.0 поставляет тот же Camel 4.22.0, что и модуль Spring Boot.
ResponseMDN делает настроенные поля безопасности final и разрешает
динамический материал для каждого запроса в локальные переменные внутри process(), никогда не записывая его обратно
в поля экземпляра. Таким образом, единый общий экземпляр больше не может раскрыть ключ подписи одного запроса другому
запросу.
Запускайте отдельный контекст Camel для каждого торгового партнёра, чтобы между ними не использовался общий материал подписи.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление устраняет её. Пары ключей RSA генерируются в процессе для демонстрации и являются инертными. Не используйте этот материал против систем, которыми вы не владеете и не управляете.