CVE-2026-53435 的首个公开概念验证,在仅有安全公告、没有任何 PoC 公开发布时构建。 仅凭一行模糊的公告,在一个周五晚上耗时 约 8.5 小时 重建——不是通过手动编写利用代码,而是通过 引导 AI 遍历死胡同、转向和验证,直到获得可运行的攻击链。

PoC 读取控制器上的
/etc/passwd——确认任意文件读取。
| CVE | CVE-2026-53435(Jenkins SECURITY-3707) |
| 类型 | 不安全反序列化(通过 config.xml 绕过 ClassFilter) |
| 影响(本 PoC) | 已认证用户在控制器上任意文件读取 |
| 受影响版本 | Jenkins weekly ≤ 2.567, LTS ≤ 2.555.2 |
| 修复版本 | Jenkins weekly 2.568, LTS 2.555.3 |
| 公告 | https://www.jenkins.io/security/advisory/2026-06-10/(发布于 2026-06-10) |
| 撰写时的状态 | 没有公开 PoC 存在(GitHub PoC 仓库:0) |
这是一个展示 过程 而非仅展示成果的实验。
多年来,进攻性研究人员的产出仅仅是一个成品 exploit——那 8 小时的错误方向被丢弃了。这个仓库保留了那些错误方向。一份完整、经过轻度编辑的人机协作记录(从公告到工作 PoC)作为附录包含在内。
它的论点刻意 不是 "AI 完成了这一切。" 那 8 小时正是 AI 并未完成的证据。AI 从未一次性生成整个攻击链。真正推动工作的是领域专业知识——知道公告背后隐藏着一个反序列化接收点,知道应该在 Jenkins 核心 类型而非插件中查找,知道未打补丁的 DescribableList 不会强制其元素类型,以及知道如何 验证 一个声明而非盲目相信。研究人员的价值并未消失;它从 编写 exploit 转移到了 引导、剪枝和验证。
这个转变才是值得记录的东西。
Jenkins 使用自定义的 ClassFilter 保护反序列化,该过滤器仅允许 Jenkins 核心或插件中定义的类型。CVE-2026-53435 的漏洞在于这 还不够:能够 POST 一个 config.xml 的攻击者可以让 Jenkins 将 任意核心/插件类型反序列化到从未期望该类型的上下文中,然后通过 Stapler 路由通过 HTTP 访问该对象。
这个 PoC 将一个 hudson.Plugin$DummyImpl(Jenkins 核心类型,因此通过位置白名单)植入到 ListView 的 <properties> 列表中——一个 DescribableList<ViewProperty>,在补丁前不强制其元素类型。植入的对象带有 baseResourceURL=file:/。然后,将 HTTP 请求路由到它,就可以直接从控制器的文件系统中提供文件。
通用的 ysoserial 链在这里 不可行——gadget 必须是 Jenkins/插件驻留类型才能通过过滤器。这个约束是整个游戏的关键。
仅对你拥有或明确授权测试的系统使用。
该 exploit 针对两个配置相同的容器运行——有漏洞的 2.555.2 和已修补的 2.555.3——以确认它利用了 这个 CVE 而非其他不相关的文件读取原语:
| 2.555.2(有漏洞) | 2.555.3(已修补) | |
|---|---|---|
createView | HTTP 200 | HTTP 200 |
存储的 <properties> | <hudson.Plugin_-DummyImpl/> — 存活 | <properties/> — 被清除 |
触发 → /etc/passwd | root:x:0:0:... — 读取成功 | 空 — 被阻止 |
已修补的版本接受请求,但修复 在反序列化时拒绝了植入的类型,因此 properties 列表返回空,没有可路由的内容。失败点正好落在公告描述的机制上——这使得它成为 CVE-2026-53435 的真正 PoC。
python3 exploit_cve_2026_53435_v2.py <base_url> <user> <pass> <remote_file> [view_name]
# 示例(针对你自己的实验室):
python3 exploit_cve_2026_53435_v2.py http://127.0.0.1:8080 <user> <pass> /etc/passwd
base_url — 目标的 http://host:port(纯 HTTP;除非实例实际终止 TLS,否则不要添加 https 前缀)。config.xml 权限(View/Configure)以及 Overall/Read 权限的账户。docker compose -f lab/docker-compose.yml up -d
# 有漏洞版本: http://127.0.0.1:8080 (Jenkins LTS 2.555.2)
# 已修补版本: http://127.0.0.1:8081 (Jenkins LTS 2.555.3, 阴性对照)
实验室通过 Groovy 初始化脚本配置了仅限本地的用户数据库,以便可以在没有外部 IdP 的情况下演练已认证的低权限路径。
2026-06-12(周五) 15:00 → 23:23 约 8 小时 20 分钟
15:00–15:12 搭建实验室(docker:有漏洞 2.555.2 / 已修补 2.555.3)+ 初步侦察
15:12–21:00 反序列化接收点与 gadget 分析
(Commons-Collections 绕过尝试失败 → 从 properties 转向 actions 再转回)
21:00–22:30 ClassFilter 分析 + 重新寻找 gadget,仅限于核心类型
22:30–23:00 工作 PoC(v1 → v2)+ 差异验证(有漏洞 vs 已修补)
其中大部分时间花在 分析 上,而非输入。Exploit 本身在最后约 30 分钟内完成——一旦正确的接收点和 gadget 被确定下来。
使用 Claude Code(Anthropic)构建,由作者交互式驱动:
完整的、经过轻度编辑的工作记录位于 transcript/——保持原始状态,包括死胡同。(仅做了轻度编辑以缓和语气并掩盖本地网络细节;未删除任何技术内容。)
仅用于授权的安全测试、研究和教育。作者和贡献者对滥用不承担任何责任。目标漏洞已被修补——请更新至 Jenkins LTS 2.555.3 / weekly 2.568 或更高版本。