1. 程式人生 > 其它 >log4j2 lookup漏洞修復方法

log4j2 lookup漏洞修復方法

2021.12.10凌晨,Apache Log4j遠端程式碼執行漏洞細節被公開,參考連結:https://unit42.paloaltonetworks.com/apache-log4j-vulnerability-cve-2021-44228/,也可以在cve網站上查詢到:https://www.cve.org/CVERecord?id=CVE-2021-44228,當前漏洞適用的版本:Log4j 2.x <= 2.15.0-rc1,僅在Log4j 2中存在此漏洞,Log4j 1.x版本不受影響,下面舉了幾個例子,對於常見的開源軟體或者引用該庫的程式都可以按照下面的方法修復。

1.ElasticSearch

存在的版本:6.x、7.x、8.x,首先是建議開啟使用者名稱密碼訪問,提升安全性。

編輯ElasticSearch安裝目錄下的conf/jvm.options,新增jvm引數:

-Dlog4j2.formatMsgNoLookups=true

然後儲存並退出檔案,重啟ElasticSearch服務生效,每個節點都要修改並重啟。

也可以下載最新的2.15.0的Log4j jar包替換掉elasticsearch lib下面的老版本Log4j jar包,然後重啟ElasticSearch服務生效,具體的連結會在後面給出。

2.Kafka

版本:1.x、2.x

編輯kafka安裝目錄下的啟動指令碼:bin/kafka-server-start.sh,找到KAFKA_LOG4J_OPTS環境變數位置,編輯變數追加jvm引數:

# 修改export的值
export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/log4j.properties -Dlog4j2.formatMsgNoLookups=true"

然後儲存之後,重啟kafka broker生效,即先使用停止指令碼停掉服務再使用啟動指令碼啟動服務,叢集所有節點都需要操作。

3.Flink

版本2.11版本及以上,2.11以下的版本不受影響,然後編輯安裝目錄下的conf/flink-conf.yaml新增下面的配置:

env.java.opts: -Dlog4j2.formatMsgNoLookups=true

然後儲存配置並退出,每個節點都要修改,最後停止flink集群后再啟動即可生效。

4.maven專案

maven專案中關於log4j的引用可以直接升級到最新版本,pom配置如下:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.15.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.15.0</version>
</dependency>

官方已經將補丁合併至2.15.0穩定版,所以儲存並更新maven依賴後,重新編譯專案:

mvn package

生成新的jar包即可修復bug。

5.自己開發的java程式碼

下載新版本的log4j依賴包,然後使用log4j-api-2.15.0.jar和log4j-core-2.15.0.jar替換掉現有專案中的依賴並重新編譯即可,下載連結在最後。

6.線上正在執行的獨立java程式

對於正在獨立執行的java程式可以按照下面的方法關閉。

6.1.新增jvm引數

和上面類似,比如:

java -cp .:./lib/*:./etc/log4j2.xml: -Dlog4j2.formatMsgNoLookups=true com.aaa.bbb.MainClass

6.2.新增配置檔案

建立並編輯配置檔案log4j2.component.properties內容為:

log4j2.formatMsgNoLookups=true

其實和jvm引數一樣,只是這裡用了配置檔案來單獨存放,這樣儲存配置後在啟動java程式時新增到classpath中:

java -cp .:./lib/*:./etc/log4j2.xml:./etc/log4j2.component.properties: com.aaa.bbb.MainClass

6.3.匯入環境變數

執行程式前匯入環境變數:

export FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true

可以將變數配置到/etc/profile或者~/.bashrc中每次進入shell都會生效,然後再正常啟動java程式即可。

其實上面的ElasticSearch、Kafka、Flink直接匯入這個環境變數也是可以的,log4j相關的模組會自動讀取該變數並進行設定。

總結來說,上面這些方法無非就是修改jvm引數或者設定相關的變數來關閉lookup的功能,從而切斷遠端程式碼執行,或者是直接升級官方最新的Log4j的版本來修復問題。

Log4j程式包下載:https://dlcdn.apache.org/logging/log4j/2.15.0/apache-log4j-2.15.0-bin.tar.gz