别忽视!大量企业Jenkins面临沦陷,攻击者可窃取全部流水线凭据

admin 2026-09-10 05:08:15 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析JenkinsCVE-2026-84645反序列化漏洞,低权限用户可提权至RCE,影响weekly≤2.579及LTS≤2.568.2。漏洞源于XStream反序列化缺陷,攻击者可窃取流水线凭据。建议立即升级至2.580或2.568.3,收紧Item/Configure权限并审计异常请求。 综合评分: 88 文章分类: 漏洞分析,漏洞预警,安全工具,解决方案


别忽视!大量企业Jenkins面临沦陷,攻击者可窃取全部流水线凭据

零日手记 零日手记

随笔漫记安全路

2026年9月7日 08:34 北京

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

9月2日,Jenkins发布安全更新,一次性修了13个CVE。其中最值得关注的是CVE-2026-84645——一个反序列化漏洞,允许持有Item/Configure权限的低权限用户将权限提升为任意代码执行。

CVSS 8.8。这不是未认证漏洞,但从”能配置一个Job”到”拿Jenkins服务器的shell”,权限提升幅度极大。大量Jenkins实例中,开发者账号都有Job配置权限。


漏洞根因:XStream反序列化的两个缺陷

Jenkins使用XStream做配置和构建数据的序列化/反序列化。JEP-200限制了哪些类可以被反序列化,但没有限制这些类在对象图中的位置

缺陷一:PersistenceRoot可以作为嵌套字段被反序列化

PersistenceRoot是Jenkins中标记”配置存储在独立顶层文件中”的类型。JEP-200限制了能反序列化的类,但没限制反序列化发生的位置——任何类型为PersistenceRoot子类的字段都会被当作普通对象反序列化。

XStream通过Unsafe.allocateInstance实例化对象(不调用构造函数)。攻击者可以伪造一个第二个hudson.model.Hudson单例,并设置任意字段值——包括authorizationStrategy(授权策略)。

缺陷二:transient字段也被反序列化

Jenkins的XStream兼容行为允许将数据反序列化到transient字段中。Stapler请求路由所需的对象引用(FingerprintAction.buildRun.projectAbstractItem.parent)都是transient字段——注入的对象通过这些字段变得可通过HTTP访问。


Gadget链:从config.xml到Script Console

攻击者只需Item/Configure权限(能修改Job配置),通过POST /job/<job>/config.xml注入恶意XML到Job的<actions>中:

<actions>
&nbsp;&nbsp;<hudson.tasks.Fingerprinter_-FingerprintAction>
&nbsp; &nbsp;&nbsp;<build&nbsp;class="hudson.model.FreeStyleBuild">
&nbsp; &nbsp; &nbsp;&nbsp;<project&nbsp;class="hudson.model.FreeStyleProject">
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<parent&nbsp;class="hudson.model.Hudson">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<authorizationStrategy&nbsp;class="hudson.security.AuthorizationStrategy$Unsecured"/>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</parent>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<name>...</name>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<properties/>
&nbsp; &nbsp; &nbsp;&nbsp;</project>
&nbsp; &nbsp;&nbsp;</build>
&nbsp; &nbsp;&nbsp;<record/>
&nbsp;&nbsp;</hudson.tasks.Fingerprinter_-FingerprintAction>
</actions>

注入后,Stapler(Jenkins的Web框架)按URL路径逐级解析请求,路由进伪造的对象图:

| URL路径段 | 解析到 | 代码路径 | | — | — | — | | /job/<job>/fingerprints | 注入的FingerprintAction | urlUrl=="fingerprints"Actionable.getDynamic() | | /run | 伪造的FreeStyleBuild | FingerprintAction.getRun() 读transient build | | /parent | 伪造的FreeStyleProject | Run.getParent()final transient project | | /parent | 伪造的Hudson | AbstractItem.getParent() 读transient parent | | /scriptText | 伪造实例的Script Console | Jenkins.doScriptText() → _doScript(..., getACL()) |

授权绕过的核心doScriptText检查ADMINISTER权限,但检查的是接收到请求的那个实例的ACL——也就是伪造的Hudson。伪造的Hudson的authorizationStrategy设为AuthorizationStrategy$Unsecured(不限制任何操作),所以权限检查直接通过。真正的Jenkins控制器的授权策略完全不参与。

访问/job/<job>/fingerprints/run/parent/parent/scriptText,带着Groovy脚本——以Jenkins服务账户权限执行任意代码。


利用条件

  • 需要认证(有效账号)
  • 账号需要对至少一个Job有Item/Configure权限
  • Jenkins weekly ≤ 2.579,LTS ≤ 2.568.2

PoC已公开(mhtsec/CVE-2026-84645),一条命令:

python3 exp.py --url http://target:8080 --user user --password pass --cmd&nbsp;id

脚本先验证账号没有script权限(预期403),然后提交恶意config.xml,最后路由到Script Console执行命令。


修复分析(2.580)

修复做了三件事:

  1. PersistenceRoot不允许作为嵌套字段——RobustReflectionConverter.doUnmarshal拒绝将PersistenceRoot子类反序列化到嵌套字段中,抛出CriticalXStreamException
  2. transient字段严格模式——新增@XStreamNotDeserializable/@XStreamDeserializable注解+TRANSIENT_FIELD_STRICT_MODE收紧transient字段反序列化
  3. Jenkins单例保护——Jenkins.readResolve()拒绝反序列化第二个Jenkins单例,并增加writeReplace()替换器

这次一共修了13个CVE

9月2日的安全更新不止CVE-2026-84645一个,一共修了13个CVE:

| CVE | CVSS | 类型 | | — | — | — | | CVE-2026-84645 | 8.8 | 反序列化→RCE(SECURITY-3972) | | CVE-2026-84646 | 8.8 | 公共静态字段设置 | | CVE-2026-84647 | 8.8 | Stapler表单数据绑定 | | CVE-2026-84648 | 8.8 | 日志查看器未转义元数据 | | CVE-2026-84649 | 8.8 | Stapler路径处理 | | CVE-2026-84650 | — | — | | CVE-2026-84651~84657 | — | — |

13个CVE,多个CVSS 8.8,全部在同一批修复。


修复建议

  1. 立即升级到weekly ≥ 2.580 / LTS ≥ 2.568.3
  2. 收紧Item/Configure权限——只给可信管理员
  3. 审计访问日志,关注以下模式:
  • 异常的POST /job/*/config.xml请求(包含嵌套Fingerprinter_-FingerprintActionhudson.model.Hudson
  • /job/*/fingerprints/run/parent/parent/scriptText的请求
  1. 注入是内存态的(transient),重启Jenkins可清除——但攻击者可重新提交
  2. 检查Job的config.xml是否被污染

Jenkins是企业CI/CD核心,拿下Jenkins=拿到所有构建产物+部署密钥+源代码。这个漏洞把”能配Job”提升到”能RCE”,大量组织中开发者都有Job配置权限。


参考链接

  • Jenkins安全通告:jenkins.io/security/advisory/2026-09-02/#SECURITY-3972
  • PoC:github.com/mhtsec/CVE-2026-84645
  • NVD:nvd.nist.gov/vuln/detail/CVE-2026-84645
  • oss-security邮件列表:openwall.com/lists/oss-security/2026/09/02/4

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:随笔漫记安全路 零日手记 零日手记《别忽视!大量企业Jenkins面临沦陷,攻击者可窃取全部流水线凭据》

评论:0   参与:  0