Shiro反序列化漏洞修复
shiro反序列化漏洞分析、模拟攻击及修复(一)
shiro反序列化漏洞分析、模拟攻击及修复(二)
上篇进行了shiro反序列化漏洞的模拟攻击,进行攻击后,由于很多时候我们的系统采用了shiro框架,因此需要对现有系统进行漏洞修复,下面针对不同类型的系统提出了不同的修复方案。
1、漏洞修复分析及方案
反序列化漏洞成因:
rememberMe功能的AES密钥硬编码在代码中,造成密钥泄露。使得恶意攻击者可以利用系统在用户登录并勾选了“记住我”时所生成cookie的流程,构造恶意cookie,服务器收到该cookie后解析出的命令可能会造成信息泄露等安全风险。
针对此,我们提出三种修复方案。
修复方案一:升级Shiro依赖版本
- Apache官方的漏洞修复采用了在代码中随机生成密钥的方式,因此可以采用升级Shiro版本为1.2.5及以上。
- 此方案适用于开发初期或代码依赖库较简单不会产生依赖冲突。
修复方案二:私有化硬编码密钥
- 采用在Shiro配置文件中加入rememberMeManager管理器来硬编码指定加密密钥,此密钥建议采用私有密钥,切勿采用网络上已有密钥。
- 此方案适用于代码的保密性较强或用于练习的项目。
修复方案三:随机生成密钥
- 在项目中新建随机生成AES加解密密钥的方法,在Shiro配置文件的rememberMeManager中调用该方法进行密钥动态生成。此方案与升级Shiro版本的本质策略相同。
- 此方案适用于项目后期漏洞修复,可最小化对原有项目的影响。
2、漏洞修复Demo验证
Step1: 创建用于验证的demo。
Demo的特性如下:采用Apache Shiro1.2.4 为身份认证框架;包含“登录” 及“记住我”功能
Step2: 创建密钥随机生成类GenerateCipherKey。
此方法与Shiro1.2.5及以上随机生成密钥所调用的org.apache.shiro.crypto.
AbstractSymmetricCipherService#generateNewKey()方法作用一致。
Step3: 修改Shiro配置文件。
- 在安全管理器SecurityManager中加入rememberMeManager;
- 添加rememberMeManager,调用getCipherKey()随机生成密钥。
Step4: 运行Demo。
运行后进行攻击,验证结果如下:
- Cookie的加密密钥已变更,不再是Shiro1.2.4 中所采用的默认密钥;
- 在Shiro配置文件中设置的“随机生成密钥” 已生效;
- 可以采用此方法进行AES密钥保护。
总结
Shiro RememberMe反序列化漏洞总结:
- 学习了解一个框架的最佳途径就是分析源码,网上的解析文章仅作为辅助工具。
- 日后在涉及到加解密等信息处理时,要注意保护加解密算法、密钥等敏感信息。
漏洞修复总结:
升级Shiro依赖版本、硬编码密钥私有化以及随机生成密钥三种修复方案,均有各自的适用情况。对于任何项目中存在的漏洞最佳修复方式就是“外挂式”修复,尽可能保证代码结构的松耦合,因修复而添加的内容不影响原有程序的正常运行。
最后,作为一名小白程序媛,通过完成这次shiro反序列化漏洞的修复研究,感触特别深的是阅读源码真的是学习的一种好的方式,虽然在一开始读源码的时候觉得读不下去,很难懂,但是硬着头皮继续往下读感觉就会慢慢好一点,这样可以让我们特别准确深刻的理解一个原理。