升级Shiro至1.12.0并关闭RememberMe仍触发CVE-2016-4437告警求助
Shiro RememberMe反序列化漏洞(CVE-2016-4437)告警持续触发问题排查与解决
公司防火墙检测到Shiro存在CVE-2016-4437反序列化漏洞,已执行以下操作但告警仍未消除:
- 将Shiro版本升级至1.12.0
- 使用随机生成的加密密钥
- 在配置中关闭RememberMe功能
Shiro配置信息
shiro: domain: # 设置cookie的有效访问路径 path: / # 设置HttpOnly属性 httpOnly: true # 设置Cookie的过期时间,天为单位 maxAge: 30 cipherKey: rememberMe: # 是否开启记住我 enabled: false
ShiroConfig相关代码
/** * 记住我 */ public CookieRememberMeManager rememberMeManager() { CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); cookieRememberMeManager.setCookie(rememberMeCookie()); if (StringUtils.isNotEmpty(cipherKey)) { cookieRememberMeManager.setCipherKey(Base64.decode(cipherKey)); } else { cookieRememberMeManager.setCipherKey(CipherUtils.generateNewKey(128, "AES").getEncoded()); } return cookieRememberMeManager; }
问题原因分析
- RememberMeManager仍被实例化:即使配置中关闭了RememberMe功能,但代码中依然创建了
CookieRememberMeManager实例并注入到Shiro环境中,防火墙的漏洞扫描器可能会检测到该组件存在,从而触发告警。 - Cookie配置未完全禁用:虽然
rememberMe.enabled设为false,但如果rememberMeCookie()方法仍在生成对应的Cookie对象,可能会在响应中留下相关痕迹,被扫描器识别。
解决方案
1. 完全移除RememberMeManager的实例化
如果不需要RememberMe功能,直接在Shiro配置中不注册CookieRememberMeManager,修改ShiroConfig:
@Bean public DefaultWebSecurityManager securityManager(/* 其他依赖,如Realm */) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 配置Realm等核心组件 securityManager.setRealm(yourRealm()); // 不要添加securityManager.setRememberMeManager(rememberMeManager());这一行 return securityManager; }
2. 彻底禁用RememberMe Cookie
如果必须保留相关方法(比如依赖注入约束),修改rememberMeCookie()方法,将Cookie的maxAge设为0,让浏览器立即删除该Cookie:
public SimpleCookie rememberMeCookie() { SimpleCookie cookie = new SimpleCookie("rememberMe"); cookie.setMaxAge(0); // 立即过期,禁用Cookie cookie.setHttpOnly(true); cookie.setPath("/"); return cookie; }
3. 验证防火墙扫描规则
部分防火墙可能基于旧特征库误报,可手动构造测试请求:发送带有伪造rememberMe Cookie的请求,确认系统不会触发反序列化逻辑,以此证明漏洞已修复,再向防火墙厂商更新规则或添加白名单。
内容的提问来源于stack exchange,提问作者爱学习的潘大大
相关产品推荐
相关产品推荐

