Dubbo漏洞 - 16 安全防御与加固

Dubbo 安全防御与加固

核心防御原则

  1. 最小化攻击面:关闭不需要的协议和功能

  2. 纵深防御:不依赖单一安全机制

  3. 不信任客户端输入:序列化方式由服务端决定

  4. 保持更新:及时升级到最新安全版本

版本升级(最重要)

推荐版本

分支 推荐最低版本 安全特性
2.7.x 2.7.22+ 修复所有已知 CVE
3.0.x 3.0.14+ 修复泛化调用绕过
3.1.x 3.1.11+ STRICT 模式、修复恶意包解码
3.2.x 3.2.5+ 默认 STRICT 模式

升级要点

Dubbo 3.2+ 默认使用 STRICT 序列化检查模式

Dubbo 3.2+ 默认序列化从 Hessian2 切换为 Fastjson2

高版本不保证向后兼容,需要测试

序列化安全配置

启用 STRICT 模式(强烈推荐)

1
2
3
# dubbo.properties
# STRICT: 只允许白名单中的类被反序列化(最安全)
dubbo.application.serialize-check-status=STRICT

三种检查模式

模式 行为 适用场景
STRICT 只允许白名单类,其他全部拒绝 生产环境(推荐)
WARN 阻止黑名单类,其他允许但记录日志 过渡期
DISABLE 不检查 绝对禁止在生产使用

自定义白名单

1
2
3
4
5
6
7
8
# 信任级别 (1-3)
# 1: 只信任 JDK 内置类
# 2: 信任 JDK + Dubbo 内部类
# 3: 信任 JDK + Dubbo + 第三方常用类(默认)
dubbo.application.trust-serialize-class-level=1

# 添加自定义信任类
dubbo.application.trust-serialize-class=com.myapp.model.*

关闭不必要的功能

禁用 HTTP 协议(防止 CVE-2019-17564)

1
2
3
<!-- 只保留 dubbo 协议,移除 http -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 删除: <dubbo:protocol name="http" port="8080" /> -->

禁用 Telnet(防止 CVE-2021-32824)

1
2
3
4
5
6
# 方式一:完全禁用 telnet
dubbo.provider.telnet=

# 方式二:只允许安全的命令
dubbo.provider.telnet=ls,status
# 千万不要包含 invoke!

限制泛化调用(防止 CVE-2021-30179、CVE-2023-23638)

1
2
<!-- 如果不需要泛化调用,可以在 Provider 端限制 -->
<dubbo:provider generic="false" />

禁用不安全的序列化方式

1
2
3
# 只允许 Hessian2 或 Protobuf
dubbo.provider.serialization=hessian2
# 禁用: java, kryo, fst

配置中心安全(防止 CVE-2021-30180/30181)

ZooKeeper 认证

1
2
# 启用 SASL 认证
zookeeper.server.auth.provider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
1
2
# 设置 ACL
setAcl /dubbo auth:admin:cdrwa

Nacos 认证

1
2
3
# 修改默认密码(默认 nacos/nacos 非常危险)
nacos.core.auth.enabled=true
nacos.core.auth.plugin.nacos.token.secret.key=自定义密钥

网络隔离

配置中心(ZooKeeper:2181、Nacos:8848)不应暴露到外网

使用防火墙限制访问 IP

网络层防护

Dubbo 端口访问控制

1
2
3
# iptables: 只允许特定 IP 访问 Dubbo 端口
iptables -A INPUT -p tcp --dport 20880 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 20880 -j DROP

启用 Dubbo Token 认证

1
2
3
4
<!-- Provider 端设置 token -->
<dubbo:provider token="true" />
<!-- 或指定固定 token -->
<dubbo:provider token="your-secret-token" />

Token 认证可以防止未授权的 Consumer 调用

但不能防止直接发送恶意 Dubbo 协议包

使用 TLS 加密

1
2
3
4
# Dubbo 3.x 支持 TLS
dubbo.ssl.enabled=true
dubbo.ssl.server-cert-chain-file=server.crt
dubbo.ssl.server-private-key-file=server.key

依赖安全

移除危险的 Gadget Chain 依赖

依赖 风险 建议
commons-collections:3.x CC 链 升级到 4.x
commons-beanutils < 1.9.4 CB 链 升级到最新版
rome ROME 链 评估是否需要,不需要则移除
xbean-naming XBean JNDI 链 评估是否需要
groovy < 2.4.4 Groovy 链 升级到最新版

使用依赖检查工具

1
2
3
4
5
6
<!-- Maven OWASP Dependency Check -->
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.4.0</version>
</plugin>
1
mvn dependency-check:check

JDK 安全配置

限制 JNDI 远程类加载(防止 JNDI 注入)

1
2
3
# JDK 8u191+ 默认限制,但建议显式设置
-Dcom.sun.jndi.rmi.object.trustURLCodebase=false
-Dcom.sun.jndi.ldap.object.trustURLCodebase=false

使用 JEP 290 反序列化过滤

1
2
# JDK 9+ / JDK 8u121+
-Djdk.serialFilter=!org.apache.commons.collections.*;!org.apache.xbean.*

监控与审计

反序列化日志监控

1
2
3
# 开启 Dubbo 序列化警告日志
dubbo.application.serialize-check-status=WARN
dubbo.application.logger=slf4j

监控日志中的 Serialization security check 关键词

网络流量监控

使用 IDS/IPS 监控 20880 端口的异常流量

检测特征:dabb magic + 异常的 Serialization ID

检测特征:大量来自同一 IP 的 RPC 请求

安全检查清单

1
2
3
4
5
6
7
8
9
10
[ ] Dubbo 版本 >= 2.7.22 / 3.0.14 / 3.1.11 / 3.2.5
[ ] 启用 STRICT 序列化检查模式
[ ] 禁用 HTTP 协议(如不需要)
[ ] 禁用 Telnet invoke 命令
[ ] 配置中心启用认证
[ ] 配置中心不暴露到外网
[ ] Dubbo 端口 (20880) 有访问控制
[ ] 移除不必要的 Gadget Chain 依赖
[ ] JDK 已限制 JNDI 远程类加载
[ ] 已配置反序列化日志监控

上一章 目录 下一章
15-CVE-2023-29234 Dubbo漏洞 17-漏洞演进与攻防对抗史