拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SRC 挖洞:Jenkins JEP-200 过滤器绕过深度复盘,CVE-2026-70426 fallback 路径怎么打穿反序列化防线

SRC 挖洞:Jenkins JEP-200 过滤器绕过深度复盘,CVE-2026-70426 fallback 路径怎么打穿反序列化防线 作者 akihi白帽攻防录讲师某甲方网络安全工程师合集 SRC 年度第一、腾讯 SRC 连续三年前十单漏洞赏金 4w擅长 Web/App/PC 客户端漏洞挖掘。专注 Java 反序列化、DevOps 安全、CI/CD 管道审计。本文基于公开 CVE 信息与技术原理深度复盘供安全研究与防护参考。一、漏洞时间线2026 年 8 月Jenkins 发布安全公告修复了一个 Critical 级别的反序列化过滤器绕过漏洞 CVE-2026-70426。这个漏洞绕过了 JEP-200 反序列化过滤器——Jenkins 用来防御 Java 反序列化攻击的核心安全机制。时间事件影响版本2016JEP-200 引入防御反序列化攻击Jenkins 1.xxx2026-08-05Jenkins 发布安全公告修复 CVE-2026-704262.575 及更早2026-08-06多家安全媒体报道——2026-08-08加固指南发布——2026-09-02Jenkins 再次发布安全公告——这个漏洞的严重性在于JEP-200 是 Jenkins 对抗反序列化攻击的最后一道防线。一旦被绕过攻击者就能在 Jenkins 控制器上执行任意代码。二、攻击链全景让我们先用一张流程图还原完整的攻击路径攻击者控制了一个 Jenkins Agent 进程 │ 或者拥有 Agent/Connect 权限 ▼ 第一步构造恶意序列化数据 │ 使用已知的 Java 反序列化利用链 │ 如 Commons Collections、Commons Beanutils 等 ▼ 第二步通过 Agent 连接发送数据 │ Agent 与控制器之间使用 Remoting 协议通信 │ 通信内容包含序列化的 Java 对象 ▼ 第三步控制器接收并反序列化 │ 正常路径JEP-200 过滤器检查类名 │ Fallback 路径过滤器被跳过 ▼ 第四步恶意类被反序列化 │ fallback 解析路径不经过 JEP-200 过滤器 │ 黑名单类没有被拦截 ▼ 第五步触发利用链 │ 反序列化时自动执行恶意代码 │ 在 Jenkins 控制器上运行命令 ▼ 攻击者获得 Jenkins 控制器权限 │ ├─ 读取所有构建日志和密钥 ├─ 修改构建配置植入后门 ├─ 访问部署到生产环境的服务器 └─ 横向渗透整个内网关键结论这个漏洞的核心是fallback 路径——当正常的类解析路径失败时Remoting 库会使用一个备用路径来解析类但这个备用路径没有应用 JEP-200 过滤器。这就像给安检开了一个侧门正门查得严侧门直接放行。三、JEP-200 原理3.1 什么是 Java 反序列化Java 反序列化是将字节流还原为 Java 对象的过程。如果反序列化的是不可信的数据攻击者可以构造恶意字节流在反序列化时执行任意代码。// 正常的反序列化 ObjectInputStream ois new ObjectInputStream(inputStream); Object obj ois.readObject(); // 这里可能执行恶意代码 // 安全的反序列化使用过滤器 ObjectInputFilter filter ObjectInputFilter.Config.createFilter( com.example.*;!org.apache.commons.collections.*;! ); ObjectInputStream ois new ObjectInputStream(inputStream); ois.setObjectInputFilter(filter); Object obj ois.readObject();3.2 什么是 JEP-200JEP-200 是 Jenkins 在 2016 年引入的反序列化过滤器用于防御 Java 反序列化攻击维护一个黑名单denylist包含已知危险的类反序列化时检查每个类是否在黑名单中如果类在黑名单中抛出异常拒绝反序列化黑名单覆盖了 Commons Collections、Commons Beanutils 等常见利用链3.3 Remoting 库Jenkins 使用 Remoting 库实现 Agent 与控制器之间的通信Agent 连接到控制器建立持久化连接两者之间通过序列化的 Java 对象通信控制器发送构建任务Agent 返回构建结果Remoting 库负责序列化/反序列化这些对象四、漏洞深度分析4.1 漏洞根因根据 NVD 和 Jenkins 安全公告漏洞的根本原因是// 有缺陷的反序列化逻辑伪代码 public class ObjectInputStreamEx extends ObjectInputStream { Override protected Class? resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { // 正常路径应用 JEP-200 过滤器 if (useNormalResolution) { ClassFilter filter getClassFilter(); filter.check(desc.getName()); // 检查黑名单 } try { return super.resolveClass(desc); } catch (ClassNotFoundException e) { // Fallback 路径 // 类找不到时使用备用解析方法 // 但这里没有重新应用过滤器 return fallbackResolveClass(desc); // 问题fallbackResolveClass 不检查黑名单 } } } // 修复后的逻辑 Override protected Class? resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { // 修复无论哪个路径都先检查过滤器 ClassFilter filter getClassFilter(); filter.check(desc.getName()); // 统一检查 try { return super.resolveClass(desc); } catch (ClassNotFoundException e) { return fallbackResolveClass(desc); // fallback 也在过滤器检查之后 } }4.2 为什么 fallback 路径存在fallback 路径的设计目的是处理类加载的兼容性问题某些类在 Agent 和控制器之间的版本可能不同正常的类加载器找不到类时使用备用加载器这是为了确保不同版本的 Agent 能和控制器通信但开发者忘记在 fallback 路径上也应用过滤器安全原则安全检查应该在所有可能的路径上都执行。如果只在正常路径上检查而在异常路径或备用路径上不检查攻击者就会故意触发异常来绕过检查。这就是侧门绕过side-door bypass。4.3 攻击利用攻击者利用这个漏洞的步骤// 攻击前提 // 1. 攻击者控制了一个 Agent 进程 // 或者拥有 Agent/Connect 权限 // 2. Jenkins 控制器暴露在可访问的网络上 // 攻击步骤 // 1. 生成恶意序列化数据 // 使用 Commons Collections 利用链 // 或者其他已知的反序列化 gadget chain // 2. 通过 Agent 连接发送 // 正常情况下JEP-200 会拦截 // 因为黑名单中有 org.apache.commons.collections.* // 3. 故意触发 fallback 路径 // 使用特殊的类名格式 // 让正常的类解析失败 // 从而进入 fallback 解析路径 // 4. fallback 路径不检查黑名单 // 恶意类被成功加载和反序列化 // 5. 触发利用链 // 在 readObject() 中执行恶意代码 // 例如Runtime.getRuntime().exec(whoami)4.4 影响范围产品影响版本影响程度Jenkins Weekly2.575 及更早控制器 RCEJenkins LTS2.568.1 及更早控制器 RCERemoting 库多个受影响版本反序列化绕过修复版本2.576 / 2.568.2——五、修复方案分析Jenkins 在 2026 年 8 月 5 日发布了补丁修复项修复方式fallback 路径过滤在 fallback 解析路径上也应用 JEP-200 过滤器统一检查点所有类解析路径都先经过过滤器检查黑名单更新更新黑名单覆盖更多危险类日志记录记录被拦截的反序列化尝试5.1 Java 反序列化安全最佳实践// 反序列化安全检查清单 // 1. 永远不要反序列化不可信数据 // 如果可能改用 JSON 等格式 // 2. 使用反序列化过滤器 // Java 9 内置 ObjectInputFilter ObjectInputFilter filter ObjectInputFilter.Config.createFilter( com.example.*;!* // 白名单模式只允许特定包 ); // 3. 白名单优于黑名单 // 黑名单容易遗漏新的 gadget chain // 白名单只允许明确安全的类 // 4. 所有路径都要检查 // 正常路径和 fallback 路径都要应用过滤器 // 5. 升级到安全的库版本 // 避免使用有已知反序列化漏洞的库版本 // 6. 监控反序列化异常 // 大量反序列化异常可能是攻击尝试5.2 Jenkins 加固措施// Jenkins 安全加固 // 1. 及时更新 // 安装最新的 Jenkins 版本 // 2. 限制 Agent/Connect 权限 // 只有可信的 Agent 才能连接控制器 // 3. 网络隔离 // Jenkins 控制器不要暴露在公网 // 4. 最小权限 // Jenkins 进程使用普通用户运行 // 不要使用 root/Administrator // 5. 定期审计插件 // 只安装必要的插件 // 移除不使用的插件 // 6. 备份配置 // 定期备份 Jenkins 配置和密钥六、SRC 审计启示录6.1 反序列化审计清单在 SRC 挖洞过程中针对 Java 反序列化的审计清单#检查项检测方法1是否使用 Java 序列化检查 Content-Type、magic number2是否有反序列化过滤器测试已知 gadget chain3过滤器是否覆盖所有路径测试异常路径和 fallback 路径4是否使用白名单测试各种类名格式5依赖库是否有已知漏洞检查依赖版本6.2 常见反序列化绕过技巧// 常见反序列化过滤器绕过 // 1. 类名变形 // 大小写混淆org.Apache.commons.Collections // 路径分隔符org/apache/commons/Collections // 内部类org.apache.commons.Collections$1 // 2. fallback 路径绕过 // 触发异常让正常路径失败 // 进入不检查过滤器的备用路径 // 3. 新版本 gadget chain // 旧的黑名单不包含新的利用链 // 4. 自定义 gadget chain // 不使用已知的 Commons Collections // 而是自己构造利用链 // 5. 本地类利用 // 利用目标系统本身的类构造利用链6.3 DevOps 安全风险点常见问题防护建议CI/CD 管道Jenkins 等工具暴露在公网网络隔离限制访问Agent 信任任意 Agent 都能连接控制器限制 Agent/Connect 权限构建脚本恶意构建脚本执行代码代码审计最小权限密钥管理凭证明文存储使用密钥管理服务七、防护建议及时升级升级到 Jenkins 2.576 或 LTS 2.568.2限制权限严格限制 Agent/Connect 权限网络隔离不要将 Jenkins 暴露在公网最小权限Jenkins 进程使用普通用户运行定期审计审计插件和配置监控告警监控异常的 Agent 连接和反序列化尝试八、总结CVE-2026-70426 是一个典型的安全检查不一致漏洞。它提醒我们安全机制不能只在正常路径上生效必须在所有可能的代码路径上都生效。在 SRC 挖洞实践中侧门绕过是一种高级技巧——不要只测试正常路径还要思考异常路径、错误处理路径、fallback 路径是否也有同样的安全检查。
返回列表