天天看點

Apache Shiro認證繞過漏洞,漏洞編号:CVE-2023-34478高危

作者:俊傑說黑客

【漏洞修複通知】修複 Apache Shiro 認證繞過漏洞,漏洞編号:CVE-2023-34478,漏洞危害等級:高危#安全漏洞#

CVE-2023-34478:Apache Shiro 路徑周遊漏洞

Apache Shiro是一個強大且易用的Java安全架構,它具有身份驗證、通路授權、資料加密、會話管理等功能。

Apache Shiro認證繞過漏洞,漏洞編号:CVE-2023-34478高危

7月24日,監測到Apache Shiro中修複了一個身份驗證繞過漏洞(CVE-2023-34478)。

Apache Shiro版本1.12.0之前和2.0.0-alpha-3 之前容易受到路徑周遊攻擊,當與基于非規範化請求路由請求的API或其他web架構一起使用時,可能導緻身份驗證繞過。

可能會導緻身份驗證繞過,進而可能使敏感資料面臨風險。

意味着攻擊者可以通過發送包含惡意路徑資訊的特制請求來利用該漏洞。然後,此惡意路徑資訊可用于通路攻擊者不應通路的檔案或資料。

一旦利用該漏洞,攻擊者就可以通路敏感檔案或資料。這可能包括包含密碼、信用卡号或其他個人資訊的檔案。攻擊者還可以利用該漏洞獲得應用程式的控制權或發起其他攻擊。

幸運的是,有一個解決方案。為了減輕這種威脅,我們敦促使用者将其 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 完成工作。如下圖:

Apache Shiro認證繞過漏洞,漏洞編号:CVE-2023-34478高危

與應用程式互動時序圖

上圖解釋(由上到下):

應用代碼帶着前端傳入的使用者名密碼資訊調用主體的認證授權接口。

主體将帶着傳入的使用者名密碼資訊告訴安全管理器,這個使用者需要認證授權。

應用程式在調用完認證授權接口後,會通過使用者名,到背景資料庫中查詢相應的使用者資訊。注意:此接口需要我們自己寫。

如果使用者存在,将使用者的基本資訊(使用者名、加密後的密碼、角色、權限)傳回給應用程式。注意:此處的使用者資訊,需要我們自己封裝。

應用程式将傳回的使用者資訊(使用者名、加密後的密碼、角色、權限等資訊)封裝到領域對象中。

将帶有使用者資訊的領域注入到安全管理器中,安全管理器會将從前端傳入的使用者名密碼與領域中的使用者名密碼進行對比,如果一一緻,則認為該使用者資訊合法。該使用者可以使用相應角色權限對應的接口或功能等。

注意:

這裡的使用者密碼是通過加密的,資料庫傳回的密碼一定是在使用者在第一次注冊,或者後續需改後進行加鹽加密的,前端通過應用程式傳入到安全控制器中的密碼最初是明文,或者是通過密鑰加密過的,安全管理器會對傳入的密碼按照規定好的加鹽加密算法進行加密,得到一串亂亂的字元串,與資料庫查出來的加密後的密碼串進行對比,如果一緻,則認為使用者資訊合法。

從上圖可以看出,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 内部架構圖

Apache Shiro認證繞過漏洞,漏洞編号:CVE-2023-34478高危

内部架構圖

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 提高了一些常見的加密元件用于如密碼加密 / 解密的。