删除Log4j 1。x JMSAppender SocketServer类从类路径中

删除Log4j 1。x JMSAppender SocketServer类从类路径中。

写的亚当Pavlacka

去年发表在:2022年5月16日

砖最近发表一篇博客Log4j 2脆弱性(cve - 2021 - 44228)的研究和评估。砖不直接使用Log4j版本已知受此影响的脆弱性在砖平台在某种程度上我们理解可能是脆弱的。bob体育客户端下载

砖也不影响使用Log4j 1类。与已知的漏洞x (cve - 2021 - 4104,cve - 2020 - 9488,cve - 2019 - 17571)。但是,如果您的代码使用这些类(JMSAppender或SocketServer)之一,使用可能影响这些漏洞。

如果您的代码使用Log4j,你应该升级到Log4j 2.17或以上。

如果你不能升级因为技术原因,您可以使用一个全球init脚本(AWS|Azure|GCP从Log4j)带影响类集群开始。

删除

警告

因为我们不控制运行的代码,我们不能保证这个解决方案将防止Log4j加载类在所有情况下的影响。

配置全球init脚本

删除

信息

运行这个脚本是一个打破的变化依赖于影响类的任何代码。

AWS

  1. 去管理控制台并单击全球Init脚本选项卡。
  2. 单击+添加按钮。
  3. 输入脚本的名称。
  4. 下面的脚本复制到脚本字段。
    % sh # !/bin/bash回声的Init脚本删除某些Log4J 1。x类,版本1.0 (2021-12-17)' FILES_TO_DELETE = (org/apache/log4j/net/JMSAppender。类org/apache/log4j/net/SocketServer。类)发现“/砖" \ - name ' * log4j *。jar”\ - echo - e \ nProcessing {}“\;- zip - d {} " $ {FILES_TO_DELETE [@]}“\;退出0
    全球init脚本删除Log4j 1。x JMSAppender SocketServer类的类路径中。
  5. 如果你有超过一个全球init脚本配置为工作区,你应该配置这个脚本运行后其他脚本。
  6. 确保启用开关进行切换。
  7. 点击添加
  8. 重启所有正在运行的集群。
删除


Azure

  1. 去管理控制台并单击全球Init脚本选项卡。
  2. 单击+添加按钮。
  3. 输入脚本的名称。
  4. 下面的脚本复制到脚本字段。
    % sh # !/bin/bash回声的Init脚本删除某些Log4J 1。x类,版本1.0 (2021-12-17)' FILES_TO_DELETE = (org/apache/log4j/net/JMSAppender。类org/apache/log4j/net/SocketServer。类)发现“/砖" \ - name ' * log4j *。jar”\ - echo - e \ nProcessing {}“\;- zip - d {} " $ {FILES_TO_DELETE [@]}“\;退出0
    全球init脚本删除Log4j 1。x JMSAppender SocketServer类的类路径中。
  5. 如果你有超过一个全球init脚本配置为工作区,你应该配置这个脚本运行后其他脚本。
  6. 确保启用开关进行切换。
  7. 点击添加
  8. 重启所有正在运行的集群。
删除


GCP

使用2.0全球Init脚本API下面的init脚本应用于每一个集群在工作区中。

% sh # !/bin/bash回声的Init脚本删除某些Log4J 1。x类,版本1.0 (2021-12-17)' FILES_TO_DELETE = (org/apache/log4j/net/JMSAppender。类org/apache/log4j/net/SocketServer。类)发现“/砖" \ - name ' * log4j *。jar”\ - echo - e \ nProcessing {}“\;- zip - d {} " $ {FILES_TO_DELETE [@]}“\;退出0

重启后所有正在运行的集群应用全球init脚本。

删除

验证影响类是不可用的

你应该每个集群上运行测试,以确保受影响的类是不可用的。

测试1

您可以运行一个断言检查受影响的类在一个笔记本上。

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

这个示例代码运行成功如果你有残疾影响类。

这个示例代码应该返回一个错误如果你没有残疾影响类。

测试2

你可以试图影响类导入到一个笔记本。

% scala进口org.apache.log4j.net.JMSAppender org.apache.log4j.net.SocketServer进口

此示例代码成功运行如果你没有残疾影响类。

这个示例代码应该返回一个错误如果你有残疾影响类。

警告

有一些角落的情况你可以再次引入Log4j 1。x版本JMSAppender或SocketServer。

问题

如果你安装一个Maven库传递依赖Log4j 1。x,所有的类都是重新添加到类路径中。

解决方案

您可以通过添加Log4j的解决这个问题除外责任现场在安装Maven库。

安装Maven库选项显示排除字段。

问题

如果你配置一个外部Apache蜂巢metastore, Apache火花使用Ivy来解决和下载正确的metastore客户端库,和所有的过渡依赖,可能包括Log4j 1. x。

加快集群启动,您可以缓存下载的jar DBFS和使用init脚本安装从缓存中。如果缓存这样的罐子,有可能是Log4j 1。x可能包括在内。

解决方案

您可以配置外部metastore的init脚本删除受影响的类。

这篇文章有用吗?