今天收到运维人员的反馈,说程序有漏洞,如下图:
一、项目描述
项目技术栈:Spring Boot(2.0.1) + shiro(1.6.0) + mybatis(3.4.1)
二、漏洞详情
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
阿里云先知里有这个漏洞相关的详情,可点击漏洞详情查看。
以下是详情简要概括:Apache Shiro 是ASF旗下的一款开源软件,它提供了一个强大而灵活的安全框架,提供身份验证、授权、密码和会话管理。在Apache Shiro部分旧版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中,攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
查看自己的代码,果然发现了这一处漏洞:
三、解决方案
修复建议:升级shiro至最新版本1.7.0并生成新的密钥替换,注意妥善保管密钥。
利用官方提供的方法生成密钥:org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int),替换key修复指南:如以下内容!
步骤1、新创建一个秘钥生成器
package com.iot.mainsite.component.shiro; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.NoSuchAlgorithmException; /** * <p>GenerateCipherKey 此类用于:</p> * <p>@author:hujm</p> * <p>@date:2021年12月07日 19:02</p> * <p>@remark:</p> */ @Slf4j public class GenerateCipherKey { /** * 随机生成秘钥,参考org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int) * * @return 随机生成秘钥 */ @Bean public static byte[] generateNewKey() { KeyGenerator keyGenerator; try { keyGenerator = KeyGenerator.getInstance("AES"); } catch (NoSuchAlgorithmException e) { String msg = "Unable to acquire AES algorithm. This is required to function."; throw new IllegalStateException(msg, e); } keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); byte[] encoded = secretKey.getEncoded(); log.info("生成随机秘钥成功!"); return encoded; } }
步骤2、引用新生成的密钥
以上两步即可搞定。
完结!