将Apache Solr 8.10.1 log4j 2.14.1版本升级到2.15解决严重漏洞

Upgrade Apache Solr 8.10.1 log4j 2.14.1 version to 2.15 to address critical vulnerability

最近 critical log4j vulnerability 被发现。

我想升级当前 Solr 实例使用的 log4j,所以我 checked here。 但是,我在“/server/resources/”文件夹中没有看到 log4j.properties 文件。 我看到的只有:

None 个文件包含一个版本。所以要升级,下载最新版本的 log4j 并覆盖文件夹“\solr-8.10.1\server\lib\ext”中的现有 jar 是否安全,或者推荐的升级步骤是什么?

您所指的 link 适用于旧版本的 Solr(6.6 而不是 8.10.1)。正确的版本是 https://solr.apache.org/guide/8_10/configuring-logging.html 其中提到使用 log4j 2.

文件 log4j2.xml(甚至 `log4j.properties 就此而言)配置日志记录本身,而不是 log4j 的版本。所以更新那个文件是无关紧要的。

这里是what the project page recommends

2021-12-10, Apache Solr affected by Apache Log4J CVE-2021-44228

...

Description: Apache Solr releases prior to 8.11.1 were using a bundled version of the Apache Log4J library vulnerable to RCE. For full impact and additional detail consult the Log4J security page.

...

Mitigation: Any of the following are enough to prevent this vulnerability for Solr servers:

  • Upgrade to Solr 8.11.1 or greater (when available), which will include an updated version of the log4j2 dependency.
  • Manually update the version of log4j2 on your runtime classpath and restart your Solr application.
  • (Linux/MacOS) Edit your solr.in.sh file to include: SOLR_OPTS="$SOLR_OPTS -Dlog4j2.formatMsgNoLookups=true"
  • (Windows) Edit your solr.in.cmd file to include: set SOLR_OPTS=%SOLR_OPTS% -Dlog4j2.formatMsgNoLookups=true
  • Follow any of the other mitgations listed at https://logging.apache.org/log4j/2.x/security.html

您的建议(覆盖文件夹“\solr-8.10.1\server\lib\ext”中的现有 jars)似乎是第二种方法,因此它应该可以正常工作。只需确保这是包含 log4j 依赖项的正确位置。

我在 /opt/solr-7.4.0/server/lib/ext 文件夹中将所有 log4j jar 从 2.11 更新到 2.15,但我没有发现任何问题。您的方法似乎有效。

用lib/ext中对应的2.15版本替换所有jar并重启solr。似乎有效。

  1. log4j-api-2.11.0.jar
  2. log4j-core-2.11.0.jar
  3. log4j-1.2-api-2.11.0.jar
  4. log4j-slf4j-impl-2.11.0.jar

对于 Solr 版本 8.6.4,我现在通过简单地交换“Solr\server\lib\ext”下的 5 个 log4j*.jar 文件来更新到 log4j2 2.16。此外,我还必须将 slf4j-api.jar 更新到版本 1.7.24。这似乎开箱即用。

下载链接:

-> updated lib files

缓解措施:以下任何一项都足以防止 Solr 服务器出现此漏洞:

  • 升级到 Solr 8.11.1 或更高版本(如果可用),这将 包含 Log4J 依赖项的更新版本 (>= 2.17.0)。

  • 如果 您使用的是 Solr 的官方 docker 镜像,它已经被 在 Docker Hub 上列为支持的所有版本中得到缓解: https://hub.docker.com/_/solr。您可能需要重新拉取镜像。

  • 在您的运行时类路径上手动更新 Log4J 的版本,并且 重新启动您的 Solr 应用程序。

  • (Linux/MacOS) 编辑您的 solr.in.sh 要包含的文件:SOLR_OPTS="$SOLR_OPTS -Dlog4j2.formatMsgNoLookups=真

  • (Windows) 编辑您的 solr.in.cmd 文件以包含:设置 SOLR_OPTS=%SOLR_OPTS% -Dlog4j2.formatMsgNoLookups=真

  • 遵循 https://logging.apache.org/log4j/2.x/security.html

    中列出的任何其他缓解措施

参考:https://solr.apache.org/security.html#apache-solr-affected-by-apache-log4j-cve-2021-44228

在我的例子中,以下 jar 受到影响并被直接来自 Apache. Use something like the log4j detector 的最新包替换,以识别受影响的 jar。

  • %SOLRINST%\solr\contrib\prometheus-exporter\lib\log4j-api-2.11.2.jar
  • %SOLRINST%\solr\contrib\prometheus-exporter\lib\log4j-core-2.11.2.jar
  • %SOLRINST%\solr\contrib\prometheus-exporter\lib\log4j-slf4j-impl-2.11.2.jar
  • %SOLRINST%\solr\server\lib\ext\log4j-1.2-api-2.11.2.jar
  • %SOLRINST%\solr\server\lib\ext\log4j-api-2.11.2.jar
  • %SOLRINST%\solr\server\lib\ext\log4j-core-2.11.2.jar
  • %SOLRINST%\solr\server\lib\ext\log4j-slf4j-impl-2.11.2.jar
  • %SOLRINST%\solr\server\lib\ext\log4j-web-2.11.2.jar

如果您运行将 Solr 作为 docker,您可以做的是在从 JndiLookup.class罐子。

让我过一遍我用过的步骤。

  • 找到 Solr 图像正在使用的 log4j-core 版本。您可以通过在您的 Solr 运行ning 主机或进入您的 Solr 容器后执行以下命令来完成此操作

    找到/-name "log4j-core-*.jar"

  • 在那里你会得到两条路。根据Solr security news page,我们可以忽略prometheus-exporter路径。剩下的就是server/lib/ext/路径

  • 复制特定的 .jar 文件或从 Internet 下载相同版本。我用 log4j-core-2.11.2.jar

    测试过这个
  • 将该 jar 文件复制到您的 Solr 容器 运行ning 主机并使用此 log4j-detector.

    检查其漏洞状态
  • 使用上述工具检查该漏洞并不复杂。您需要做的是将该 log4j-detector-2021.12.16.jar 文件下载到可访问的位置,然后 运行 针对您的 log4j-core jar 文件的命令。

    java -jar log4j-detector-2021.12.16.jar 8.4.1-ext > hits_8.4.1_ext.txt

然后你会得到如下所示的输出,表明它是易受攻击的。

/ext/log4j-core-2.11.2.jar contains Log4J-2.x >= 2.10.0 VULNERABLE :-(

  • 现在让我们从那个 log4j-core jar 文件中删除 JndiLookup.class

    zip -q -d 8.4.1-ext/ext/log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

  • 然后,针对同一个 log4j-core jar 文件再次检查漏洞,您将能够看到如下内容。

/ext/log4j-core-2.11.2.jar contains Log4J-2.x <= 2.0-beta8 POTENTIALLY_SAFE :-| (or did you already remove JndiLookup.class?)

这意味着 JndiLookup.class 删除已成功完成。

  • 让我们使用 docker-compose.yaml

    安装 log4j-core jar 文件

    数量:

    - ./log4j-core-2.11.2.jar:/opt/solr-8.4.1/server/lib/ext/log4j-core-2.11.2.jar

  • 现在,重新启动您的 Solr docker 容器。


我个人的偏好是使用环境变量将 属性 更新为 SOLR_OPTS,因为它既漂亮又干净。

the new CVESOLR_OPTS是不够的。升级到 2.17 似乎是最好的选择。这是对我们有用的。

sudo find / -name "*log4j*"
cd /app/solr/solr-7.7.0/server/lib/ext/
sudo curl https://dlcdn.apache.org/logging/log4j/2.17.0/apache-log4j-2.17.0-bin.zip --output apache-log4j-2.17.0-bin.zip
sudo unzip apache-log4j-2.17.0-bin.zip
sudo rm log4j-*-2.11*
sudo cp apache-log4j-2.17.0-bin/{log4j-1.2-api-2.17.0.jar,log4j-api-2.17.0.jar,log4j-core-2.17.0.jar,log4j-slf4j-impl-2.17.0.jar} ./
sudo chown solr:solrgrp *
sudo chmod 755 *
sudo service solr restart

cd /app/solr/solr-7.7.0/contrib/prometheus-exporter/lib/
sudo rm log4j-*-2.11*
sudo cp /app/solr/solr-7.7.0/server/lib/ext/apache-log4j-2.17.0-bin/{log4j-api-2.17.0.jar,log4j-core-2.17.0.jar,log4j-slf4j-impl-2.17.0.jar} ./
sudo chown solr:solrgrp *
sudo chmod 755 *
sudo service solr restart