RPC 协议安全
Dubbo 支持 RPC 协议的扩展。理论上,用户可以基于此扩展机制启用任何 RPC 协议。这带来了极大的灵活性,但同时,用户必须意识到潜在的安全风险。
Dubbo 2.7 官方版本提供的序列化协议如下
- Dubbo
- RMI
- Hessian
- Http/Rest
- Webservice
- Thrift
- gRPC
- …
从 Dubbo 3.0 开始,默认情况下只提供以下序列化协议支持
- Dubbo
- Triple/gRPC
- Http/Rest
Triple、gRPC、Http 和 Rest 协议都是基于 HTTP 协议构建的。请求的格式可以严格区分。例如,头部是纯文本,以避免在读取 Token 时出现 RCE 等风险。对于 Dubbo 协议,由于它是直接基于 TCP 二进制设计的,除了少数特定字段外,它使用序列化协议进行写入。因此,如果开启了有风险的序列化协议,仍然存在 RCE 等风险。对于 RMI 协议,由于它基于 Java 序列化机制,存在 RCE 等风险。对于 Hessian 协议,由于它基于 Hessian 序列化机制,并且默认的 Hessian 协议(非 Dubbo Shade 的 Hessian-Lite 协议)无法配置黑白名单,也没有默认的黑名单,因此存在 RCE 等风险。
如果用户想使用 Token 认证机制来防止未经授权和不可信的请求来源威胁 Provider 的安全,他们应该使用基于 HTTP 标准扩展的协议,例如 Triple,以避免在读取 token 参数时出现安全风险。
特别是,Dubbo 社区强烈不建议将 Dubbo 协议、RMI 协议、Hessian 协议以及其他未基于 HTTP 标准扩展的协议暴露到公网环境,因为 Dubbo 协议的初衷是在内网环境中提供高性能的 RPC 服务,而不是在公网环境中。
如果您的应用程序需要暴露公网访问,Dubbo 社区建议您使用 Triple 协议,并避免使用非 Protobuf 模式或仅暴露标准 application/json 格式服务的基于 Dubbo 3.3 及更高版本的服务。
请注意,所有联网服务器都容易受到拒绝服务 (DoS) 攻击。我们无法为常见问题提供“神奇”的解决方案,例如客户端向您的服务器传输大量数据或重复请求相同的 URL。通常,Apache Dubbo 旨在防御可能导致服务器资源消耗与输入数据的大小或结构不成比例的攻击。因此,为了保护您的服务器,请确保在将您的 Dubbo 服务暴露到公共互联网之前,已部署 Web 应用防火墙 (WAF) 或其他安全设备,以防止此类攻击。