
Reproducer for CVE-2026-43867 — Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager unsafe key-metadata deserialization (RCE)
Этот проект демонстрирует уязвимость десериализации Java в компоненте Apache Camel camel-pqc,
отслеживаемую как CVE-2026-43867. AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() считывает сохранённые
пост-квантовые метаданные ключа обратно из секрета AWS Secrets Manager, декодируя сохранённое значение из Base64 и
десериализуя его с помощью чистого java.io.ObjectInputStream.readObject() без ObjectInputFilter — приведение
к KeyMetadata происходит только после возврата readObject(), поэтому сначала выполняются все побочные эффекты readObject(). Участник,
который может записывать в этот секрет (secretsmanager:PutSecretValue), может сохранить подложный сериализованный объект,
который десериализуется во время обычных операций жизненного цикла ключа, что потенциально может привести к выполнению кода.
Консультация: https://camel.apache.org/security/CVE-2026-43867.html
Тот же дефект, что и CVE-2026-46590 (сообщено независимо; это предупреждение также охватывает менеджеры для HashiCorp Vault и файловые менеджеры), и неполное исправление последствий CVE-2026-40048 (CAMEL-23200), которое изменило
FileBasedKeyLifecycleManagerна формат JSON/PKCS#8/X.509, но не добавилоObjectInputFilterи не охватило менеджеры AWS/Vault.
// AwsSecretsManagerKeyLifecycleManager - затронутая версия 4.18.2
private KeyMetadata deserializeMetadata(String base64) throws Exception {
byte[] data = Base64.getDecoder().decode(base64);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
try (ObjectInputStream ois = new ObjectInputStream(bais)) { // НЕТ ObjectInputFilter
return (KeyMetadata) ois.readObject(); // гаджет срабатывает здесь, до приведения
}
}
getKeyMetadata(keyId) считывает секрет с именем <keyPrefix>/<keyId>/metadata, разбирает его JSON-обёртку
({"metadata":"<base64>","keyId":...,"algorithm":...}) и передаёт поле metadata в
deserializeMetadata. Исправление (4.18.3 / 4.21.0) вводит общий KeyMetadataCodec, который хранит метаданные в
формате JSON для всех менеджеров и ограничивает оставшиеся чтения устаревшего ObjectInputStream с помощью белого списка
ObjectInputFilter.
Жертвой является приложение, управляющее PQC-ключами с помощью AWS-менеджера. Атакующим является любой участник,
который может записывать секрет метаданных (secretsmanager:PutSecretValue). Этот PoC использует LocalStack для эмуляции
AWS Secrets Manager; конечная точка /exploit/attack записывает подложный секрет метаданных, а затем запускает путь чтения менеджера.
CVE-2026-43867/
├── pom.xml # camel-pqc 4.18.2 + aws-sdk secretsmanager 2.41.28 + commons-collections 3.2.1
├── Dockerfile # запускает приложение (--add-opens для сборки гаджета)
├── docker-compose.yml # LocalStack (Secrets Manager) + приложение-воспроизводитель
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── Gadget.java # Гаджет CommonsCollections6, срабатывает во время readObject()
│ └── ExploitController.java # записывает подложный секрет, затем вызывает getKeyMetadata()
└── resources/
└── application.properties
В реальной атаке сериализованные байты создаются офлайн атакующим (например, с помощью ysoserial). Этот PoC строит гаджет внутри процесса, поэтому JVM запускается с
--add-opens java.base/java.util=ALL-UNNAMED— деталь сборки гаджета, не связанная с уязвимостью.
mvn clean package -DskipTests
docker compose up -d --build
Это запускает LocalStack (эмулирует AWS Secrets Manager) и приложение-воспроизводитель, которое направляет свой
AwsSecretsManagerKeyLifecycleManager на LocalStack через переопределение конечной точки.
curl -s http://localhost:8080/exploit/attack
# -> Записан подложный сериализованный метаданные в секрет AWS Secrets Manager 'pqc/keys/victim-key/metadata'.
# getKeyMetadata() вызвал java.lang.ClassCastException (ожидаемо — гаджет срабатывает во время readObject ...)
#
# >>> Доказательство RCE — /tmp/pwned существует: true
docker exec cve-2026-43867 ls -la /tmp/pwned
docker compose down
Любое приложение, использующее AwsSecretsManagerKeyLifecycleManager, чей секрет метаданных ключа может быть записан стороной,
отличной от собственного доверенного удостоверения приложения. Десериализация происходит во время обычных операций
жизненного цикла ключа (getKeyMetadata, loadExistingKeys, listKeys, проверки ротации и т.д.).
AwsSecretsManagerKeyLifecycleManager от camel-pqc в уязвимой версии.secretsmanager:PutSecretValue на него).commons-collections:3.2.1).Обновиться до 4.18.3 / 4.21.0 (CAMEL-23726). Метаданные хранятся в формате JSON, а любые оставшиеся чтения
устаревшего ObjectInputStream ограничены белым списком ObjectInputFilter.
До обновления:
secretsmanager:PutSecretValue на секрет метаданных camel-pqc только для собственного удостоверения приложения
(принцип наименьших привилегий IAM).Этот воспроизводитель предоставляется только для исследований безопасности и авторизованного тестирования в отношении публично раскрытой и исправленной уязвимости. Не используйте его против систем без явного разрешения.
| Свойство | Значение |
|---|
| Компонент | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| Затронутый класс | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502: Десериализация недоверенных данных |
| Влияние | Выполнение кода в приложении, управляющем ключами (требуется доступ на запись к секрету метаданных) |
| Затронутые версии | С 4.18.0 до 4.18.3, с 4.19.0 до 4.21.0 |
| Исправленные версии | 4.18.3, 4.21.0 (camel-pqc не входит в версию с долгосрочной поддержкой 4.14.x) |
| JIRA | CAMEL-23726 |
| Сообщивший | Венкатраман Кумар (Securin) |