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

透過系統屬性配置

-Ddubbo.application.serialize-check-status=STRICT

配置成功後,您可以在日誌中看到以下提示

INFO utils.SerializeSecurityManager: [DUBBO] Serialize check level: STRICT

注意:如果同一個程序(Dubbo Framework Model)下的多個應用程式同時配置了不同的檢查模式,最終將以「最寬鬆」的級別生效。如果同時啟動兩個 Spring Context,一個配置為 STRICT,另一個配置為 WARN,最終將以 WARN 級別的配置生效。

2. Serializable 介面檢查

Serializable 介面檢查模式分為兩個級別: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

透過系統屬性配置

-Ddubbo.application.check-serializable=true

配置成功後,您可以在日誌中看到以下提示

INFO utils.SerializeSecurityManager: [DUBBO] Serialize check serializable: true

注意事項 1:若同一進程(Dubbo Framework Model)下的多個應用同時配置了不同的 Serializable 介面檢查模式,最終會以最「寬鬆」的級別生效。例如同時啟動兩個 Spring Context,一個配置為 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

透過系統屬性配置

-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)