首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修补程序保护多个log4j jars以防止log4shell

修补程序保护多个log4j jars以防止log4shell
EN

Stack Overflow用户
提问于 2021-12-15 08:52:40
回答 1查看 526关注 0票数 0

我必须保护一些服务器对抗CVE-2021-44228又名log4shell。这些机器都在运行Linux,并且拥有大量的log4j jars,有的来自应用服务器,有的来自遗留软件等等。我担心不可能将它们全部更新到最新的log4j上。

但是,如果我正确理解,可以通过删除受影响的类来防止log4shell在log4j 1.x中使用,如下所示:

代码语言:javascript
复制
zip -q -d log4j.jar org/apache/log4j/net/JMSAppender.class

在log4j 2.x中,如下所示(参见logging.apache.org):

代码语言:javascript
复制
zip -q -d log4j-core.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

我想到一个shell脚本来查找所有的log4j jars,可能如下所示:

代码语言:javascript
复制
find / -name "log4j*.jar"

并对所有结果调用这两个zip命令。不幸的是,我不擅长shell脚本。有人会根据这个想法写剧本吗?

警告:

  • 当然,通过这样做,您可以从log4j中丢失所有JNDI查找和/或JMS功能。
  • log4j 1.x还有其他安全问题。所以最好升级到最新的logj2.x。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-15 11:12:52

这是我自己的机会。不太优雅(很重复),但是输出颜色很好。而且它只在log4j版本被破坏(FIX_VERSION="2.17.1“以防止CVE-2021-45105)和CVE-2021-44832时才删除该类。

代码语言:javascript
复制
#!/bin/bash
echo " ┌──────────────────────────────────────────────┐"
echo " │ This is securelog4j version 1.5              │"
echo " │ https://stackoverflow.com/a/70362694/1948252 │"
echo " └──────────────────────────────────────────────┘"
preventLog4Shell() {
    readonly FIX_VERSION="2.17.1" # see https://logging.apache.org/log4j/2.x/security.html
    readonly VERSION=$(unzip -p "$1" META-INF/MANIFEST.MF | grep Implementation-Version | cut -d " " -f2 | sed -r 's/\s*$//g')
    readonly RED="\033[31m"
    readonly GREEN="\033[32m"
    readonly YELLOW="\033[33m"
    readonly BOLD=$(tput bold)
    readonly RESET=$(tput sgr0)
    readonly SMALL=$(echo -e $VERSION'\n'$FIX_VERSION | sort -V | head -n1)
    if [ "$SMALL" = "$FIX_VERSION" ]
    then
        echo -e $BOLD$GREEN good version $VERSION:$RESET $1
    else
        hasJms=$(zip -v "$1" org/apache/log4j/net/JMSAppender.class | grep including)
        hasJndi=$(zip -v "$1" org/apache/logging/log4j/core/lookup/JndiLookup.class | grep including)
        if [ "$hasJms" ] || [ "$hasJndi" ]
        then
            if [ "$hasJms" ]
            then
                zip -d -q "$1" org/apache/log4j/net/JMSAppender.class
                hasJms=$(zip -v "$1" org/apache/log4j/net/JMSAppender.class | grep including)
                if [ "$hasJms" ]
                then
                    echo -e $BOLD$RED unable to secure:$RESET $1
                else
                    echo -e $BOLD$YELLOW secured:$RESET $1
                fi
            else 
                zip -d -q "$1" org/apache/logging/log4j/core/lookup/JndiLookup.class
                hasJndi=$(zip -v "$1" org/apache/logging/log4j/core/lookup/JndiLookup.class | grep including)
                if [ "$hasJndi" ]
                then
                    echo -e $BOLD$RED unable to secure:$RESET $1
                else
                    echo -e $BOLD$YELLOW secured:$RESET $1
                fi
            fi
            else echo -e $BOLD$GREEN found clean:$RESET $1
        fi
    fi
}

if command -v zip &> /dev/null
then 
    export -f preventLog4Shell
    find / -name "log4j*.jar" -exec bash -c 'preventLog4Shell "$0"' {} \;
else 
    echo You have to install “zip” first.
fi

输出如下:

截图说明:

  • 以前已经清理过两个文件,因此“找到干净”。
  • 最后一个文件是只读的,因此“无法安全”。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70360767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档