一、前言
因近期安全扫描,发现java后端应用涉及多个引用组件版本过低,涉及潜在漏洞利用风险,特记录相关处理升级处理过程,以备后续确认;
二、升级处理过程
2.1、Java类应用内置Spring Boot版本升级
Spring Boot是一款基于Spring框架的快速开发框架,它提供了一系列的开箱即用的功能和组件,但升级过程中可能会有一些特定于项目的配置或依赖项也需要进行对应的适配调整。版本升级前,在本地/测试环境中进行充分的测试和验证,确保没有引入新的兼容性问题或其他不可预见的错误;
目标:将 Spring Boot 升级到 2.5.15、2.6.15、2.7.12、3.0.7 及以上版本;否则涉及Spring Boot 拒绝服务漏洞(CVE-2023-20883);参考过程如下:
主要过程如下:
1、确定当前的Spring Boot版本:可以在项目的pom.xml文件中查看当前使用的Spring Boot版本号。有的里面使用环境变量引用,可直接看依赖BOOT-INF/lib/spring-boot-2.7.9.jar 包
2、查看官方文档:访问Spring Boot的官方文档网站(https://docs.spring.io/spring-boot/docs/)和版本发布,对比需要升级的目标版本,查看最新的发布版本和更新的内容。
3、更新pom.xml文件/依赖的spring-boot包:将pom.xml文件中的Spring Boot版本号改为最新的/需要的版本号。可以通过在Maven仓库中搜索最新的Spring Boot版本号,然后将其替换掉pom.xml文件中原有的版本号。
4、解决依赖冲突:升级Spring Boot版本可能会导致一些依赖冲突的问题。可以使用Maven的dependencyManagement元素来解决这些问题。在pom.xml文件中添加dependencyManagement元素,并将冲突的依赖项的版本号设置为所需的版本号。
5、运行测试用例:在升级完成后,运行项目的测试用例,确保升级后的版本没有引入新的bug或问题后,运行mvn package命令打出jar包,即发新的包进行部署
6、部署和运行:在升级完成后,重新构建项目并将其部署到服务器上进行测试和生产环境的运行。
另外可参考:spring boot中spring框架的版本升级;
2.2、Java类应用内置 MyBatis 组件升级
MyBatis是美阿帕奇(Apache)软件基金会的一款优秀的持久层框架。 MyBatis存在远程代码执行漏洞,该漏洞源于错误处理对象流的反序列化。攻击者可利用漏洞将对象反序列化后存储至redis服务器中。
目标:对现场后台应用组件 MyBatis 升级到 3.5.6 及以上版本;下载地址:https://github.com/mybatis/mybatis-3/releases,现场:BOOT-INF/lib/mybatis-3.4.6.jar,否则涉及MyBatis远程代码执行漏洞(CVE-2020-26945);升级过程同上,修改版本,调试无报错后重新发包,部署替换,升级到最新版Mybatis 3.5.15;
2.3、Apache Commons FileUpload 组件升级
Apache Commons FileUpload 包可以提供强大的、高性能的、文件上传能力。 Apache Commons FileUpload 存在安全漏洞,由于1.5 版本之前的Commons FileUpload对处理的请求部分的数量没有限制,攻击者有可能通过恶意上传或一系列上传触发 DoS。低于1.5版本的涉及Apache Commons FileUpload 拒绝服务漏洞(CVE-2023-24998);
目标:将 Commons FileUpload 升级到 1.5 及以上版本,下载地址;现场版本:BOOT-INF/lib/commons-fileupload-1.2.2.jar,该组件依赖java版本,现场Java版本 “1.8.0_391”,FileUpload组件还依赖于commons IO组件,现场版本:BOOT-INF/lib/commons-io-2.5.jar。
注:在Spring Boot开发的Web应用程序中,处理文件上传在早期的Spring Boot版本中,通常使用
commons-fileupload库来处理文件上传。然而,随着时间的推移,commons-fileupload库已经过时,不再推荐
使用,Spring Boot社区推荐使用commons-fileupload2-jakarta库来代替旧的commons-
fileupload库。
1、首先,确定当前使用的 Apache Commons FileUpload 版本。可以在项目的依赖管理文件(如 Maven 或 Gradle)中查看相关信息。
2、打开官方网站 https://commons.apache.org/proper/commons-fileupload/index.html,并导航到 “Download” 页面。根据需求选择最新的版本号,点击对应的下载链接获取 JAR 包。也可以通过 Maven 或 Gradle 等构建工具来添加依赖。
3、将下载得到的 JAR 包复制到项目的类路径下,或者将其添加为 Maven 或 Gradle 项目的依赖。
4、更新项目中所有引用了 Apache Commons FileUpload 的地方,确保正确调用新版本提供的 API。
5、运行测试,确认项目能够成功编译、部署和运行,调试修改现有代码以适配新版本。重新运行测试,确保没有因升级而引入任何错误或 bug。
6、将 Apache Commons FileUpload 升级到最新版本后重新发包,部署到生产后确认。
2.4、Apache Commons Collections 组件
Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有力的数据结构类型并且实现了各种集合工具类。作为Apache开源项目的重要组件,Commons Collections被广泛应用于各种Java应用的开发。 Apache Commons Collections库实现了一个TransformedMap类,该类是对Java标准数据结构Map接口的一个扩展。该类可以在一个元素被加入到集合内时,自动对该元素进行特定的修饰变换,具体的变换逻辑由Transformer类定义,Transformer在TransformedMap实例化时作为参数传入。而Apache Commons Collections已经内置了一些常用的Transformer,如InvokerTransformer类。研究人员发现InvokerTransformer类可以通过调用Java的反射机制来调用任意函数,从而导致任意代码执行。 Apache Commons Collections在3.2.2版本中做了一定的安全处理,对InvokerTransformer、InstantiateTransformer等不安全的Java类的序列化支持增加了开关,开关默认为关闭状态。 如果没有开启不安全类的序列化开关,漏洞利用时则会抛出异常。 Commons Collections4中也存在内置的可能被攻击的类,存在被反序列化利用的风险。
目标:将 Apache Commons Collections 升级到 3.2.2、4.1 及以上版本,版本可参考下载地址,否则涉及Apache Commons Collections 反序列化漏洞;现场版本:BOOT-INF/lib/commons-collections-3.2.jar;需升级到最新的3.3.3版本,它依赖Java 1.3及以上,现场Java版本为:1.8.0_391。
jar -tf ./dialup-service.jar |grep "commons-collections" #输出如下
BOOT-INF/lib/commons-collections-3.2.jar
BOOT-INF/lib/commons-collections4-4.1.jar
#下载最新版本的 commons-collections。,将最新版本的 commons-collections 复制到我们的项目中的 BOOT-INF/lib 目录下
#更新项目中的依赖关系,编辑pom.xml 文件中,将 commons-collections 的版本号更新为最新版本
#重新编译和运行项目,直到无报错后,重新发包,部署替换,完成升级
2.5、Flink引用hadoop
Apache Hadoop是美国阿帕奇(Apache)基金会的一套开源的分布式系统基础架构。该产品能够对大量数据进行分布式处理,并具有高可靠性、高扩展性、高容错性等特点。 Apache Hadoop YARN CapacityScheduler 中的 ZKConfigurationStore 由于没有验证从 ZooKeeper 获得的数据就进行反序列化处理,使得有权访问 ZooKeeper 的攻击者通过特制数据以 YARN 用户身份运行任意命令。
目标:将 Hadoop 升级到 2.10.2、3.2.4、3.3.4 及以上版本,版本选择参考下载地址;现场版本:hadoop-3.3.2(官方建议升级到 3.3.6)、flink-1.15.1;低于此版本的涉及Apache Hadoop YARN 远程代码执行漏洞(CVE-2021-25642)。
2.6、XXL-JOB应用
XXL-JOB是一个轻量级分布式任务调度平台。默认情况下XXL-JOB的API接口没有配置认证,在API接口未授权访问的情况下,攻击者通过向API发送精心构造的请求,可以造成远程命令执行。下载地址:https://gitee.com/xuxueli0323/xxl-job
目的:默认不配置认证确公网暴露的情况下,涉及XXL-JOB API 接口未授权访问远程命令执行漏洞,因此我们需增加授权验证,配置 xxl.job.accessToken 防止未授权访问漏洞。
#调度中心配置文件地址
/xxl-job/xxl-job-admin/src/main/resources/application.properties
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=Weq34r2
#相关文件说明
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
xxl-job-executor-sample-frameless:无框架版本;
#执行器 AccessToken 配置:xxl-job-executor-sample-springboot
xxl:
job:
accessToken: Weq34r2
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
或直接页面配置,打开http://localhost:80807/xxl-job-admin/:
2.7、Java应用内置tomcat组件
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 Tomcat存在输入验证错误漏洞,该漏洞源于存在不正确的输入验证漏洞,可能会导致将单个请求视为多个请求,从而在反向代理后面出现请求走私。
目标:将 Tomcat 升级到 11.0.0-M11、10.1.16、9.0.83(官方最新9.0.85)、8.5.96 及以上版本,版本参考官网;低于9.0.80版本的涉及Tomcat 输入验证错误漏洞(CVE-2023-46589)、Tomcat 输入验证错误漏洞(CVE-2023-45648)、Tomcat 开放重定向漏洞(CVE-2023-41080),低于9.0.71版涉及Tomcat 拒绝服务漏洞(CVE-2023-24998)、低于9.0.72版涉及Tomcat 安全漏洞(CVE-2023-28708)、Tomcat Session 反序列化代码执行漏洞(CVE-2021-25329);对低于8.5.68、9.0.48、10.0.7 的Tomcat 涉及请求走私漏洞(CVE-2021-33037)、低于9.0.40涉及Tomcat 本地权限提升漏洞(CVE-2022-23181)、Tomcat 拒绝服务漏洞(CVE-2022-29885)、Tomcat 信息泄露漏洞(CVE-2021-24122)。
。
jar -tf dialup-controller.jar|grep "tomcat" #版本检查
BOOT-INF/lib/tomcat-embed-core-9.0.76.jar
BOOT-INF/lib/tomcat-embed-el-9.0.76.jar
BOOT-INF/lib/tomcat-embed-websocket-9.0.76.jar
#下载最新版本的 Tomcat Embed Core JAR 文件
wget http://archive.apache.org/dist/tomcat/tomcat-9/v9.0.85/bin/embed/apache-tomcat-9.0.85-embed.tar.gz
#替换现有的现有的 tomcat-embed-core-9.0.76.jar 文件
mv tomcat-embed-core-9.0.76.jar tomcat-embed-core-9.0.76.jar.bak
mv tomcat-embed-core-9.0.85.jar tomcat-embed-core-9.0.76.jar
#重新编译发布我们的java应用
mvn clean install
java -jar target/dialup-controller.jar
#部署替代环境现有应用