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