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