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-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
透過系統屬性配置
-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
的結果,並通過返回結果是否非空來判斷是否受到攻擊。