Shiro漏洞应急防护最佳实践
TOPIC SOURCE
Apache Shiro 远程代码执行漏洞复现
在一次内部渗透演练中,安全团队捕获到带有异常 rememberMe Cookie 的请求,经过解密后发现填充字节被精心构造,随即触发了 Shiro 的反序列化链。该案例提醒我们:即使是成熟的权限框架,也可能因加密实现的细节疏漏而成为攻击入口。
快速定位风险点
利用日志聚合平台检索 Shiro 关键字,锁定所有包含 rememberMe 的响应头;随后在流量镜像中抽取对应的 Cookie,交由 ysoserial 进行解码,若出现 Invalid padding 重复尝试的特征,即为潜在的 Padding Oracle 攻击。
- 启用 Web 应用防火墙(WAF),针对
rememberMeCookie 长度异常(> 2000 字节)或非 Base64 编码的请求返回 403。 - 在入口层加入统一日志,记录每一次
rememberMe解密失败的堆栈信息,配合 SIEM 实时告警。 - 审计项目依赖树,确认使用的 Shiro 版本是否落在已公开的 CVE 范围内。
临时防护手段
在官方补丁尚未发布的窗口期,最直接的做法是关闭或替换 rememberMe 功能。通过配置文件禁用该特性后,攻击者再也找不到可利用的加密载体。
# shiro.ini
[main]
securityManager.rememberMeManager = org.apache.shiro.web.mgt.CookieRememberMeManager
securityManager.rememberMeManager.cookie = org.apache.shiro.web.servlet.SimpleCookie
securityManager.rememberMeManager.cookie.name = rememberMe
securityManager.rememberMeManager.cookie.maxAge = 0 # 禁用持久化
securityManager.rememberMeManager.cipherKey = null # 关闭加密
如果业务必须保留记住登录的体验,可改用 JWT 或基于服务器端会话的单点登录(SSO),彻底摆脱客户端序列化的风险。
长期修复路径
- 升级至官方已修复的 Shiro 版本(≥ 1.5.0),并在 CI 中加入安全依赖检查。
- 在代码层面审计所有
ObjectInputStream的入口,使用白名单方式限定可反序列化的类。 - 引入容器化部署的最小权限原则,确保即使出现代码执行,攻击者也只能在受限的文件系统空间内操作。
- 定期进行红队渗透测试,重点验证记住我功能的加密实现是否仍符合安全基线。
把这些措施落实到日常运维里,往往比一次补丁更能抵御未知的变种攻击。

参与讨论
记住我被玩了,吓人
关闭 rememberMe 后,登录体验会不会受影响?
我之前项目也被同样的漏洞卡住,花了两天排查日志才发现是 rememberMe 的 padding 问题,真是够折腾的
建议配合 SAST 检查序列化入口
这防护思路挺靠谱
日志告警这块可以自动化