Apache Dubbo反序列化漏洞复现分析

本文详细分析了Apache Dubbo的两个经典反序列化漏洞CVE-2019-17564和CVE-2020-1948,包括影响版本、漏洞环境准备、漏洞分析、补丁分析及修复方法。通过示例展示了漏洞利用链和修复措施,强调了升级到最新版本以避免此类漏洞的重要性。

前言

学习下Apache Dubbo系列的经典漏洞

CVE-2019-17564

0x01 影响版本

  • Dubbo 2.7.0 to 2.7.4

  • Dubbo 2.6.0 to 2.6.7

  • Dubbo all 2.5.x versions

0x02 环境准备

https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-http下载源代码,在pom中切换dubbo版本,发现无法找到存在该漏洞的版本,手动下载jar包添加,并添加可利用依赖common-collections3.2

图片

0x03 漏洞分析

在dubbo开启http协议后通过http协议的请求都会经过

org.apache.dubbo.rpc.protocol.http.HttpProtocol.InternalHandler#handle方法,所以在此处打断点

利用ysoserial生成payload

java -jar ysoserial.jar CommonsCollections6 
"/System/Applications/Calculator.app/Contents/MacOS/Calculator">cc6

然后发送

curl http://127.0.0.1:8081/org.apache.dubbo.samples.http.api.DemoService --data-binary @cc6

会发现断在我们的断点处,向下跟踪

图片

170行会根据我们传入的路径寻找处理器,我们看看this.skeletonMap的值

图片

key对应着请求路径,value是一个HttpInvokerServiceExporter类的实例;接着在177行使用获取到的处理器处理请求,调用的是

org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter#handleRequest

图片

接着会将请求

### Apache 反序列化漏洞原因及修复方法 #### 一、Apache Shiro 反序列化漏洞分析 Apache Shiro 是一个强大的 Java 安全框架,用于实现身份验证、授权等功能。然而,由于 RememberMe 功能的设计缺陷,可能导致反序列化漏洞的发生。 1. **漏洞成因** - Shiro 的 `RememberMe` 功能允许用户在关闭浏览器后重新打开时保持登录状态。为了实现这一功能,Shiro 对用户的会话信息进行了序列化并存储在 Cookie 中。 - 默认情况下,Shiro 使用 AES 加密算法对这些数据进行加密,并将其转换为 Base64 编码后的字符串保存在客户端的 Cookie 中。 - 然而,默认使用的 AES 密钥是硬编码的,这意味着攻击者可以通过已知的密钥解密和修改 Cookie 数据[^3]。 - 攻击者可以利用此特性伪造恶意对象并通过反序列化过程执行任意代码。 2. **修复方案** - 配置自定义的 AES 密钥以替代默认的硬编码密钥。可以在配置文件中设置如下参数: ```properties cookie.rememberMeManager.cipherKey = 自定义AES密钥 ``` - 如果不需要 `RememberMe` 功能,则可以直接禁用它。通过以下方式禁用: ```java DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRememberMeManager(null); ``` --- #### 二、Apache Dubbo 反序列化漏洞分析 Apache Dubbo 是一款流行的 Java RPC 框架,广泛应用于分布式系统开发中。近期发现的一个严重漏洞(CVE-2020-1948)涉及反序列化的远程代码执行问题。 1. **漏洞成因** - 在 Dubbo 提供的服务端(Provider)中,存在未受保护的对象反序列化逻辑。如果攻击者能够控制输入的数据流,就可能触发反序列化漏洞。 - 特定条件下,攻击者可通过构造恶意请求来执行任意代码。尽管官方发布了修补版本(2.7.7),但后续测试表明该补丁可被绕过[^2]。 2. **修复建议** - 升级至最新稳定版:当前官方尚未完全解决 CVE-2020-1948 补丁绕过的安全隐患,因此应密切关注更新动态并及时升级到最新的安全版本。 - 启用白名单机制:限制只接受来自可信源的请求,从而减少潜在威胁的影响范围。 - 替代高危组件:考虑替换掉基于 JDK 序列化的模块,改用更安全的序列化库(如 Kryo 或 Protobuf)。例如: ```xml <dependency> <groupId>com.esotericsoftware</groupId> <artifactId>kryo</artifactId> <version>5.3.0</version> </dependency> ``` --- #### 三、通用防御策略 无论是针对 Shiro 还是 Dubbo反序列化漏洞,都可以采用一些通用的安全实践降低风险: 1. **避免使用不安全的序列化协议** 尽量选用经过严格审查且具备良好安全性保障的第三方序列化工具代替原生 JDK 实现。 2. **实施严格的输入校验** 所有外部传入的数据都需经过细致过滤与合法性判断后再参与业务流程处理。 3. **启用 WAF 和防火墙防护** Web 应用程序防火墙 (WAF) 能够识别异常流量模式并对可疑行为发出警告甚至阻断连接尝试;同时部署边界网络设备进一步增强整体架构韧性。 4. **定期审计代码质量** 利用静态分析工具扫描项目中的薄弱环节,并结合人工复查确保覆盖全面无遗漏之处。 --- ### 结论 综上所述,Apache Shiro 和 Dubbo反序列化漏洞均源于设计上的不足以及缺乏充分的输入验证措施所致。遵循上述指导方针有助于显著提升系统的抗攻击能力水平。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值