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 | // 恶意路由脚本 — 在 JavaScript 中调用 Java 执行命令 |
存储路径
1 | /dubbo/config/dubbo/com.vuln.api.DemoService.script-router |
复现步骤
环境搭建
1 | cd environments/cve-2021-30181 |
写入恶意脚本到 ZooKeeper
1 | docker exec -it zookeeper /apache-zookeeper-3.7.0-bin/bin/zkCli.sh |
触发
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 |