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镜像就可以了

posted @ 2024-02-04 10:03  高佳丰  阅读(692)  评论(0编辑  收藏  举报