fastjson漏洞升级修复小记

本文详细介绍了FastJSON序列化框架中的远程执行漏洞及其修复方法。包括升级FastJSON版本、增加autotype白名单,并通过反射机制确保兼容性。

自从3.15温少公布了这个安全升级公告,在不少同行朋友圈里广为流传,最诧异的不外乎“一个序列化框架竟然会出现远程执行的漏洞”,其实如果用过fastjson的序列化类名功能就不难想到,在序列化写入类名后,反序列化时必然会用到这个类名进行对象类型的识别和创建。

public static void main(String[] args) throws IOException {
		Model t = new Model();
		t.setName("test");
		String json = JSON.toJSONString(t, SerializerFeature.WriteClassName);
		System.out.println(json);
		System.out.println(JSON.parseObject(json,Object.class));
	}
	static class Model{
		private String name;

		public String getName() {
			return name;
		}

		public Model setName(String name) {
			this.name = name;
			return this;
		}
	}

输出:

{"@type":"fastjson.FastjsonBugTest$Model","name":"test"}

fastjson.FastjsonBugTest$Model@763d9750

在没有限制反序列化类型的前提下,理论上是可以构建出一些有意思的特殊对象的,感兴趣可以尝试。这里只说修复。

升级fastjson版本

由于线上环境比较复杂,一个业务线包含10+项目,都使用maven管理,有一些项目是maven多模块项目。加上开发时间不同,开发人员不同,没有统一管理,这就形成了错综复杂的依赖关系。单说fastjson的依赖,版本有1.2.6,1.1.46,1.1.41,1.2.8...总之是不少。

关于如何升级修复版本,官方给出了比较详尽的兼容列表,照着升就行了。

增加autotype白名单

由于在缓存层依赖fastjson使用className做反序列化的自动类型判断,直接升级的话,会禁止autotype功能,需要添加可反序列化的白名单。

static{
    ParserConfig.getGlobalInstance().addAccept("com.xxxx.");
}

修改完成后运行了几天是没有问题的。但是过了几天,另一个业务线的同事上线一个新功能,重启之后失败,不停地报不能实例化实例的异常。查看了异常堆栈,发现是静态代码块抛出了异常NoSuchMethodError。原因是此业务线之前的同事阴差阳错地引用了我们业务线的依赖,在使用时加载了自己的低版本的fastjson,ParserConfig不支持addAccept方法。

虽然这种方式本来就不是正确的,但是本着程序健壮性的原则,修改了一下代码,使用反射调用方法:

static {

        // 针对fastjson暴露的严重bug修改 开启autotytype白名单 https://github.com/alibaba/fastjson/wiki/enable_autotype
        String methodName = "addAccept";
        String args = "com.xxxxx.";
        ParserConfig parserConfig = ParserConfig.getGlobalInstance();
        boolean executed = false;
        try {
            for(Method m : ParserConfig.class.getDeclaredMethods()){
                if(m.getName().equals(methodName)){
                    m.invoke(parserConfig, args);
                    executed = true;
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (Throwable e){
            e.printStackTrace();
        }
        // 执行不成功的依然使用老版本fastjson,无需开启白名单
        System.out.println("fastjson 漏洞修复,白名单添加结果: "+executed);
    }

注意要使用会优先加载的类,推荐写一个类放到容器中进行加载。 升级整体上还是比较简单的,官方给出的方法也比较详尽,只要注意一下多项目的兼容就OK了。

转载于:https://my.oschina.net/bfleeee/blog/872166

### Fast 路由器固件漏洞详情及安全升级方法 #### 4.1 避免固件升级风险 在进行Fast路由器固件升级时,需要注意多个方面以确保过程顺利并减少潜在的风险。为了防止因不当操作引发的问题,务必遵循官方发布的具体指导说明[^1]。 对于提到的`FastAdmin`后台开发框架中存在的任意文件读取漏洞,此问题源于`/index/ajax/lang`接口的设计缺陷,允许未授权访问者获取敏感数据,如数据库配置和其他系统设置信息,这无疑给站点带来了严重的安全隐患[^3]。 针对上述提及的安全隐患,采取如下措施可以有效降低风险: - **备份现有配置**:在执行任何更改之前保存当前系统的全部参数设定,以便出现问题时能迅速恢复到先前稳定的状态。 - **确认来源合法性**:只下载来自制造商官方网站或其他可信渠道提供的最新版固件包,避免第三方平台可能存在的恶意篡改版本。 - **阅读发行日志**:仔细查看每次发布的新特性介绍文档,特别是有关修复哪些已知错误的信息部分,从而判断此次更新是否解决了所关心的具体问题。 - **测试环境先行**:如果条件允许的话,在正式部署前先在一个隔离的小规模网络环境中试运行一段时间,观察是否有异常情况发生再决定大规模推广。 - **监控反馈机制建立**:完成安装之后持续关注设备表现状况,并鼓励用户提供使用体验报告,一旦发现新的兼容性或者其他类型的故障能够快速响应处理。 关于具体的升级流程和技术细节,则应参照产品手册或厂商技术支持团队给出的操作指南来进行。例如,在涉及像RuoYi-Fast这样的项目时,当面临诸如CVE-2022-40664这样特定编号的安全通告时,除了按照常规步骤外还需特别注意对受影响组件(这里是Apache Shiro)做出针对性调整,比如适当修改`ShiroConfig.java`内的过滤器注册逻辑以匹配新版API的要求[^4]。 ```java // 修改后的ShiroConfig.java示例片段 @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){ ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); // ...其他初始化代码... Map<String, Filter> filters = new LinkedHashMap<>(); filters.put("authc", formAuthenticationFilter()); factoryBean.setFilters(filters); return factoryBean; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值