Jenkins任意文件读取漏洞修复
漏洞描述
【高】Jenkins CLI 任意文件读取漏洞导致远程代码执行风险
Jenkins CLI 是 Jenkins 内置的命令行页面。 Jenkins 受影响版本中使用 args4j 库解析CLI命令参数,该库默认将参数中 @ 字符后的文件路径替换为文件内容,攻击者可利用该特性使用 Jenkins 控制器进程的默认字符编码读取 Jenkins 控制器文件系统上的任意文件(如加密密钥的二进制文件),并结合 Resource Root URL、Remember me cookie、存储型 XSS 或 CSRF 等在 Jenkins 控制器中执行任意代码。 Jenkins 2.442, LTS 2.426.3 版本通过禁用命令解析器读取 @ 字符后文件路径的特性修复此漏洞。
公开时间: 2024/01/24
CVE编号: CVE-2024-23897
漏洞类型: 路径遍历
漏洞等级: 高
利用可能性: 中
攻击向量: -
攻击成本: 中
影响范围: 一般
有无PoC/EXP: 无
情报来源: OSCS社区
影响组件:
1.org.jenkins-ci.main:jenkins-core@(-∞, 2.442)
2.jenkins@(-∞, 2.442)
3.jenkins lts@(-∞, 2.426.3)
排查方式:
1.获取 org.jenkins-ci.main:jenkins-core 版本,判断其版本 < 2.442
2.获取 jenkins 版本,判断其版本 < 2.442
3.获取 jenkins lts 版本,判断其版本 < 2.426.3
修复方案:
1.将 org.jenkins-ci.main:jenkins-core 升级至 2.442 及以上版本
2.禁用Jenkins CLI:设置 Java 系统属性 hudson.cli.CLICommand.allowAtSyntax 为 true
3.将 jenkins 升级至 2.442 及以上版本
4.将组件 jenkins lts 升级至 2.426.3 及以上版本
参考链接:
1.https://www.oscs1024.com/hd/MPS-nw0b-89j6https://www.oscs1024.com/hd/MPS-nw0b-89j6
2.https://www.jenkins.io/security/advisory/2024-01-24/https://www.jenkins.io/security/advisory/2024-01-24/
3.https://github.com/jenkinsci/jenkins/commit/de450967f38398169650b55c002f1229a3fcdb1bhttps://github.com/jenkinsci/jenkins/commit/de450967f38398169650b55c002f1229a3fcdb1b
4.https://github.com/jenkinsci/jenkins/commit/554f03782057c499c49bbb06575f0d28b5200edbhttps://github.com/jenkinsci/jenkins/commit/554f03782057c499c49bbb06575f0d28b5200edb
修复步骤
1、检查当前Jenkins版本
可直接登录Jenkins页面查看,2.319.1版本,不属于上述漏洞的安全版本,需要升级
2、升级Jenkins
因为我这边是k8s中部署的jenkins,所有这边只需修改一下deployment的image版本,其他的不变。
...... spec: containers: - image: jenkins/jenkins:2.442 imagePullPolicy: IfNotPresent ......
修改之后pod正常启动,我们访问页面查看新版本
2.224就属于安全版本了。
到这里升级只进行到了一小半,哪些插件不升级是没法正常发版的,尤其是关键的pipeline相关的的重要插件。但是这个也相对好解决,在插件管理处页面点击跟新就行了,如果下载失败可以试试更换下载源,我这边提供一个清华源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
到这正常来说就结束了,但我这边还是存在两个问题没解决。
(1)新版本的Jenkins是基于java17运行的,但是我们这边的项目都是基于java8开发的,这就导致项目没法编译通过。我这里的解决方案是在jenkins容器中部署一个java8的环境,在mvn clean之前先source 应用一下java8这个环境,再次mvn clean 就没问题了。
(2)我在老版本的Jenkins上添加了k8s 动态slave节点,更新之后slave的pod能启动但状态是离线的,通过日志排查出来还是java版本问题,我原来的slave节点的镜像里面启动的是java8,现在master是java17,两个版本不一致导致的换一个java17的Jenkins-jnlp镜像就可以了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了