一.核心基础
-
漏洞名称:Shiro RememberMe 反序列化远程代码执行漏洞
-
核心CVE:CVE-2016-4437(最核心、最经典),后续衍生出多个绕过漏洞(无新CVE,多为配置/组件绕过)
-
CVSS评分:高危(9.8分)
-
漏洞类型:远程代码执行(RCE)
-
框架定位:Apache Shiro是Java生态常用的安全框架,用于身份认证、授权、会话管理、加密等,广泛应用于Java Web项目。
二. 漏洞原理
Shiro框架的「RememberMe」功能(记住密码)存在设计缺陷,核心问题在于加密密钥硬编码+反序列化未做安全校验
-
用户勾选「记住我」登录成功后,服务端会将用户信息序列化,用硬编码的AES密钥加密,再经过Base64编码,生成RememberMe Cookie值并返回给客户端;
-
客户端下次请求时,会携带该RememberMe Cookie,服务端接收后,先Base64解码,再用硬编码密钥解密,最后对解密后的内容执行反序列化操作,恢复用户信息;
-
攻击者利用「硬编码密钥已知」的漏洞,构造恶意序列化对象(包含恶意代码),用已知密钥加密、Base64编码,伪造RememberMe Cookie;
-
服务端接收伪造的Cookie后,会自动解密并反序列化,触发恶意代码执行,最终实现远程控制服务器(RCE)。
核心关键点:Shiro框架默认使用硬编码的AES密钥(如kPH+bIxk5D2deZiIxcaaaA==),全网通用,攻击者可直接获取密钥用于伪造恶意Cookie。
三. 影响范围
-
受影响版本:Apache Shiro ≤ 1.2.4(核心受影响版本,CVE-2016-4437);
-
后续绕过场景:Shiro 1.2.5+版本修复了硬编码密钥问题,但部分项目未修改默认密钥、或使用弱密钥,仍可能被绕过;部分第三方组件集成Shiro时,仍沿用硬编码密钥,也会存在漏洞;
-
不受影响场景:Shiro 1.2.5+版本,且管理员已修改默认AES密钥、使用强密钥,且限制反序列化类白名单。
四. 典型Payload及密钥
(1)默认硬编码密钥
kPH+bIxk5D2deZiIxcaaaA== # Shiro ≤1.2.4 默认AES密钥(Base64编码后) 2AvVhdsgUs0FSA3SDFAdag== # 部分第三方集成版本默认密钥 UW5JUFRUUE5EVElPTlNBTkFNRQ== # 另一常见默认密钥
(2)Payload构造逻辑
Shiro漏洞Payload无需手动编写,需借助工具生成,核心格式:
恶意序列化对象 → AES加密(使用已知密钥) → Base64编码 → 伪造RememberMe Cookie值
示例伪造Cookie(简化版,实际需工具生成):
rememberMe=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(后续为加密后的恶意序列化内容)
五. 修复与防御方案
(1)根本修复:升级版本+修改默认密钥
-
升级Shiro版本:将Apache Shiro升级至 ≥ 1.2.5(修复硬编码密钥问题),推荐升级至最新稳定版(如1.12.0);
-
修改默认密钥:升级后,必须手动配置自定义的强AES密钥(16位/24位/32位,对应AES-128/AES-192/AES-256),禁止使用默认密钥,配置示例(Spring Boot项目):
# application.properties 配置自定义AES密钥(Base64编码后的16位密钥) shiro.rememberMe.cookie.secure=true shiro.rememberMe.manager.cipherKey=emhhbmdzYW4xMjM0NTY3OA== # 自定义密钥,Base64编码
(2)临时缓解:无法升级时使用
-
禁用RememberMe功能:若业务无需“记住密码”,直接关闭该功能(最直接有效);
-
限制反序列化类白名单:配置Shiro的反序列化过滤器,只允许指定的安全类被反序列化,禁止危险类(如CommonsCollections相关类);
-
替换反序列化组件:将Shiro默认的反序列化组件(如Java原生反序列化)替换为安全的反序列化组件(如Jackson),避免原生反序列化漏洞。
(3)全面防御:多维度加固
-
代码层面:避免使用CommonsCollections3.x/4.x等存在反序列化漏洞的依赖包(Shiro反序列化漏洞常依赖该包利用);
-
防护层面:WAF拦截伪造的RememberMe Cookie(如拦截超长、包含恶意特征的Cookie值),拦截反序列化相关的恶意Payload;
-
运维层面:定期扫描项目依赖包,排查Shiro版本及默认密钥使用情况;定期检查项目配置,确保未沿用默认密钥。

1120

被折叠的 条评论
为什么被折叠?



