有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (6) 个答案

  1. # 1 楼答案

    这取决于类加载器,但是看看example,您可以在log4j的Layout类上调用方法getImplementationVersion

    org.apache.log4j.Layout.class.getPackage().getImplementationVersion()
    
  2. # 2 楼答案

    我不认为这是首选方法,但这是我确定软件使用的Log4j版本的方式:

    打开或提取Log4j的内容。使用一个罐子。zip存档实用程序(Windows资源管理器支持此功能)。导航到“META-INF”子目录&;在文本编辑器中打开文件“MANIFEST.MF”。找到以“实现版本”开头的行,这是Log4j版本

    显然,这不是一个程序化的解决方案。但如果你只是想知道你使用的是什么版本;你有。jar存档,很有效

    编辑:我注意到Package.getSpecificationVersion()&^如Loic M.'s answer中所述,为他人工作。jar库,但不是我的Log4j。我使用的版本可能不支持它

    编辑:我下载了版本2.13.1来尝试上述方法&;发现他们确实在用它。所以我的版本(1.2.16)不支持它们&;返回null

  3. # 3 楼答案

    一个简单的方法:

    1. 在日志中设置调试断点。调试()
    2. “进入”下一个语句以确定调用的类
    3. 检查被调用类的jar版本
  4. # 4 楼答案

    我已经编写了一个小的bash脚本来检查该服务器中每个log4jjar文件的版本。它从清单文件中读取版本信息,因为信任文件名有点风险

    locs=( $(sudo find / -name 'log4j*'|grep jar) )
    fcount=${#locs[@]}
    
    echo "Found $fcount jar files"
    echo " "
    
    for (( j=0; j<${fcount}; j++ ));
    do
       unzip ${locs[$j]} META-INF/MANIFEST.MF
       mv META-INF/MANIFEST.MF META-INF/MANIFEST$j.MF
    done
    
    echo " "
    for (( j=0; j<${fcount}; j++ ));
    do
        echo ${locs[$j]}
        tail -2 META-INF/MANIFEST$j.MF
    done
    
  5. # 5 楼答案

    删除所有你不需要的版本的JAR(一个就足够了),并找出剩下版本的JAR,查看文件名。 例如:

    log4j-1.2.17.jar
    
  6. # 6 楼答案

    我是在得知我的服务器可能容易受到新的log4j(CVE-2021-44228)攻击后来到这里的

    所以我需要知道我是否安装了过时的版本2。这里的其他答案对此没有帮助,因为它们是为了让运行java代码的人知道它将使用哪个版本的log4j,而我需要知道任何java应用程序是否可能使用易受攻击的版本

    以下是我所做的:

    sudo find / -name 'log4j*'
    

    这列出了我(Linux)服务器上所有与log4j相关的文件。这给我看了几个1。x版本,不易受攻击,以及一个2.15.0文件,该文件已包含CVE的修复程序

    如果你运行这个程序,发现文件名或文件夹名有2个。x、 与x<;15,那么你很可能容易受到攻击,需要弄清楚如何尽快更新你的文件

    小心

    有人警告我,对于我来说,这还不够,因为log4j文件可能隐藏在一个文件中。jar文件,find命令找不到该文件

    更新

    这是一个公共项目,它试图扫描所有内容。jar文件,以便在归档文件中查找log4j代码:

    https://github.com/mergebase/log4j-detector