Signature 竞态(签名验证绕过)针对 Apache Camel 漏洞的可运行概念验证复现程序:PQC 生产者持有单个 java.security.Signature 实例,并在每次交换中复用它而不做同步。Signature 是有状态的,且不是线程安全的:update() 累积待签名或待验证的数据,而 verify()/sign() 会消耗这些累积的状态。当并发交换共享同一个实例时,不同消息的 update 和 verify 调用会相互交错,因此一次验证可能针对属于另一次交换的数据完成,或针对部分累积的缓冲区完成。其结果是不可确定的,并且包括对一条从未真正校验过签名的消息报告验证成功,这破坏了该组件本应提供的保证。触发该问题只需要通过同一端点产生并发流量——这正是 Camel 路由在负载下的常见条件。
| 运行时 | 目录 | 技术栈 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-pqc 4.22.0(受影响;修复版本 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-pqc(Camel 4.22.0,受影响;修复对照 CQ 3.40.0 / Camel 4.22.1) |
两个模块都演示了受影响和修复后的行为。
一条路由用后量子 ML-DSA 密钥对每条消息签名,然后立即验证它刚刚生成的签名,因此每一条合法签名的消息都必须验证为 true。驱动程序通过共享的 pqc: 生产者并发执行 1024 次这样的签名→验证往返(16 个线程)。
true——有些返回 false,有些抛出签名引擎错误——因为跨并发交换共享的单个有状态 Signature 被交错操作破坏。验证结论不再对应它所针对的消息。(同样的竞态,在危险的方向上,会让 verify() 对它从未覆盖的数据返回成功。)Signature 实例。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: many of 1024 broken; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85248-pqc-signature-race-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: 0 broken; >>> 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): many broken
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: 0 broken
该竞态本质上依赖时序;复现程序驱动了足够的并发(1024 次往返),因此在受影响的构建上能够可靠地显现。如果某次受影响运行显示 0 个损坏,请重新运行。
| 属性 | 值 |
|---|---|
| 组件 | camel-pqc(PQCProducer 签名/验证) |
| CWE | CWE-362(使用共享资源的并发执行且同步不当) |
| 严重性 | 中 |
| 攻击向量 | 通过同一 pqc: 端点的并发流量共享一个有状态的 java.security.Signature |
| 影响 | 非确定性的签名验证;验证可能对一条从未检查过签名的消息报告成功 |
| 受影响版本 | 从 4.12.0 起至 4.18.5 之前,从 4.19.0 起至 4.22.1 之前 |
| 修复版本 | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24445 |
| 致谢 | Claude Security Scan Tool |
公告:https://camel.apache.org/security/CVE-2026-85248.html
PQCProducer 不再在并发交换之间共享 Signature。当生产者自行创建实例时,现在会为每个交换创建新实例(signerForExchange());当用户配置了(JVM 范围的 public static final)实例时,对该实例的访问是 synchronized 的。无论哪种方式,都不会有两个交换在同一个实例上交错执行其 init/update/verify 序列。
将受影响的路由限制为单个并发消费者,以便不会有两个交换同时使用该 Signature 实例。
本仓库出于教育和防御目的发布:帮助 Apache Camel 用户理解该漏洞、验证自己是否受影响,并确认升级可以解决该问题。消息和密钥均为无实际作用的本地测试数据。请勿将本材料用于您不拥有或运营的系统。