shiro反序列化漏洞分析、模拟攻击及修复(三)

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 为身份认证框架;包含“登录” 及“记住我”功能

demo下载链接

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依赖版本、硬编码密钥私有化以及随机生成密钥三种修复方案,均有各自的适用情况。对于任何项目中存在的漏洞最佳修复方式就是“外挂式”修复,尽可能保证代码结构的松耦合,因修复而添加的内容不影响原有程序的正常运行。