
Запускаемый proof-of-concept на Spring Boot, воспроизводящий CVE-2026-85245 — раскрытие данных при кросс-обмене в camel-thrift, со сравнением уязвимой и исправленной версий и рекомендациями по устранению.
Запускаемый воспроизводитель proof-of-concept для уязвимости Apache Camel, при которой формат данных Thrift выполнял демаршалинг
в общий defaultInstance целевого типа, а не в свежую копию, и возвращал этот общий объект
в качестве тела обмена. Поскольку экземпляр является общим в масштабе процесса, состояние, записанное при демаршалинге одного сообщения,
оставалось на объекте и было видно каждому последующему сообщению, использовавшему тот же тип. Поля, отсутствующие в последующем
полезном грузе, сохраняли значения предыдущего сообщения, поэтому содержимое, принадлежащее одному отправителю, могло быть прочитано при обработке
сообщения другого отправителя, а параллельные обмены могли наблюдать частично записанное состояние друг друга. В
развёртывании, которое обслуживает более одного арендатора или пользователя через один и тот же маршрут, это раскрытие данных одной стороны
другой.
Только Spring Boot. Расширения
camel-quarkus-thriftне существует, поэтому этот воспроизводитель поставляется с единственным модулем Camel Spring Boot. (Дефект находится вThriftDataFormatкомпонента, который не зависит от среды выполнения.)
| Среда выполнения | Каталог | Стек |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0 (уязвим; исправлено в 4.22.1) |
Маршрут определяет один ThriftDataFormat (на основе сгенерированного типа Thrift Work) и повторно использует его для каждого сообщения,
как обычно и делают маршруты. Два арендатора отправляют через него сообщение:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — необязательное поле comment несёт конфиденциальные
данные;Work{num1=3, op=SUBTRACT} — без поля comment.Маршрут выполняет демаршалинг сообщения арендатора A, затем арендатора B.
comment арендатора A — Thrift присваивает только те
поля, которые присутствуют во входящих байтах, и оба сообщения были десериализованы в (и возвращены как) один и тот же общий
экземпляр, поэтому отсутствующее поле B сохранило значение A. Оба тела — буквально один и тот же объект.comment арендатора B равен null — каждый обмен получает свою собственную очищенную копию.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| Свойство | Значение |
|---|---|
| Компонент | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (Раскрытие элемента данных не той сессии) |
| Уровень серьёзности | MEDIUM |
| Вектор атаки | Два сообщения одного и того же типа Thrift через один маршрут; последующее сообщение, опускающее поле, наследует значение из предыдущего |
| Воздействие | Раскрытие данных между обменами / между арендаторами; параллельные обмены могут наблюдать частично записанное состояние друг друга |
| Затронутые версии | С 4.0.0 до 4.18.5, с 4.19.0 до 4.22.1 |
| Исправленные версии | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24442 |
| Благодарность | Claude Security Scan Tool |
Рекомендация: https://camel.apache.org/security/CVE-2026-85245.html
Сгенерированные типы Thrift (Work, Operation) — это публичные тестовые фикстуры из собственных тестов camel-thrift
Apache Camel.
ThriftDataFormat.unmarshal теперь десериализует в копию для каждого обмена:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — затем десериализует байты в instance и
возвращает его. Каждый обмен получает собственный очищенный объект, поэтому ни одно поле не переносится между сообщениями и никакие два обмена не разделяют
тело.
Скопируйте десериализованное тело в новый экземпляр сразу после выполнения формата данных и не сохраняйте ссылки на возвращённый объект.
Этот репозиторий публикуется в образовательных и защитных целях: чтобы помочь пользователям Apache Camel понять уязвимость, проверить, затронуты ли они, и убедиться, что обновление её устраняет. «Секрет» — это инертный, вымышленный маркер-строка. Не используйте этот материал против систем, которыми вы не владеете и не управляете.