寫在前面
今天收到運維人員的反饋,說程序有漏洞,如下圖:

哎,不查不知道,一查嚇一跳。發現兩個問題!!
Apache Shiro是一個強大且易用的JAVA安全框架,被用來執行身份驗證、授權、密碼和會話管理。
我手頭項目的一個管理后臺,開發時候為了快速上線,選了若依開源管理系統,基于它來開發。確實,基于開源系統開發很方便,但有些問題還是不能避免的,像下邊這個漏洞。
SHIRO-550
在v1.2.4版本時候爆出的嚴重的Java反序列化漏洞,具體看:https://issues.apache.org/jira/browse/SHIRO-550。
這個漏洞的成因是shiro的rememberMe功能AES密鑰硬編碼在代碼中,造成密鑰泄露。使得惡意攻擊者可以利用系統在用戶登錄并勾選了“記住我”時所生成cookie的流程,構造惡意cookie,服務器收到該cookie后解析出的命令可能會造成信息泄露等安全風險。
我手頭項目的管理系統是基于開源的若依管理系統,shiro的秘鑰也是硬編碼在代碼里邊的,在github上搜索下就可以拿到(/汗)。而且github上用這個秘鑰搜索,居然搜到1K+代碼段(/狂汗),很多使用的差不多,拷貝粘貼??
解決辦法:官方在v1.2.5版本已經解決了這個漏洞,所以需要升級shiro版本,并且,重要的一點-->> 去掉或者替換默認的秘鑰。
以若依shiro配置(ShiroConfig.java)來看,具體在初始化CookieRememberMeManager時候設置。
1、去掉默認秘鑰

在ShiroConfig類里邊,在上圖方法里邊將第4行注釋即可。
2、替換默認秘鑰,這里可以自定義一個,或者使用下邊自動生成的方式。
新建類GenerateCipherKey,添加靜態方法getCipherKey()。

在初始化CookieRememberMeManager時候調用。

SHIRO-721
這個漏洞還是Java反序列化問題,比較嚴重,并且影響范圍也很廣,涉及到的版本也很多,具體看下圖。

這個漏洞的成因是使用AES加密模式CBC導致的。詳細情況官方已給出:
RememberMe使用AES-128-CBC模式加密,容易受到Padding Oracle攻擊,AES的初始化向量iv就是rememberMe的base64解碼后的前16個字節,攻擊者只要使用有效的RememberMe cookie作為Padding Oracle Attack 的前綴,然后就可以構造RememberMe進行反序列化攻擊,就像SHIRO-550漏洞一樣。
具體利用這個漏洞攻擊方式和原理,大家可以參考下文章:《從更深層面看Shiro Padding Oracle漏洞》(https://www.anquanke.com/post/id/203869)
解決辦法:升級shiro版本大于等于v1.4.2。
總結
- 程序開發漏洞、bug少不了,但開發過程中仔細斟酌推敲肯定不會有錯的。
- 開源項目很多,也很雜,使用時候需要注意,尤其是涉及到安全方面的框架,盡量去看下源碼,不說完全吃透,關鍵點還是需要過一遍的。