Dubbo 类检查机制
支持的版本
Dubbo >= 3.1.6
应用范围
目前序列化检查支持 Hessian2、Fastjson2 序列化和泛化调用,其他序列化方式暂不支持。
配置方法
1. 检查模式
检查模式分为三个级别:STRICT
严格检查、WARN
警告、DISABLED
禁用。STRICT
严格检查:不允许反序列化所有不在允许序列化列表(白名单)中的类。WARN
警告:只禁止反序列化所有在不允许序列化列表(黑名单)中的类,并在反序列化不在允许序列化列表(白名单)中的类时通过日志进行告警。DISABLED
禁用:不做任何检查。
3.1 版本默认 WARN
警告级别,3.2 版本默认 STRICT
严格检查级别。
通过 ApplicationConfig 配置
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setSerializeCheckStatus("STRICT");
通过 Spring XML 配置
<dubbo:application name="demo-provider" serialize-check-status="STRICT"/>
通过 Spring Properties / dubbo.properties 配置
dubbo.application.serialize-check-status=STRICT
通过 System Property 配置
-Ddubbo.application.serialize-check-status=STRICT
配置成功后,您可以在日志中看到以下提示
INFO utils.SerializeSecurityManager: [DUBBO] Serialize check level: STRICT
注意:如果同一进程下(Dubbo 框架模型)多个应用同时配置了不同的检查模式,最终将以“最宽松”的级别生效。如果同时启动两个 Spring Contexts,一个配置为 STRICT
,另一个配置为 WARN
,最终将以 WARN
级别的配置生效。
2. 可序列化接口检查
可序列化接口检查模式分为两个级别:true
为启用,false
为禁用。当检查开启时,将拒绝反序列化所有未实现 Serializable
的类。
Dubbo 中的默认配置为 true
,启用检查。
通过 ApplicationConfig 配置
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setCheckSerializable(true);
通过 Spring XML 配置
<dubbo:application name="demo-provider" check-serializable="true"/>
通过 Spring Properties / dubbo.properties 配置
dubbo.application.check-serializable=true
通过 System Property 配置
-Ddubbo.application.check-serializable=true
配置成功后,您可以在日志中看到以下提示
INFO utils.SerializeSecurityManager: [DUBBO] Serialize check serializable: true
注意 1:如果同一进程下(Dubbo 框架模型)多个应用同时配置了不同的 Serializable 接口检查模式,最终将以“最宽松”的级别生效。如果同时启动两个 Spring Contexts,一个配置为 true
,另一个配置为 false
,最终将以 false
级别的配置生效。注意 2:目前 Hessian2 和 Fastjson2 的内置 Serializable
检查配置尚未开启。对于泛化调用,只需要配置 dubbo.application.check-serializable
即可修改检查配置;对于 Hessian2 序列化,需要同时修改 dubbo.application.check-serializable
和 dubbo.hessian.allowNonSerializable
3. 自动扫描相关配置
Dubbo 类自动扫描机制中存在两个配置项:`AutoTrustSerializeClass
简单来说,自动类扫描开启后,Dubbo 会通过 ReferenceConfig
和 ServiceConfig
自动扫描所有可能被接口使用的相关类,并递归信任其包。`TrustSerializeClassLevel
Dubbo 中的默认配置为 `AutoTrustSerializeClass
通过 ApplicationConfig 配置
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setAutoTrustSerializeClass(true);
applicationConfig.setTrustSerializeClassLevel(3);
通过 Spring XML 配置
<dubbo:application name="demo-provider" auto-trust-serialize-class="true" trust-serialize-class-level="3"/>
通过 Spring Properties / dubbo.properties 配置
dubbo.application.auto-trust-serialize-class=true
dubbo.application.trust-serialize-class-level=3
通过 System Property 配置
-Ddubbo.application.auto-trust-serialize-class=true
-Ddubbo.application.trust-serialize-class-level=3
配置成功后,可以使用 QoS 命令检查当前加载的信任类结果是否符合预期。
注意:检查开启后,启动过程中会有一定的性能损失。
4. 自定义信任/不信任类配置
除了 Dubbo 自动扫描的类,还支持通过资源文件配置信任/不信任类列表。
配置方法:在资源目录(resource)下定义以下文件。
# security/serialize.allowlist
io.dubbo.test
# security/serialize.blockedlist
io.dubbo.block
配置成功后,您可以在日志中看到以下提示
INFO utils.SerializeSecurityConfigurator: [DUBBO] Read serialize allow list from file:/Users/albumen/code/dubbo-integration-cases/99-integration/dubbo-samples-serialize-check/target/classes/security/serialize.allowlist
INFO utils.SerializeSecurityConfigurator: [DUBBO] Read serialize blocked list from file:/Users/albumen/code/dubbo-integration-cases/99-integration/dubbo-samples-serialize-check/target/classes/security/serialize.blockedlist
配置优先级为:用户自定义信任类 = 框架内置信任类 > 用户自定义不信任类 = 框架内置不信任类 > 自动类扫描信任类。
审计方法
Dubbo 支持通过 QoS 命令实时查看当前配置信息和信任/不信任类列表。目前支持两个命令:serializeCheckStatus
查看当前配置信息,serializeWarnedClasses
查看实时告警列表。
serializeCheckStatus
查看当前配置信息
直接通过控制台访问
> telnet 127.0.0.1 22222
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
___ __ __ ___ ___ ____
/ _ \ / / / // _ ) / _ ) / __ \
/ // // /_/ // _ |/ _ |/ /_/ /
/____/ \____//____//____/ \____/
dubbo>serializeCheckStatus
CheckStatus: WARN
CheckSerializable: true
AllowedPrefix:
...
DisAllowedPrefix:
...
dubbo>
通过 http 请求结果以 json 格式
> curl http://127.0.0.1:22222/serializeCheckStatus
{"checkStatus": "WARN","allowedPrefix":[...],"checkSerializable":true,"disAllowedPrefix":[...]}
serializeWarnedClasses
查看实时告警列表
直接通过控制台访问
> telnet 127.0.0.1 22222
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
___ __ __ ___ ___ ____
/ _ \ / / / // _ ) / _ ) / __ \
/ // // /_/ // _ |/ _ |/ /_/ /
/____/ \____//____//____/ \____/
dubbo>serializeWarnedClasses
Warned Classes:
io.dubbo.test.NotSerializable
io.dubbo.test2.NotSerializable
io.dubbo.test2.OthersSerializable
org.apache.dubbo.samples.NotSerializable
dubbo>
通过 http 请求结果以 json 格式
> curl http://127.0.0.1:22222/serializeWarnedClasses
{"warnedClasses":["io.dubbo.test2.NotSerializable","org.apache.dubbo.samples.NotSerializable","io.dubbo.test.NotSerializable","io.dubbo.test2.OthersSerializable"]}
注意:建议及时关注 serializeWarnedClasses
的结果,并根据返回结果是否为空判断是否受到攻击。