瞎記日志也有錯(cuò)!Log4j2史詩(shī)級(jí)漏洞,影響面極大,味道不好聞!
Log4j今日被曝嚴(yán)重漏洞,作為Java界日志工具的杠把子,Log4j和Logback幾乎統(tǒng)一了江湖,影響面不可謂不大。比如,Apache Struts2、Apache Solr、Apache Druid、Apache Flink、Minecraft 、iCloud整個(gè)生態(tài)都受到影響。
被影響的版本包括從2.0到2.14.1,跨度比較大。
- 2.0 <= Apache log4j <= 2.14.1
趕緊瞧一下自己有沒(méi)有中招。
通過(guò)Debug log4j的代碼,最終定位到發(fā)生問(wèn)題的代碼。可以看到,一個(gè)日志組件,實(shí)現(xiàn)的功能遠(yuǎn)遠(yuǎn)比我們平常使用的要多。
如果用戶打印了下面的日志。
- logger.error("${jndi:ldap://127.0.0.1:1389/a}");
那么將會(huì)觸發(fā)JndiLookup.java中的方法,主動(dòng)發(fā)起連接。通過(guò)精心構(gòu)造的Playload,即可允許攻擊者執(zhí)行任何代碼。
這是非常危險(xiǎn)的。經(jīng)測(cè)試,即使使用占位符的方式而不是拼接字符串的方式,也不能避免這個(gè)問(wèn)題。比如,如果用戶在登錄頁(yè)面輸入了${jndi:ldap://127.0.0.1:1389/a},沒(méi)有做過(guò)濾,又在后端打印了username變量的時(shí)候,就會(huì)觸發(fā)這個(gè)漏洞。
- public static void main(String[] args) {
- String username = "${jndi:ldap://127.0.0.1:1389/a}";
- logger.error("用戶名:{}", username);
- }
它的影響存在于方方面面,只要你打印了某些東西,這些東西又能被構(gòu)造的話,就會(huì)發(fā)生問(wèn)題。比如你從http頭里面打印了useragent,那么我們就可以把playload塞進(jìn)去。
- string userAgent = he.getRequestHeader("user-agent");
- log.info("Request User Agent:" + userAgent);
- String response = "<h1>Hello There, " + userAgent + "!</h1>";
所以,把它稱作史詩(shī)級(jí)的漏洞,不足為過(guò)。
log4j-2.15.0-rc1發(fā)布了緊急補(bǔ)丁。
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc1
但不久又被發(fā)現(xiàn)依然存在新的問(wèn)題。所以目前最好的方式是升級(jí)到rc2版本。
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
可惜的是,現(xiàn)在我們并沒(méi)有在maven的中央倉(cāng)庫(kù)發(fā)現(xiàn)這個(gè)版本。你需要自行修復(fù)。
你可以到apache的倉(cāng)庫(kù)中找找。
https://repository.apache.org/content/groups/snapshots/org/apache/logging/log4j/log4j-core/
鑒于更新jar包復(fù)雜的原因,建議直接在JVM啟動(dòng)參數(shù)里進(jìn)行規(guī)避。不知道怎么改的直接看圖。
- -Dlog4j2.formatMsgNoLookups=true
漏洞影響重大,你的公司或許已經(jīng)緊鑼密鼓的開(kāi)始的打補(bǔ)丁。
祝你好運(yùn)!
作者簡(jiǎn)介:小姐姐味道 (xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。