7月24日,监测到Apache Shiro中修复了一个身份验证绕过漏洞(CVE-2023-34478)。

Apache Shiro版本1.12.0之前和2.0.0-alpha-3 之前随意马虎受到路径遍历攻击,当与基于非规范化要求路由要求的API或其他web框架一起利用时,可能导致身份验证绕过。

可能会导致身份验证绕过,从而可能使敏感数据面临风险。

shirotagsjspApache Shiro认证绕过破绽破绽编号CVE202334478高危 NoSQL

意味着攻击者可以通过发送包含恶意路径信息的特制要求来利用该漏洞。
然后,此恶意路径信息可用于访问攻击者不应访问的文件或数据。

一旦利用该漏洞,攻击者就可以访问敏感文件或数据。
这可能包括包含密码、信用卡号或其他个人信息的文件。
攻击者还可以利用该漏洞得到运用程序的掌握权或发起其他攻击。

幸运的是,有一个办理方案。
为了减轻这种威胁,我们敦促用户将其 Apache Shiro 框架更新到版本1.12.0 或更高版本或 2.0.0-alpha-3 或更高版本。
履行此更新可以有效地堵住漏洞,确保您的运用程序能够抵御这种特定的路径遍历攻击。

无法更新到最新版本 Apache Shiro 的用户应采纳以下步骤来保护其运用程序:

禁止在运用程序中利用非标准化要求。
履行输入验证以过滤掉恶意路径信息。
利用 Web 运用程序防火墙 (WAF) 阻挡恶意要求。

目前该漏洞已经修复,受影响用户可升级到以下版本:

Apache Shiro版本 >= 1.12.0

Apache Shiro版本 >= 2.0.0-alpha-3

下载链接:

https://github.com/apache/shiro/tags

什么是Apache Shiro

Apache Shiro 是一种功能强大且易于利用的Java安全框架,它具有身份验证、访问授权、数据加密、会话管理等功能,可用于保护任何运用程序的安全。

如: 命令行运用程序、移动运用程序、Web运用程序、企业级运用程序。
从小到大到很大,Apache Shiro都会给你供应安全帮助。

Shiro 为你的运用程序供应如下API,帮助你更好的管理运用程序的安全。

身份验证

证明用户的身份。
也便是所谓的用户的 “登录” 功能,验证访问的用户是否有权利登录系统或者访问后台接口。

授权

访问权限的掌握。
根据登任命户被分配的权限,掌握用户可以访问哪些接口、那个模块菜单、那个页面、那个按钮等。

密码学

保护或隐蔽数据以防止被窥视。
比如对用户密码进行加密、对访问的数据进行加密返回等,担保用户信息及数据的安全性。

会话管理

每个用户的韶光敏感状态。
比如用户是否登录、会话是否超时等。

赞助功能

Web运用程序的安全性、单元测试、多线程支持等。
赞助功能是为了加强上面四点功能的能力。

为什么要用Apache Shiro

如今利用Apache Shiro的人越来越多,由于Shiro相对付Spring Security 来说更随意马虎上手写。
Apache Shiro 功能大略,易于利用。
只要大略的配置就可以实现日常的安全性功能,大略的API让新人更随意马虎利用,让你有更多的韶光放在业务需求的实现上。

Apache Shiro 三大组件

主体(Subject)

安全管理器(SecurityManager)

领域(Realm)

主体

代表当前“用户”,“用户”一次不一定指的是人,也可以是其他运用程序、接口等。
这是一个抽象观点,用于表示与该程序交互的任何事物。
运用代码直接交互的工具便是Subject,Shiro对外API的核心工具便是主体(Subject)。

安全管理器

安全管理器是Shiro的核心组件。
即所有与安全有关的操作都会与安全管理器(SecurityManager)交互,如,主体(Subject)的管理者便是安全掌握器(SecurityManager)。
安全管理器还管理者Shiro 中的其它组件,来折衷它们共同更好的完成安全管理。

领域

领域充当Shiro与运用程序的安全数据之间的“桥梁”或“连接器”。
当须要与安全性干系的数据进行交互,来实现身份验证或者授权时,Shiro会从为运用程序配置的一个或者多个领域中查找到许多须要的内容。
它封装了数据源链接的详细信息,并根据须要使关联的数据可以被Shiro利用。
在配置Shiro时,至少要指定一个领域用于身份验证或授权。
如果Shiro中默认给配置的领域无法知足你的需求,你可以插入自己的领域实现,用于表示自定义数据源。

Shiro从领域(Realm)获取安全数据(如,用户、角色、权限),当安全管理器(SecurityManager)要验证用户身份,那么它须要从领域中获取相应的用户信息进行比较以确定用户身份是否合法,也须要从Realm得到用户相应的角色/权限进行验证用户是否能进行某项操作。
可以理解Realm为DAO层,与数据源交互,来获取安全数据,安全数据源。

