type
status
date
slug
summary
tags
category
icon
password
今天分享的是 shiro 有关的安全漏洞,这里要强调的是它们会导致远程代码执行。大家可能对此感到困惑,为什么一个组件会导致这么大的危害。或许大家之前没有时间详细了解,今天的分享,将为向大家详细介绍shiro-550反序列化漏洞(CVE-2016-4437),希望这次分享能够帮助大家更全面地认识这个问题。当然,官方也有发表相关风险通告,大家也可以通过查看官方说明了解更多 shiro 相关的安全漏洞: 安全报告|Apache Shiro
一、漏洞原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对 rememberMe Cookie 值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。这里出现问题的点就在于AES加解密的过程中使用的密钥key,这个密钥应该是绝对保密的,而1.2.4版本及以下AES加密时采用的是硬编码在代码中的默认 key,这就为伪造cookie提供了机会。

尽管目前已经更新了许多版本,官方并没有反序列化漏洞本身解决,无论是否升级shiro到1.2.5及以上, 只要shiro的rememberMe功能的AES密钥被泄露, 就会导致反序列化漏洞。但是,目前一些开源系统、教程范例代码都使用来固定的编码,攻击者会通过搜索引擎、github等来收集密钥,提高漏洞检测与利用的成功率。攻击者可以利用密钥实现上述加密过程,在cookie字段写入想要服务端执行的恶意代码,最后服务端在对cookie进行解密的时候(反序列化后)就会执行恶意代码。在后续的版本中,这个密钥也可能会被爆破出来,从而被攻击者利用构造payload。
下图为简单攻击流程图

二、漏洞利用
攻击者验证 shiro 框架之后,利用 shiro 反序列化漏洞利用工具或脚本自动检测 shiro 框架并对 AES 密钥进行爆破,成功爆破则可证明漏洞存在。攻击者搭建 JRMP 服务并放一个反弹 shell 的 payload,然后利用 AES密钥加密编码服务地址后,伪造请求攻击机服务的 rememberMe Cookie 值。



三、修复建议
将默认Key加密改为生成随机的Key加密,请利用官方提供的方法生成密钥:org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int),新创建一个秘钥生成器然后替换硬编码的密钥为新生成的密钥:
步骤1、新创建秘钥生成器
步骤2、引用新生成的密钥


(PS:在代码中全局搜索 "setCipherKey(Base64.decode(" 关键字,或者"setCipherKey"方法,Base64.decode()中的字符串就是shiro的密钥。)
四、总结
上面对 shiro 的反序列化漏洞从原理到利用再到修复都做了深入分析,可见 Apache Shiro 硬编码的默认 AES 密钥存在很大的安全隐患,所以大家在之后引用框架的时候,可以使用上述生成密钥的方法来替换硬编码的默认密钥,可以极大地增加应用的安全性并减少受攻击的风险。
- 作者:NotionNext
- 链接:https://tangly1024.com/article/shiro-550
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。