使用 OneBlog(DBlog)的用户,请注意!!!
各位正在使用 OneBlog[1](DBlog)的用户,请注意,本篇文章非常重要,请一定要认真读完!
OneBlog 中使用了 Shiro 权限管理框架,版本为:
<shiro.spring.version>1.4.0</shiro.spring.version>
该版本针对 CookieRememberMeManager
存在一个反序列化的漏洞:
•原文:https://issues.apache.org/jira/browse/SHIRO-550•相关模拟:https://blog.csdn.net/Dothwinds/article/details/105244830
OneBlog 是我18年的时候开发出的一款博客系统,当时我在开发 OneBlog 时其实已经考虑到了这一点(当时没有考虑太深),因此给项目重新生成了一个 Key,并且想当然的在源码中给出了注释,如下:
但由于当时太天真,没有考虑到用户群体的复杂性,想当然的以为用户在用的时候一定会看源码(实际情况,除了专门研究源码的人,没有多少使用者会深究你的代码),因此也没有在文档中说明。
今日收到一位从事安全研究行业的朋友的提示,所以紧急修复一版:
在此给各位造成的不便,深表歉意。
升级方式:
• 如果本地代码未做过多修改,可以直接 git pull
拉取最新代码• 如果你已经做了不少定制开发,可以按照以下步骤操作:
在 blog-admin/src/main/java/com/zyd/blog/core/config/ShiroConfig.java
配置类中,增加以下内容:
/**
* 解决 shiro 反序列化漏洞
*
* https://blog.csdn.net/qq_34775355/article/details/106643678
*/
public static class GenerateCipherKey {
/**
* 随机生成秘钥,参考org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int)
*
* @return byte[]
*/
public static byte[] generateNewKey() {
KeyGenerator kg;
try {
kg = KeyGenerator.getInstance("AES");
} catch (NoSuchAlgorithmException var5) {
String msg = "Unable to acquire AES algorithm. This is required to function.";
throw new IllegalStateException(msg, var5);
}
kg.init(128);
SecretKey key = kg.generateKey();
return key.getEncoded();
}
}
然后修改 rememberMeManager
方法:
/**
* cookie管理对象;记住我功能
*
* @return
*/
public CookieRememberMeManager rememberMeManager() {
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
// 主要是这个地方,使用上面定制的 key 生成器生成随机 key
cookieRememberMeManager.setCipherKey(GenerateCipherKey.generateNewKey());
return cookieRememberMeManager;
}
或者直接 copy ShiroConfig.java[2] 中的代码覆盖你本地的相关代码。
最后,最好将 shiro 升级到最新版本,项目根目录下的 pom.xml
文件中,升级 shiro 相关的依赖:
<shiro.spring.version>1.7.1</shiro.spring.version>
PS: 呼吁各位使用 shiro 框架的开发者或者开源项目作者,自行检阅自己的项目是否也存在这个问题,如果存在,请及时修复!
引用链接
[1]
OneBlog: https://gitee.com/yadong.zhang/DBlog
[2]
ShiroConfig.java: https://gitee.com/yadong.zhang/DBlog/blob/master/blog-admin/src/main/java/com/zyd/blog/core/config/ShiroConfig.java