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.遇到的问题 前言 该漏洞是三个月前由安全团队扫描出来的,主要影响是: FastJSON是阿里巴巴的开源JSON解析库,它可以解…...

82页精品PPT | 构建数字化工厂的智能制造-数字化智能制造
新模式、新技术 、新制造的挑战 中国制造业正处于转型升级的关键时期,面临着多方面的挑战。创新能力不足导致产品同质化严重,缺乏核心竞争力;质量管理水平参差不齐,影响着产品的可靠性和安全性;品牌价值不高ÿ…...
Python的10个日期和时间操作的实用技巧
在Python中,处理日期和时间是一项常见且重要的任务。datetime模块提供了丰富的功能来执行这些操作。以下是10个日期和时间操作的实用技巧及其代码演示: 1. 获取当前日期和时间 from datetime import datetimenow datetime.now() print(f"当前日期…...

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

SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)
文章目录 一、功能说明二、案例实现1、基于请求头实现2、基于请求参数实现 一、功能说明 我们知道,用ResponseBody注解标注的接口,默认返回给页面的是json数据。 其实,也可以返回xml结构的数据给页面。 这一篇就来实现一下这个小功能。 二、…...

BUUCTF 之Basic 1(BUU LFI COURSE 1)
1、启动靶场,会生成一个URL地址,打开给的URL地址,会看到一个如下界面 可以看到是一个PHP文件,非常的简单,就几行代码,判断一下是否有一个GET的参数,并且是file名字,如果是并且加载&a…...
Android 蓝牙三方和动态权限三方
记录一下最近用到的简单的框架 蓝牙 FastBle:Android BLE通信库的介绍与高级用法 - 简书 https://github.com/Jasonchenlijian/FastBle 动态权限: GitHub - googlesamples/easypermissions: Simplify Android M system permissions 位置权限举例,arrayOf中多个…...

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

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

MIT6.824 课程-MapReduce
MapReduce:在大型集群上简化数据处理 概要 MapReduce是一种编程模型,它是一种用于处理和生成大型数据集的实现。用户通过指定一个用来处理键值对(Key/Value)的map函数来生成一个中间键值对集合。然后,再指定一个reduce函数, 它用…...
7个 C# 高阶用法详解:从基础到实战
C# 高阶用法详解:从基础到实战 在实际开发中,C# 提供了很多高级特性和设计模式,帮助我们写出更加简洁、灵活和高效的代码。本篇将深入探讨 C# 中的高阶用法,通过丰富的示例,带你掌握这些工具的精髓。 1. LINQ&#x…...

[数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1143 标注数量(xml文件个数):1143 标注数量(txt文件个数):1143 标注…...

【SQL】百题计划:SQL对于空值的比较判断。
[SQL]百题计划 方法: 使用 <> (!) 和 IS NULL [Accepted] 想法 有的人也许会非常直观地想到如下解法。 SELECT name FROM customer WHERE referee_Id <> 2;然而,这个查询只会返回一个结果:Zach,尽管事实上有 4 个…...
OJ在线判题系统项目笔记
项目介绍 在线评测编程题目代码的系统,出题人预先设置题目的输入样例和输出样例,根据用户提交代码,进行编译代码,运行代码,判断代码执行结果是否正确。 后端服务 网关服务 接收前端请求,转发到对应的服…...
期望极大算法(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技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈…...

移动硬盘读取出错结构损坏?数据恢复实战指南
移动硬盘困境:读取出错与结构损坏 在日常的数据存储与传输中,移动硬盘以其大容量、便携性成为了众多用户的首选。然而,当移动硬盘遭遇读取出错或结构损坏的困境时,那些珍贵的文件、照片、视频等数据便岌岌可危,让人心…...
Web安全之HTTPS调用详解和证书说明案例示范
随着互联网的高速发展,网络安全成为了一个不可忽视的话题,特别是在涉及用户敏感信息的业务系统中。在此背景下,使用HTTPS取代HTTP成为了大势所趋。本文将以电商交易系统为例,详细介绍HTTPS的重要性,并探讨如何通过HTTP…...
man命令学习记录
使用man来查看命令的用法 man ls 想了解Linux命令的用法假设你想查ls命令的更多信息,输入man ls,就会打开man page(man是manual的缩写,因此man page就是“手册页面”),显示关于ls命令各个方面的信息。 通常…...

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

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
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 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...