修復Apache Log4j任意程式碼執行漏洞安全風險通告

天下沒有收費的bug發表於2021-12-13

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 之前修復的,是有多瘋狂吧。

 

專案裡面沒有使用到log4jspringboot預設引用了starter-logging裡面包含log4j且版本是2.14.1。(包含的log4j-api與log4j-to-slf4j包而不使用log4j-core的應用程式不會受到此漏洞的影響)如果不還放心可以自己排除一下。

可以將依賴log4j依賴排除掉,或升級一下依賴到log4j2.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


 

相關文章