CVE-2024-23897 Jenkins 未授权任意文件读取漏洞分析
漏洞概述
CVE-2024-23897是Jenkins中存在的一个严重安全漏洞,允许攻击者通过Jenkins CLI接口读取服务器上的任意文件。该漏洞源于Jenkins在处理CLI命令时使用args4j库解析参数的方式存在缺陷。
漏洞细节
受影响版本
- Jenkins weekly <= 2.441
- Jenkins LTS <= 2.426.2
漏洞描述
Jenkins是基于Java开发的一种持续集成工具。该漏洞存在于Jenkins CLI(命令行接口)中,当使用args4j库解析CLI命令参数时,攻击者可利用相关特性读取Jenkins控制器文件系统上的任意文件,包括敏感文件如加密密钥的二进制文件。结合其他功能可能导致任意代码执行。
技术背景
Jenkins CLI允许用户通过命令行与Jenkins服务器交互。在处理CLI命令时,Jenkins使用args4j库来解析命令参数和选项。这个命令解析器有一个功能,可以用文件的内容(expandAtFiles)替换参数中的@字符和文件路径,此功能默认启用。
漏洞复现
环境搭建
使用Docker快速搭建受影响版本的Jenkins环境:
docker pull bitnami/jenkins:2.426.2-debian-11-r3
docker run -e "JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005" -d --name jenkins -p 8081:8080 -p 8777:5005 bitnami/jenkins:2.426.2-debian-11-r3
默认管理员账号密码为:user/bitnami
漏洞利用
使用Jenkins CLI工具执行命令并读取任意文件:
java -jar jenkins-cli.jar -s http://<target>:8081 who-am-i '@/etc/passwd'
此命令会尝试读取服务器上的/etc/passwd文件。
漏洞分析
关键代码路径
CLICommand#getCmdLineParser- 获取参数解析器- 判断当前指令类型
parseArgument()- 处理参数expandAtFiles方法 - 处理@符号开头的参数
漏洞触发流程
- 攻击者通过CLI发送包含@符号和文件路径的命令
- Jenkins使用args4j库解析命令参数
- 由于
getAtSyntax默认为true,会进入expandAtFiles方法 - 方法检查参数是否以@符号开头
- 如果是,则尝试读取@符号后指定的文件内容
- 文件内容被返回给攻击者
补丁分析
补丁链接:
https://github.com/jenkinsci/jenkins/compare/jenkins-2.441...jenkins-2.442#diff-5918f52b773cba16c7e0a74e139d637ae4b4f59e18435f1f1dc137979a46ae4c
主要修复方式是禁用或限制args4j库的@文件扩展功能,或者增加严格的权限检查。
防御措施
-
升级Jenkins到安全版本:
- Jenkins weekly >= 2.442
- Jenkins LTS >= 2.426.3
-
临时缓解措施:
- 禁用Jenkins CLI接口
- 限制网络访问Jenkins管理端口
- 实施严格的网络访问控制
-
监控和检测:
- 监控异常的文件读取行为
- 检查日志中的可疑CLI命令
总结
CVE-2024-23897是一个典型的因库功能滥用导致的安全漏洞,由于args4j库的@文件扩展功能默认启用且缺乏足够的安全检查,导致攻击者可以读取服务器上的任意文件。这类漏洞强调了在集成第三方库时需要充分了解其功能和安全影响的重要性。