事情流程

从运用程序角度的来不雅观察如何利用 Shiro 完成事情。
如下图:

与运用程序交互时序图

上图阐明(由上到下):

运用代码带着前端传入的用户名密码信息调用主体的认证授权接口。

主体将带着传入的用户名密码信息见告安全管理器,这个用户须要认证授权。

运用程序在调用完认证授权接口后,会通过用户名,到后台数据库中查询相应的用户信息。
把稳:此接口须要我们自己写。

如果用户存在,将用户的基本信息(用户名、加密后的密码、角色、权限)返回给运用程序。
把稳:此处的用户信息,须要我们自己封装。

运用程序将返回的用户信息(用户名、加密后的密码、角色、权限等信息)封装到领域工具中。

将带有用户信息的领域注入到安全管理器中,安全管理器会将从前端传入的用户名密码与领域中的用户名密码进行比拟,如果逐一致,则认为该用户信息合法。
该用户可以利用相应角色权限对应的接口或功能等。

把稳:

这里的用户密码是通过加密的,数据库返回的密码一定是在用户在第一次注册,或者后续需改后进行加盐加密的,前端通过运用程序传入到安全掌握器中的密码最初是明文,或者是通过密钥加密过的,安全管理器会对传入的密码按照规定好的加盐加密算法进行加密,得到一串乱乱的字符串,与数据库查出来的加密后的密码串进行比拟,如果同等,则认为用户信息合法。

从上图可以看出,Shiro 不供应掩护用户 / 权限,须要通过 Realm 让开发职员自己注入。

Apache Shiro 基本功能

Authentication:身份认证 / 登录,验证用户是否拥有相应的身份。

Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能干工作,常见的如:验证某个用户是否拥有某个角色。
或者细粒度的验证某个用户对某个资源是否具有某个权限。

Session Manager:会话管理,即用户登录后便是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的。

Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储。

Web Support:Web 支持,可以非常随意马虎的集成到 Web 环境。

Caching:缓存,比如用户登录后,其用户信息、拥有的角色 / 权限不必每次去查,这样可以提高效率。

Concurrency:shiro 支持多线程运用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去。

Testing:供应测试支持。

Run As:许可一个用户假装为另一个用户(如果他们许可)的身份进行访问。

Remember Me:记住我,即一次登录后,下次再来的话不用登录了。

Apache Shiro 内部架构图

内部架构图

Subject:主体,可以看到主体可以是任何可以与运用交互的 “用户”。

SecurityManager:是 Shiro 的心脏,所有详细的交互都通过 SecurityManager 进行掌握,它管理着所有 Subject、且卖力进行认证和授权、及会话、缓存的管理。

Authenticator:认证器,卖力主体认证的,这是一个扩展点,如果用户以为 Shiro 默认的不好,可以自定义实现。
其须要认证策略(Authentication Strategy),即什么情形下算用户认证通过了。

Authrizer:授权器,或者访问掌握器,用来决定主体是否有权限进行相应的操作;即掌握着用户能访问运用中的哪些功能。

Realm:可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是 JDBC 实现,也可以是 LDAP 实现,或者内存实现等等;由用户供应。
把稳:Shiro 不知道你的用户 / 权限存储在哪及以何种格式存储。
以是我们一样平常在运用中都须要实现自己的 Realm;

SessionManager:Session管理器,如,用户一次访问在没有关闭页面之前,算是一个Session。
Session 须要有人去管理它的生命周期,这个组件便是 SessionManager。
而 Shiro 并不仅仅可以用在 Web 环境,也可以用在如普通的 JavaSE 环境、EJB 等环境。
所有呢,Shiro 就抽象了一个自己的 Session 来管理主体与运用之间交互的数据;这样的话,比如我们在 Web 环境用,刚开始是一台 Web 做事器;接着又上了台 EJB 做事器;这时想把两台做事器的会话数据放到一个地方,这个时候就可以实现自己的分布式会话(如把数据放到 Redis 做事器);

SessionDAO:DAO 大家都用过,数据访问工具,用于会话的 CRUD,比如我们想把 Session 保存到数据库,那么可以实现自己的 SessionDAO,通过如 JDBC 写到数据库;比如想把 Session 放到 Redis中,可以实现自己的 Redis SessionDAO;其余 SessionDAO 中可以利用 Cache 进行缓存,以提高性能。

CacheManager:缓存掌握器,来管理如用户、角色、权限等的缓存的;由于这些数据基本上很少去改变,放到缓存中后可以提高访问的性能。

Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密 / 解密的。