当前位置: 首页 > news >正文

fastjson漏洞--以运维角度进行修复


文章目录

  • 前言
  • 一、漏洞详情
  • 二、修复过程
    • 1.通过脚本方式修复
      • 1.1.脚本修复原理
      • 1.2.脚本演示
      • 1.3.执行脚本
    • 2. 手动升级包
      • 2.1.修复步骤
      • 2.2.遇到的问题


前言

该漏洞是三个月前由安全团队扫描出来的,主要影响是: FastJSON是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于具有执行效率高的特点,应用范围广泛。FastJSON 存在反序列化远程代码执行漏洞,漏洞成因是Fastjson autoType开关的限制可被绕过,然后反序列化有安全风险的类。攻击者利用该漏洞可实现在目标机器上的远程代码执行。本文主要从运维侧修复手段介绍了该漏洞的两种修复方式。


提示:以下是本篇文章正文内容,下面案例如果不放心,先自行在测试环境验证,验证通过后再上生产环境操作

一、漏洞详情

FastJSON是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于具有执行效率高的特点,应用范围广泛。 FastJSON 存在反序列化远程代码执行漏洞,漏洞成因是Fastjson autoType开关的限制可被绕过,然后反序列化有安全风险的类。攻击者利用该漏洞可实现在目标机器上的远程代码执行。 主要影响FastJSON<=1.2.80 版本

二、修复过程

修复过程涉及到服务重启,请自行确认重启时间

1.通过脚本方式修复

该版本涉及autotype行为变更,在某些场景会出现不兼容的情况

注意事项:1、该脚本适合以 lib 库形式依赖 fastjson-*.jar 包的Java微服务包,如 Springboot 打包的 jar 包。2、该脚本不支持直接打包 fastjson class 的 jar 包,即 jar 包中存在 "com/alibaba/fastjson/..." 类似结构,需要从代码升级修复。3、该脚本不支持docker 镜像包据说有签名校验,直接改镜像文件可能会导致不可用。由于环境所限,这种情况没有验证过。4、脚本适合 fastjson 全部版本。

1.1.脚本修复原理

1、扫描当前服务器所有jar包。
2、查看jar包依赖包中是否包括  fastjson-*.jar 包。
3、如果有,更新该依赖包为fastjson-1.2.83.jar。同时脚本在更新 jar 包之前,会备份该jar包到/export/fastjson_repair_workspace/backup_jars/ 目录下,防止替换后服务启动失败,后续方便回滚。

1.2.脚本演示

