2021年12月10日
0x01漏洞背景
Apache Log4j 是 Apache 的一個開源專案,Apache Log4j2是一個基於Java的日誌記錄工具。該工具重寫了Log4j框架,並且引入了大量豐富的特性。我們可以控制日誌資訊輸送的目的地為控制檯、檔案、GUI元件等,通過定義每一條日誌資訊的級別,能夠更加細緻地控制日誌的生成過程。該日誌框架被大量用於業務系統開發,用來記錄日誌資訊。
2021年12月9日,網上監測到一則 Apache Log4j任意程式碼執行漏洞正在被廣泛利用的資訊 。漏洞編號:暫無,漏洞威脅等級:嚴重。
Log4j-2中存在JNDI注入漏洞,當程式將使用者輸入的資料被日誌記錄時,即可觸發此漏洞,成功利用此漏洞可以在目標伺服器上執行任意程式碼。鑑於此漏洞危害較大,建議客戶儘快採取措施防護此漏洞。
log4j2是全球使用廣泛的java日誌框架,同時該漏洞還影響很多全球使用量的Top序列的通用開源元件,例如 Apache Struts2、Apache Solr、Apache Druid、Apache Flink等。該漏洞利用方式簡單,危害嚴重,官方已經發布該產品的最新版本,建議使用者儘快升級元件,修復緩解該漏洞。
0x02漏洞影響版本
Apache Log4j 2.x <= 2.14.1
0x03修復建議
通用修補建議
1、廠商已釋出升級修復漏洞,使用者請儘快更新至安全版本:log4j-2.15.0-rc1
下載連結:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc1
2、升級已知受影響的應用及元件,如srping-boot-strater-log4j2/Apache Solr/Apache Flink/Apache Druid
與此同時,請做好資產自查以及預防工作,以免遭受黑客攻擊。
哈哈!
一則公告搞得人心惶惶。
很多公司在第一時間修復,當時也是最繁鎖的修復方式。因為10號的時候,官方也只是給出了 log4j-2.15.0-rc2 。
幸運的是,我們公司是這週一修復,折騰了半天,發現直接把依賴引入到專案中替換低版本依賴即可。
修復 log4j bug
pom 中新增,如果是父子依賴專案,直接在父專案中新增下面依賴即可:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.15.0</version> </dependency>
接下來,看看在 2.15.0 之前修復的,是有多瘋狂吧。
專案裡面沒有使用到log4j
。springboot
預設引用了starter-logging
裡面包含log4j
且版本是2.14.1
。(包含的log4j-api與log4j-to-slf4j包而不使用log4j-core的應用程式不會受到此漏洞的影響)如果不還放心可以自己排除一下。
可以將依賴log4j
依賴排除掉,或升級一下依賴到log4j
到2.15.0-rc2
。不過目前這個版本maven中央倉庫還沒有,需要自己打包到本地maven倉庫install
後去依賴。
方式一:排除log4j
依賴,找到專案裡面的pom.xml中的spring-boot-starter
排除log4j-to-slf4j
這種方式也是相當繁瑣,相當於排除掉,log4j ,不使用它。這也是最根本的解決辦法,但是要一個一個排除,也是相當麻煩了。
<!-- SpringBoot 核心包 單應用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> </exclusion> </exclusions> </dependency>
怎麼樣看專案中有沒有使用呢,在 idea 中滑鼠放在專案上,右鍵選擇 show Dependecies ... 快捷鍵是:Ctrl+Alt+shift+U
在這個介面裡面,Ctrl + F ,找到 log4j-to-slf4j 並點選它
可以看到專案中很多地方都引用了這個依賴,所以要完全排除,還是比較難的。 具體方法就是找出所有依賴包然後一個個排除。參考方式一
方式二:升級log4j
依賴
在pom.xml
新增log4j
的版本為2.15.0-rc2
覆蓋低版本,這個需要自己去下載最新的 log4j-2.15.0-rc2
版本,地址 https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2 同時intsall到maven倉庫去,因為這個還沒有釋出maven中央倉庫。
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.15.0-rc2</version> </dependency>
注意: 同時intsall到maven倉庫去,這個也是個操作,這裡我把命令貼上出來給大家
mvn install:install-file -DgroupId=org.apache.logging.log4j -DartifactId=log4j-to-slf4j -Dversion=2.15.0-rc2 -Dclassifier=template -Dpackaging=zip -Dfile=D:\01-maven-rep2\logging-log4j2-log4j-2.15.0-rc2.zip
這裡我下載的壓縮包,是放在 D:\01-maven-rep2 目錄下的,對了,我用的是 windows 系統。Linux 需要下載對應的壓縮包。
到這裡可還沒完,只是在本地把這個包載入進來,但是我們一般開發和運維環境都是分開的。所以要把這個包放到運維使用的 maven 倉庫中,不然打包就會出現找不到包。具體這一步,需要和自己公司運維同事溝通。
看看那些快被逼瘋的人們:
方式三:升級log4j
依賴版本為 2.15.0
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.15.0</version> </dependency>
哈哈,最省事的了。但是,相對一些比較大的公司來說,可能是幾百上千個服務,這也很頭大。只能人肉運維去弄了,強一點的大佬都會去寫指令碼,甚至是不屑一顧
參考連結:https://gitee.com/y_project/RuoYi-Vue/issues/I4LX91