漏洞簡介
CVE編號:CVE-2020-9484,危險級別:高危
Apache Tomcat是美國阿帕奇(Apache)軟件基金會的一款輕量級Web應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP 程序的首選。該程序?qū)崿F(xiàn)了對Servlet和JavaServer Page(JSP)的支持。目前Tomcat最新版本為10.0.0-M4。
近日,Apache Tomcat發(fā)布通告稱修復(fù)了一個源于持久化Session的遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2020-9484)。當(dāng)Tomcat使用了自帶session同步功能時,使用不安全的配置(沒有使用EncryptInterceptor)會存在反序列化漏洞,攻擊者通過精心構(gòu)造的數(shù)據(jù)包,可以對使用了自帶session同步功能的Tomcat服務(wù)器進(jìn)行攻擊。要利用該漏洞,攻擊者需要同時滿足以下4個條件:
1、攻擊者可以控制服務(wù)器上的文件名/文件內(nèi)容;
2、服務(wù)器上配置使用了PersistenceManager的FileStore;
3、PersistenceManager配置了sessionAttributeValueClassNameFilter值為“NULL”或者其他寬松的過濾器,使得攻擊者可以提供反序列化對象;
4、攻擊者知道FileStore使用的存儲位置到可控文件的相對路徑。
攻擊者在同時滿足以上4個條件時,可以發(fā)送一個惡意構(gòu)造的請求,來造成反序列化代碼執(zhí)行漏洞。
漏洞檢測
第一步:從Apache Tomcat官網(wǎng)下載的安裝包名稱中會包含Tomcat的版本號,如果用戶解壓后沒有更改Tomcat的目錄名稱,可以通過查看文件夾名稱來確定當(dāng)前使用的版本。
如果解壓后的Tomcat目錄名稱被修改過,或者通過Windows Service Installer方式安裝,可使用軟件自帶的version模塊來獲取當(dāng)前的版本。也可以進(jìn)入Tomcat安裝目錄的bin目錄,運(yùn)行version.bat(Linux運(yùn)行version.sh)后,可查看當(dāng)前的軟件版本號。
第二步:查看conf/context.xml文件或具體項目的server.xml文件中,是否存在以下<Manager>節(jié)點(diǎn)
若當(dāng)前版本在受影響范圍內(nèi)且在PersistenceManager配置中使用了FileStore,則可能存在安全風(fēng)險。
漏洞防護(hù)
目前官方已在最新版本中修復(fù)了該漏洞,請受影響的用戶盡快升級版本進(jìn)行防護(hù),官方下載鏈接:
|
版本號
|
下載地址
|
|
Apache Tomcat 10.0.0-M5
|
https://tomcat.apache.org/download-10.cgi
|
|
Apache Tomcat 9.0.35
|
https://tomcat.apache.org/download-90.cgi
|
|
Apache Tomcat 8.5.55
|
https://tomcat.apache.org/download-80.cgi
|
|
Apache Tomcat 7.0.104
|
https://tomcat.apache.org/download-70.cgi
|
其他防護(hù)措施
Apache Tomcat官方已經(jīng)發(fā)布新版本修復(fù)上述漏洞,建議受影響用戶盡快升級進(jìn)行防護(hù)。不方便升級的用戶,還可以暫時禁用FileStore功能,或者單獨(dú)配置sessionAttributeValueClassNameFilte的值來確保只有特定屬性的對象可以被序列化/反序列化。
什么是序列化和反序列化?
Java描述的是一個‘世界’,程序運(yùn)行開始時,這個‘世界’也開始運(yùn)作,但‘世界’中的對象不是一成不變的,它的屬性會隨著程序的運(yùn)行而改變。
但很多情況下,我們需要保存某一刻某個對象的信息,來進(jìn)行一些操作。比如利用序列化將程序運(yùn)行的對象狀態(tài)以二進(jìn)制形式儲存在文件系統(tǒng)中。然后可以在另一個程序中對序列化后的對象狀態(tài)數(shù)據(jù)進(jìn)行反序列化恢復(fù)對象?梢杂行У貙(shí)現(xiàn)多平臺之間的通信、對象持久化存儲。
一個類的對象要想序列化成功,必須滿足兩個條件:
1、該類必須實(shí)現(xiàn) java.io.Serializable 接口。
2、該類的所有屬性必須是可序列化的。如果有一個屬性不是可序列化的,則該屬性必須注明是短暫的。
如果你想知道一個 Java 標(biāo)準(zhǔn)類是否是可序列化的,可以通過查看該類的文檔,查看該類有沒有實(shí)現(xiàn) java.io.Serializable接口。
Java反序列化漏洞簡介
因此要利用Java反序列化漏洞,需要在進(jìn)行反序列化的地方傳入攻擊者的序列化代碼。能符合以上條件的地方即存在漏洞。
反序列化漏洞起源開發(fā)失誤開發(fā)時產(chǎn)生的反序列化漏洞常見的有以下幾種情況:1重寫ObjectInputStream對象的resolveClass方法中的檢測可被繞過。2使用第三方的類進(jìn)行黑名單控制。雖然Java的語言嚴(yán)謹(jǐn)性要比PHP強(qiáng)的多,但在大型應(yīng)用中想要采用黑名單機(jī)制禁用掉所有危險的對象幾乎是不可能的。因此,如果在審計過程中發(fā)現(xiàn)了采用黑名單進(jìn)行過濾的代碼,多半存在一兩個‘漏網(wǎng)之魚’可以利用。并且采取黑名單方式僅僅可能保證此刻的安全,若在后期添加了新的功能,就可能引入了新的漏洞利用方式。所以僅靠黑名單是無法保證序列化過程的安全的。
基礎(chǔ)庫基礎(chǔ)庫中隱藏的反序列化漏洞
優(yōu)秀的Java開發(fā)人員一般會按照安全編程規(guī)范進(jìn)行編程,很大程度上減少了反序列化漏洞的產(chǎn)生。并且一些成熟的Java框架比如Spring
MVC、Struts2等,都有相應(yīng)的防范反序列化的機(jī)制。如果僅僅是開發(fā)失誤,可能很少會產(chǎn)生反序列化漏洞,即使產(chǎn)生,其繞過方法、利用方式也較為復(fù)雜。但其實(shí),有很大比例的反序列化漏洞是因使用了不安全的基礎(chǔ)庫而產(chǎn)生的。
2015年由黑客Gabriel
Lawrence和Chris Frohoff發(fā)現(xiàn)的‘Apache Commons
Collections’類庫直接影響了WebLogic、WebSphere、JBoss、Jenkins、OpenNMS等大型框架。直到今天該漏洞的影響仍未消散。
存在危險的基礎(chǔ)庫:
commons-fileupload 1.3.1
commons-io 2.4
commons-collections 3.1
commons-logging 1.2
commons-beanutils 1.9.2
org.slf4j:slf4j-api 1.7.21
com.mchange:mchange-commons-java 0.2.11
org.apache.commons:commons-collections 4.0
com.mchange:c3p0 0.9.5.2
org.beanshell:bsh 2.0
b5org.codehaus.groovy:groovy 2.3.9
org.springframework:spring-aop 4.1.4.RELEASE