刪除Log4j 1。類路徑中的JMSAppender和SocketServer類

刪除Log4j 1。類路徑中的JMSAppender和SocketServer類。

寫的亞當Pavlacka

最後發布時間:2022年5月16日

Databricks最近發表了一篇博客Log4j 2漏洞(CVE-2021-44228)研究與評估.Databricks平台沒有直接使用已知受此漏洞影響的Log4j版本,我們認為這種方式可能是脆弱的。Beplay体育安卓版本

Databricks也不使用Log4j 1中受影響的類。X有已知的弱點(cve - 2021 - 4104cve - 2020 - 9488,cve - 2019 - 17571).然而,如果您的代碼使用這些類之一(JMSAppender或SocketServer),您的使用可能會受到這些漏洞的潛在影響。

如果您的代碼使用Log4j,則應該升級到Log4j 2.17或更高版本。

如果由於技術原因無法升級,可以使用全局初始化腳本(AWS|Azure|GCP)在集群啟動時從Log4j中剝離受影響的類。

刪除

警告

因為我們不控製您運行的代碼,所以我們不能保證這個解決方案將在所有情況下阻止Log4j加載受影響的類。

配置全局init腳本

刪除

信息

運行此腳本對於依賴於受影響類的任何代碼都是破壞性的更改。

AWS

  1. 轉到管理控製台並單擊全球Init腳本選項卡。
  2. 單擊+添加按鈕。
  3. 輸入腳本的名稱。
  4. 將以下腳本複製到腳本字段。
    % sh # !/bin/bash初始化腳本刪除某些Log4J' FILES_TO_DELETE=(org/apache/log4j/net/JMSAppender.class / apache/log4j/net/socketserver .class) find "/databricks" \ -name '*log4j*.jar' \ -exec echo -e "\nProcessing {}" \;-exec zip -d {} "${FILES_TO_DELETE[@]}" \;退出0
    刪除Log4j的全局初始化腳本。從類路徑中獲取JMSAppender和SocketServer類。
  5. 如果您為您的工作區配置了多個全局初始化腳本,那麼您應該將該腳本配置為在其他腳本之後運行。
  6. 確保啟用開關已打開。
  7. 點擊添加
  8. 重新啟動所有正在運行的集群。
刪除


Azure

  1. 轉到管理控製台並單擊全球Init腳本選項卡。
  2. 單擊+添加按鈕。
  3. 輸入腳本的名稱。
  4. 將以下腳本複製到腳本字段。
    % sh # !/bin/bash初始化腳本刪除某些Log4J' FILES_TO_DELETE=(org/apache/log4j/net/JMSAppender.class / apache/log4j/net/socketserver .class) find "/databricks" \ -name '*log4j*.jar' \ -exec echo -e "\nProcessing {}" \;-exec zip -d {} "${FILES_TO_DELETE[@]}" \;退出0
    刪除Log4j的全局初始化腳本。從類路徑中獲取JMSAppender和SocketServer類。
  5. 如果您為您的工作區配置了多個全局初始化腳本,那麼您應該將該腳本配置為在其他腳本之後運行。
  6. 確保啟用開關已打開。
  7. 點擊添加
  8. 重新啟動所有正在運行的集群。
刪除


GCP

使用全局初始化腳本API 2.0將以下初始化腳本應用到您工作區中的每個集群。

% sh # !/bin/bash初始化腳本刪除某些Log4J' FILES_TO_DELETE=(org/apache/log4j/net/JMSAppender.class / apache/log4j/net/socketserver .class) find "/databricks" \ -name '*log4j*.jar' \ -exec echo -e "\nProcessing {}" \;-exec zip -d {} "${FILES_TO_DELETE[@]}" \;退出0

應用全局初始化腳本後,重新啟動所有正在運行的集群。

刪除

驗證受影響的類不可用

您應該在每個集群上運行一個測試,以確保受影響的類不可用。

測試1

可以對筆記本中受影響的類運行斷言檢查。

%scala assert(this.getClass.getClassLoader().getResource("org/apache/log4j/net/JMSAppender.class") == null)斷言(this.getClass.getClassLoader().getResource("org/apache/log4j/net/SocketServer.class") == null)

如果禁用了受影響的類,則此示例代碼可以成功運行。

如果您沒有禁用受影響的類,這個示例代碼應該返回一個錯誤。

測試2

可以嚐試將受影響的類導入到筆記本中。

%scala import org.apache.log4j.net.JMSAppender import org.apache.log4j.net.SocketServer . jmsappender

如果沒有禁用受影響的類,則此示例代碼可以成功運行。

如果禁用了受影響的類,此示例代碼應該返回一個錯誤。

警告

在一些情況下,您可以重新引入Log4j 1。x版本的JMSAppender或SocketServer。

問題

如果在Log4j 1上安裝帶有傳遞依賴項的Maven庫。X,它的所有類都被重新添加到類路徑中。

解決方案

可以通過將Log4j添加到除外責任字段在安裝Maven庫時。

安裝顯示exclements字段的Maven庫選項。

問題

如果配置了外部Apache Hive轉移庫,Apache Spark將使用Ivy解析和下載正確的轉移庫客戶端庫及其所有的傳遞依賴項,可能包括Log4j 1.x。

為了加速集群啟動,可以將下載的jar緩存到DBFS上,並使用一個初始化腳本從緩存中安裝。如果像這樣緩存jar,則可能Log4j 1。X可以包括在內。

解決方案

您可以配置外部metastore的初始化腳本來刪除受影響的類。