Shiro rememberMe反序列化攻击检测思路

1、背景

 

Apache Shiro是一款强大且易用的Java安全框架,使用范围非常广泛。Shiro默认使用CookieRememberMeManager,其处理cookie的流程是:rememberMe cookie值–>Base64解码–>AES解密–>反序列化。在Shiro<=1.2.4版本下,AES密钥是硬编码的,导致攻击者可以构造加密的反序列化数据执行任意命令。

 

下载Shiro 1.2.4的代码,先看看CookieRememberMeManager.java文件,发现其继承AbstractRememberMeManager类。

 

跟进到AbstractRememberMeManager类,在80行发现定了私有常量DEFAULT_CIPHER _KEY_BYTES,值为Base64.decode("kPH+bIxk5D2deZiIxcaaaA=="),而这就是我们需要找的硬编码AES key。

 

解密后的数据会经过AbstractRememberMeManager类的getRememberedPrincipals方法处理,并在该方法中调用了convertBytesToPrincipals方法.

 

 

继续向上追踪,最后到DefaultSerializer类的deserialize方法调用了readObject,对解密的数据进行反序列化。

 

由于该漏洞攻击特征被加密,和正常数据看起来相似,在护网等场景下被攻击者大量使用,并且较难在不影响正常业务情况下直接做拦截。特别是对云上安全产品,客户的服务器、应用、业务种类繁多,直接封禁rememberMe cookie难以实现,因此需要先行对数据进行处理再做决定。

 

2、检测思路

 

我们需要模拟Shiro对Cookie处理的过程,对加密数据进行处理后再进行,处理过程的流程图如下:

 

提取含有rememberMe cookie的值,对其做base64解码,再利用AES key对数据进行解密,由于该漏洞是AES key硬编码导致的,我们收集了市面上攻击者常用的20个AES key,覆盖绝大部分Shiro反序列化攻击行为。

 

对数据解密后,先判断解密后数据是否以” aced0005”开头,即拥有Java序列化数据的特征。但是到了这步,仍然没办法确认是否是攻击,正常用户的rememberMe值解密后也是序列化的数据。但这里我们很清楚,此处存在漏洞是因此对数据做了反序列化操作即存在反序列化入口,而实际触发漏洞还需要有一个完整的利用链条。因此,我们提取了常见工具的20余条利用链的特征,再对解密数据进行判断,从而能正确的处理攻击数据。

 

3、检测效果

 

3.1攻击详情

 

3.2 最近一周攻击趋势

 

4、一体化解决方案

 

百度安全智能一体化解决方案中已支持上述漏洞检测,并且开放了智能化编排的入口,用户只需要编写简单的脚本,就能够对特定数据进行处理,进行触发告警、拦截等措施。智能一体化解决方案如下:

 

对于此类无明显攻击特征的行为,WAF等设备通常无法直接拦截,智能网关先将旁路流量给到智能分析中心,通过用户添加的智能编排脚本处理,再将结果反馈到智能网关,对相应的攻击进行拦截,能够准确、有效地保护用户的资产。

 

另外,智能分析中心还集成了智能API识别,能够有效地对API进行分类识别,帮助用户梳理API资产;同时还集成了AI白模型等能力,当用户对资产进行一段时间的学习后,能够有效地防御未知攻击、0day攻击等。