#!/bin/bash
# 2024-09-02
WORK_DIR="/root/fastjson_repair_workspace"
BACKUP_DIR="$WORK_DIR/backup_jars"
ALL_JARS="$WORK_DIR/all_jars.txt"
TARGET_JARS="$WORK_DIR/target_jars.txt"
DONE_FILE="$WORK_DIR/DONEFILE"
TARGET_VERSION="fastjson-1.2.81.jar" #修改为当前jar包中对应的fastjson包名,去lib目录下确认即可
FIX_VERSION="fastjson-1.2.83.jar"    #要确认升级的包#检查脚本执行环境是否具备超管权限
function check_env() {mkdir -p $BACKUP_DIRif [ $? -eq 1 ];thenecho "Permission denied, need root user"exitfi
}#检查脚本执行用户,必须以服务器管理员root用户执行
function check_user() {if [ "$(whoami)" != "root" ];thenecho "Need root user"exitfi
}#检查是否有zip命令
function check_zip() {which zip &> /dev/nullif [ $? -eq 1 ];thenecho "Install zip first"exitfi
}
#检查是否有unzip命令
function check_unzip() {which unzip &> /dev/nullif [ $? -eq 1 ];thenecho "Install unzip first"exitfi
}
#检查当前服务器环境中是否存在要修复的fastjson包
check_fastjson_jar() {if [ ! -f ./$FIX_VERSION ];thenecho "Fix task need $FIX_VERSION"exitfi
}#环境检查
function check_find_env() {check_usercheck_envcheck_zip
}function check_fix_env() {check_usercheck_envcheck_zipcheck_unzipcheck_fastjson_jar
}#查看服务器所有jar包
function find_all_jars() {echo "Finding all jars ..."mkdir -p $WORK_DIRif [ -f $ALL_JARS ];thenif [ -f $DONE_FILE ];thenecho "Jarlist exsit: $ALL_JARS"elserm -f $ALL_JARSecho "Jarlist broken, run again"exitfielsefind / -path "$BACKUP_DIR" -prune -o -path "/proc" -prune -o -print | grep "\.jar$" > $ALL_JARSif [ $? -eq 0 ];thentouch $DONE_FILEfifiecho "Find " $(wc -l $ALL_JARS|awk '{print$1}') " jars."echo
}function find_lib_jars() {echo $* > /tmp/tmp_jarlistwhile read line;dofastjson_version=$(echo $line|awk -F'/' '{print$NF}')if [[ "$fastjson_version" < "$TARGET_VERSION" ]];thenreturn 1fidone < /tmp/tmp_jarlistreturn 0
}#检查查找出来的jar包是否包含target_version版本的包
function find_target_jars() {echo "Finding target jars ..."> $TARGET_JARSnum=1while read jar;doret=$(unzip -l $jar 2> /dev/null | grep fastjson.*jar| grep -v "Archive")if [ -n "$ret" ];thenfind_lib_jars $retif [ $? -eq 1 ];thenecho "Find [$num] $jar"echo $jar >> $TARGET_JARS((num++))fielseret=$(unzip -l $jar 2> /dev/null | grep "com/alibaba/fastjson" |grep -v "Archive")if [ -n "$ret" ];thenecho "[NOT support] Find [$num] $jar"((num++))fifidone < $ALL_JARSecho "Find " $(wc -l $TARGET_JARS|awk '{print$1}') " target jars."echo
}#替换jar包
function update_jars() {jarpath=$1filepath=$2jarname=$(basename $jarpath)filedir=$(dirname $filepath)mkdir -p /export/fastjson_repair_workspace/libjars/cp $jarpath /export/fastjson_repair_workspace/libjars/$jarnamemkdir -p /export/fastjson_repair_workspace/libjars/$filedircp ./$FIX_VERSION /export/fastjson_repair_workspace/libjars/$filedircd /export/fastjson_repair_workspace/libjars/zip -d $jarname $filepathecho "adding: $filedir/$FIX_VERSION"jar -uf0 $jarname $filedir/$FIX_VERSIONcp -f $jarname $jarpathcd - &> /dev/nullrm -rf /export/fastjson_repair_workspace/libjars/*
}
#修复jar包
function fix_lib_jars() {jarpath=$1if [ ! -n "$(unzip -l $jarpath 2> /dev/null | grep fastjson.*jar | grep -v "Archive")" ];thenecho "[WARN] NOT Fixed"fiunzip -l $jarpath 2> /dev/null | grep fastjson.*jar | grep -v "Archive" > /tmp/tmp_jarlistwhile read line;dofastjson_version=$(echo $line|awk -F'/' '{print$NF}')if [[ "$fastjson_version" < "$TARGET_VERSION" ]];thenlibjar=$(echo $line|awk '{print$NF}')update_jars $jarpath $libjarecho "Fixed"fidone < /tmp/tmp_jarlist
}function fix_target_jars() {if [ ! -f $TARGET_JARS ];thenecho "run check first."exitfiecho "Fix target jars ..."echonum=1while read jar;doecho "==== $num ===="echo "Backup $jar"mkdir -p ${BACKUP_DIR}$(dirname $jar)cp -f $jar ${BACKUP_DIR}$(dirname $jar)echo "Fix $(basename $jar) ..."fix_lib_jars $jarecho((num++))done < $TARGET_JARSecho "Fixed " $(wc -l $TARGET_JARS|awk '{print$1}') " target jars."mv -f $TARGET_JARS ${TARGET_JARS}.fixed.$(date +%Y%m%d_%H%M%S)
}function usage() {echo "Version 1.0.0"echo "Usage: $0 [check|fix]"
}function check() {check_find_envfind_all_jarsfind_target_jars
}function fix() {check_fix_envfix_target_jars
}if [ "$1" = "check" ];thencheck
elif [ "$1" = "fix" ];thenfix
elseusage
fi

1.3.执行脚本

``

[root@prometheus ~]# chmod +x fastjson_repair.sh 
[root@prometheus ~]# sh fastjson_repair.sh 
Version 1.0.0
Usage: fastjson_repair.sh [check|fix] #check是检查包  fix是对fastjson包进行升级处理
[root@prometheus ~]# sh fastjson_repair.sh check
Finding all jars ...
Find  751  jars.Finding target jars ...
Find [1] /export/server/icity-client/icity-client-system-1.0.0.jar
Find [2] /export/server/icity-server/icity-server-system-1.0.0.jar
Find  2  target jars.  #发现了两个fastjson版本低于1.28.3版本的包

在这里插入图片描述
执行 ./fast_repaire.sh check脚本如下所示
在这里插入图片描述

vim java微服务包 查看jar中包含的fastjson包,果然低于1.28.3版本
在这里插入图片描述
执行fix命令


2. 手动升级包

有时,java微服务包使用上述脚本无法完成修复,而且研发不能快速配合修复,那么从运维角度出发进行修复

2.1.修复步骤

如下图所示

1、拷贝需要修复的jar包至某一个空目录下2、执行jar -xf   xxxx.jar 对包进行解压3、将解压后META-INF目录下的MANIFEST.MF文件 移动到跟META-INF目录平级  mv META-INF/MANIFEST.MF  ../4、cd BOOT-INF/lib/目录下,将低版本的fastjson包移除,将高版本的包移动到该目录下5、执行打包命令  jar -cfm0 xxx.jar  /xxx/xxx/MANIFEST.MF *6、将第5步构建好的包移动到对应的服务目录下,重新启动该服务,观察日志,没有报错;且vim  xxxx.jar 发现fastjson包为替换后的版本的包,则修复成功

在这里插入图片描述
在这里插入图片描述
将上述低版本的fastjson jar包从当前lib目录下删除,将fastjson-1.2.83高版本的包拷贝到lib目录下
在这里插入图片描述
重新执行打包命令构建新的java微服务包
在这里插入图片描述
将上述新构建好的jar包拷贝到原来的位置,并重新启动服务,查看服务日志是否报错,如果没报错,则fastjson漏洞修复完成

2.2.遇到的问题

	在执行java微服务包构建时,遇到了下方的错误The calling method's class, org.apache.catalina.authenticator.AuthenticatorBase, was loaded from the following location:jar:file:/export/system-server-1.0.0.jar!/BOOT-INF/lib/tomcat-embed-core-9.0.60.jar!/org/apache/catalina/authenticator/AuthenticatorBase.classThe called method's class, javax.servlet.ServletContext, is available from the following locations:jar:file:/export/system-server-1.0.0.jar!/BOOT-INF/lib/servlet-api-6.0.53.jar!/javax/servlet/ServletContext.classjar:file:/export/system-server-1.0.0.jar!/BOOT-INF/lib/tomcat-embed-core-9.0.60.jar!/javax/servlet/ServletContext.classThe called method's class hierarchy was loaded from the following locations:javax.servlet.ServletContext: jar:file:/export/system-server-1.0.0.jar!/BOOT-INF/lib/servlet-api-6.0.53.jar!/
解决方法:将BOOT-INF/lib/目录下的servlet-api-6.0.53.jar包替换为一个高版本的包,例如servlet-api-7.0.0.jar,然后重新执行上述构建即可解决。https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api/7.0.0   在上述地址可以下载这个包,重命名为对应的名字即可使用

至此,fastjson低版本漏洞修复的两种方法介绍完毕


相关文章:

fastjson漏洞--以运维角度进行修复

文章目录 前言一、漏洞详情二、修复过程1.通过脚本方式修复1.1.脚本修复原理1.2.脚本演示1.3.执行脚本 2. 手动升级包2.1.修复步骤2.2.遇到的问题 前言 该漏洞是三个月前由安全团队扫描出来的&#xff0c;主要影响是: FastJSON是阿里巴巴的开源JSON解析库&#xff0c;它可以解…...

82页精品PPT | 构建数字化工厂的智能制造-数字化智能制造

新模式、新技术 、新制造的挑战 中国制造业正处于转型升级的关键时期&#xff0c;面临着多方面的挑战。创新能力不足导致产品同质化严重&#xff0c;缺乏核心竞争力&#xff1b;质量管理水平参差不齐&#xff0c;影响着产品的可靠性和安全性&#xff1b;品牌价值不高&#xff…...

Python的10个日期和时间操作的实用技巧

在Python中&#xff0c;处理日期和时间是一项常见且重要的任务。datetime模块提供了丰富的功能来执行这些操作。以下是10个日期和时间操作的实用技巧及其代码演示&#xff1a; 1. 获取当前日期和时间 from datetime import datetimenow datetime.now() print(f"当前日期…...

关于大模型在产品开发中所面临的问题,利用大模型技术解决很简单!

“ 具体问题具体分析&#xff0c;大模型技术没有统一的解决方案 ” 有人说2024年是大模型应用的元年&#xff0c;而大模型在未来的发展潜力毋庸置疑&#xff0c;这也就意味着人工智能技术是下一个风口&#xff0c;因此各种各样基于大模型技术的创业公司如雨后春笋般涌现。 从…...

SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)

文章目录 一、功能说明二、案例实现1、基于请求头实现2、基于请求参数实现 一、功能说明 我们知道&#xff0c;用ResponseBody注解标注的接口&#xff0c;默认返回给页面的是json数据。 其实&#xff0c;也可以返回xml结构的数据给页面。 这一篇就来实现一下这个小功能。 二、…...

BUUCTF 之Basic 1(BUU LFI COURSE 1)

1、启动靶场&#xff0c;会生成一个URL地址&#xff0c;打开给的URL地址&#xff0c;会看到一个如下界面 可以看到是一个PHP文件&#xff0c;非常的简单&#xff0c;就几行代码&#xff0c;判断一下是否有一个GET的参数&#xff0c;并且是file名字&#xff0c;如果是并且加载&a…...

Android 蓝牙三方和动态权限三方

记录一下最近用到的简单的框架 蓝牙 FastBle&#xff1a;Android BLE通信库的介绍与高级用法 - 简书 https://github.com/Jasonchenlijian/FastBle 动态权限: GitHub - googlesamples/easypermissions: Simplify Android M system permissions 位置权限举例,arrayOf中多个…...

点餐|基于java的电子点餐系统小程序(源码+数据库+文档)

电子点餐系统|小程序|在线点餐 目录 基于java的电子点餐系统小程序 一、前言 二、系统设计 三、系统功能设计 系统功能实现 前台&#xff1a; 后台&#xff1a; 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; …...

18、Gemini-Pentest-v1

难度 中 &#xff08;个人认为是高&#xff09; 目标 root权限 一个flag 靶机启动环境为VMware kali 192.168.152.56 靶机 192.168.152.64 信息收集 突破点大概就是web端了 web测试 访问主页直接就是目录遍历 不过进去后是一个正常的网页 简单的试了几个弱口令无果继续信息…...

MIT6.824 课程-MapReduce

MapReduce&#xff1a;在大型集群上简化数据处理 概要 MapReduce是一种编程模型&#xff0c;它是一种用于处理和生成大型数据集的实现。用户通过指定一个用来处理键值对(Key/Value)的map函数来生成一个中间键值对集合。然后&#xff0c;再指定一个reduce函数&#xff0c; 它用…...

7个 C# 高阶用法详解:从基础到实战

C# 高阶用法详解&#xff1a;从基础到实战 在实际开发中&#xff0c;C# 提供了很多高级特性和设计模式&#xff0c;帮助我们写出更加简洁、灵活和高效的代码。本篇将深入探讨 C# 中的高阶用法&#xff0c;通过丰富的示例&#xff0c;带你掌握这些工具的精髓。 1. LINQ&#x…...

[数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1143 标注数量(xml文件个数)&#xff1a;1143 标注数量(txt文件个数)&#xff1a;1143 标注…...

【SQL】百题计划:SQL对于空值的比较判断。

[SQL]百题计划 方法&#xff1a; 使用 <> (!) 和 IS NULL [Accepted] 想法 有的人也许会非常直观地想到如下解法。 SELECT name FROM customer WHERE referee_Id <> 2;然而&#xff0c;这个查询只会返回一个结果&#xff1a;Zach&#xff0c;尽管事实上有 4 个…...

OJ在线判题系统项目笔记

项目介绍 在线评测编程题目代码的系统&#xff0c;出题人预先设置题目的输入样例和输出样例&#xff0c;根据用户提交代码&#xff0c;进行编译代码&#xff0c;运行代码&#xff0c;判断代码执行结果是否正确。 后端服务 网关服务 接收前端请求&#xff0c;转发到对应的服…...

期望极大算法(Expectation Maximization Algorithm,EM)

定义 输入:观测变量数据Y,隐变量数据Z,联合分布P(Y,Z| θ \theta θ),条件分布PP(Z,Y| θ \theta θ); 输出:模型参数 θ \theta θ (1)选择参数的初值 θ ( 0 ) , 开始迭代 ; \theta^{(0)},开始迭代; θ(0),开始迭代; (2)E步:记 θ ( i ) 为第 i 次迭代参数 \theta^{(i)}为第…...

初级练习[4]:多表查询——表联结

目录 多表查询:表联结示例 查询有两门以上的课程不及格的同学的学号及其平均成绩 查询所有学生的学号、姓名、选课数、总成绩 查询平均成绩大于85的所有学生的学号、姓名和平均成绩 查询学生的选课情况:学号,姓名,课程号,课程名称 查询出每门课程的及格人数和不及格人数 …...

基于JAVA+SpringBoot+Vue的中药实验管理系统

基于JAVASpringBootVue的中药实验管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…...

移动硬盘读取出错结构损坏?数据恢复实战指南

移动硬盘困境&#xff1a;读取出错与结构损坏 在日常的数据存储与传输中&#xff0c;移动硬盘以其大容量、便携性成为了众多用户的首选。然而&#xff0c;当移动硬盘遭遇读取出错或结构损坏的困境时&#xff0c;那些珍贵的文件、照片、视频等数据便岌岌可危&#xff0c;让人心…...

Web安全之HTTPS调用详解和证书说明案例示范

随着互联网的高速发展&#xff0c;网络安全成为了一个不可忽视的话题&#xff0c;特别是在涉及用户敏感信息的业务系统中。在此背景下&#xff0c;使用HTTPS取代HTTP成为了大势所趋。本文将以电商交易系统为例&#xff0c;详细介绍HTTPS的重要性&#xff0c;并探讨如何通过HTTP…...

man命令学习记录

使用man来查看命令的用法 man ls 想了解Linux命令的用法假设你想查ls命令的更多信息&#xff0c;输入man ls&#xff0c;就会打开man page&#xff08;man是manual的缩写&#xff0c;因此man page就是“手册页面”&#xff09;&#xff0c;显示关于ls命令各个方面的信息。 通常…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...