Dubbo 类检查机制

了解 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-serializabledubbo.hessian.allowNonSerializable

Dubbo 类自动扫描机制中存在两个配置项:`AutoTrustSerializeClass

简单来说,自动类扫描开启后,Dubbo 会通过 ReferenceConfigServiceConfig 自动扫描所有可能被接口使用的相关类,并递归信任其包。`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 查看实时告警列表。

  1. 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":[...]}
  1. 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 的结果,并根据返回结果是否为空判断是否受到攻击。


上次修改时间:2023 年 12 月 15 日:更新损坏的链接 (7b8d601e9f8)