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命令各个方面的信息。 通常…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
