项目介绍
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
项目地址
https://www.jenkins.io/zh/
漏洞概述
Jenkins 有一个内置的命令行界面CLI,在处理 CLI 命令时Jenkins 使用args4j 库解析 Jenkins 控制器上的命令参数和选项。此命令解析器具有一个功能,可以将@参数中后跟文件路径的字符替换为文件内容 ( expandAtFiles)。
根据Jenkins 官方描述,具有Overall/Read权限的攻击者可以读取整个文件,未授权的攻击者仅能读取文件前几行内容。攻击者可以通过读取jenkins文件获取相关密钥从而实现命令执行。
此功能默认启用,Jenkins 2.441 及更早版本、LTS 2.426.2 及更早版本默认不会禁用它。鉴于漏洞 exp 已公开,为避免您的资产受到影响,建议尽快安排修复升级方案。
影响版本
<= Jenkins 2.441、<= LTS 2.426.2
环境搭建
1、下载漏洞版本的jenkins
https://mirrors.jenkins.io/war-stable/
2、运行命令
java -jar jenkins.war --httpPort=8080
漏洞复现
1、下载jenkins-cli.jar,CLI 客户端可以直接在Jenkins主机下载
2、执行poc
漏洞分析
根据官方描述,问题出在args4j 库的expandAtFiles,因此在对应方法上直接下断点。根据调用堆栈,分析执行流程。
在main方法中会首先检查当前命令是否是who-am-i或者help,如果使用其他命令就会检查权限,并出现如下错误。
通过使用help命令绕过权限校验,继续跟踪调用流程。当getAtSyntax属性为true时,将通过expandAtFiles继续解析参数
在expandAtFiles中如果检测到@开头的参数,则会读取对应文件内容并返回
由于文件内容不符合参数格式要求,因此最后作为异常返回
由于读取的文件内容最后是通过异常返回的,因此不同的命令返回的结果长度不同,如果没有权限,则只能使用help或者who-am-i命令,返回的长度有限。但是当攻击者具备Overall/Read权限时,就可以使用更多jenkins命令,从而读取更多文件内容。这里仅仅分析漏洞原理,不在深究。
在新版本中,jenkins默认关闭了ALLOW_AT_SYNTAX参数
修复方式
升级到最新版或者禁用cli功能
参考链接
https://www.jenkins.io/security/advisory/2024-01-24/#SECURITY-3314
https://mp.weixin.qq.com/s/9xXO73YGi5xOQQ_Uakregw
https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/
https://github.com/jenkinsci/jenkins/commit/554f03782057c499c49bbb06575f0d28b5200edb