如何检查Java项目是否依赖于有漏洞的Log4j
bigegpt 2024-10-12 06:13 10 浏览
众所周知,被定义和跟踪为 CVE-2021-44228 ,也被称为 Log4Shell 的 Log4j 漏洞,允许攻击者在目标系统中执行任意代码。因此,如果您的应用正在使用Log4j的2.0-alpha1到2.14.1版的话,那么就应当尽快更新到其 最新的版本 (目前为2.16.0)。
对此,瑞士政府发布了一张能够很好地解释该漏洞的被攻击流程图,请参见下图:
下面,让我们根据上图,深入研究与其有关的缓解策略。
使用Maven的依赖项插件
在Maven项目中,您可以通过如下简单命令,在依赖项树(dependencies tree)中搜索log4j-core的相关依赖项,并检查该项目是否使用到了受影响的依赖项。
纯文本
mvn dependency:tree -Dincludes=org.apache.logging.log4j:log4j-core
该命令使用 Maven Dependency Plugin 来显示项目的依赖树(包括各种有传递关系的依赖项)。通过后面的参数,该命令过滤并输出了log4-core的依赖项。因此,如果您的项目正在依赖某个易受攻击的Log4j版本的话,那么您将会看到如下内容:
在这个例子中,由输出可知,该项目直接使用Log4j的2.14.1版。显然,它是易受攻击的。因此,本项目需要将如下依赖项:
XML
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version> <!-- update this! -->
</dependency>
替换为:
XML
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.16.0</version> <!-- or newer version -->
</dependency>
同理,我在MariaDB数据库的JDBC连接器项目中,进行了如下测试,并得出了对应的结果:
庆幸的是,该项目并未使用Log4j,因此它不易受到Log4Shell的攻击。更多有关 MariaDB特定案例的信息,请参阅--https://dzone.com/articles/is-the-mariadb-jdbc-driver-affected-by-the-log4j-v。
使用Maven的帮助插件
如果您想做进一步的调查,则需要检查有效的POM(Project Object Model,项目对象模型),并搜索项目中使用的日志记录框架。让我们将目光转回刚才的MariaDB JDBC连接器项目,我使用 Maven的帮助插件 ,生成了有效的POM。由于我使用的是类Unix的操作系统(您可以通过截图看到,其实是macOS),因此我使用如下grep命令(在Windows中,您可以使用findstr)来过滤输出:
纯文本
mvn help:effective-pom | grep log
并且得到了来自mvn的如下输出:
由输出可知,MariaDB JDBC驱动程序使用 Logback 作为日志记录框架。虽然Logback不会受到Log4Shell的影响,但是它带有 1.2.8和1.3.0-alpha11版本中的相关漏洞 。当然,其严重程度要轻得多,我们不必过于恐慌。我查看了其连接器(connector)所使用的版本,该版本号为1.3.0-alpha10。尽管Logback作为测试依赖项,被包含在MariaDB驱动程序中,但我在GitHub上发送了一个 拉取请求 ,以便对其予以更新。在此,我鼓励您也对自己手头的各种开源项目执行类似的操作,以尽早发现那些易受攻击的依赖项。
使用Syft和Grype
在包含了大量JAR文件的更复杂的项目中,您可以使用 Syft 和 Grype 之类的工具。其中Syft是一个CLI(命令行接口)工具和Go语言库,可被用于从容器镜像和文件系统中生成软件物料清单(Software Bill of Materials,SBOM)。Grype则能够通过多级嵌套,去扫描各个容器镜像和文件系统中的漏洞。两者可以协同使用。
使用LunaSec的工具
由开源的数据安全平台开发的 LunaSec 工具,可以通过扫描目录,以及匹配文件散列的方式,来发现是否存在Log4j依赖项的相关漏洞。该工具适用于Windows、Linux 和macOS系统。您只需在相关传递目录,通过如下命令触发该工具的扫描进程即可:
纯文本
log4shell scan your-project-dir
如果目标是一个易受攻击的项目,那么你将会得到如下输出内容:
纯文本
10:04AM INF identified vulnerable path fileName=org/apache/logging/log4j/core/net/JndiManager$1.class path=test/struts-2.5.28-all/struts-2.5.28/apps/struts2-rest-showcase.war::WEB-INF/lib/log4j-core-2.12.1.jar versionInfo="log4j 2.8.2-2.12.0"
使用log4j-scan
此外, FullHunt 团队也提供了一个名为 log4j-scan 的开源工具。作为一个自动且全面的扫描器,它可以被用于查找易受攻击的Log4j主机。也就是说,它能够方便团队扫描自己的基础架构,并测试各种可能导致代码执行的WAF(Web应用防火墙)绕过 攻击 。该工具虽然能够提供多个选项,但是其最基本的服务是,用户可以将待扫描的URL传递给该工具,以便直接获得有关被检测到的漏洞报告。例如,您可以使用如下命令:
纯文本
python3 log4j-scan.py -u https://log4j.lab.secbot.local
其扫描结果的输出为:
使用Huntress Log4Shell漏洞测试器
作为一个在线式开源工具, Huntress Log4Shell漏洞测试器 可以协助您检查,某个应用程序是否使用着Log4j的易受攻击版本。您可以将该工具生成的字符串,作为待检查应用的输入。例如,您可以在某个页面的文本输入框中使用它。该字符串可以包括针对LDAP服务器的JNDI(Java Naming and Directory Interface,Java命名和目录接口)查询。服务器会记录来自应用程序的各个请求,并显示发出此类请求的IP地址。具体操作细节,请参见 演示视频 。
小结
目前,有更多针对Log4j的工具正在涌现。作为安全从业人员,我建议您通过链接--https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228,关注各类安全专家发布的相关内容。
正如我在上文中对 MariaDB的JDBC连接器 所进行的操作,我同样建议您将相关补丁,发送到任何正在使用Log4j的开源项目中,以及时发现并升级易受攻击的版本。
相关推荐
- Go语言泛型-泛型约束与实践(go1.7泛型)
-
来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...
- golang总结(golang实战教程)
-
基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...
- Go 官宣:新版 Protobuf API(go pro版本)
-
原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...
- Golang开发的一些注意事项(一)(golang入门项目)
-
1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...
- golang 托盘菜单应用及打开系统默认浏览器
-
之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...
- golang标准库每日一库之 io/ioutil
-
一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...
- 文件类型更改器——GoLang 中的 CLI 工具
-
我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...
- Go (Golang) 中的 Channels 简介(golang channel长度和容量)
-
这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...
- Golang引入泛型:Go将Interface「」替换为“Any”
-
现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...
- 一文带你看懂Golang最新特性(golang2.0特性)
-
作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...
- Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移
-
以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...
- Golang使用grpc详解(golang gcc)
-
gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...
- Etcd服务注册与发现封装实现--golang
-
服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...
- Golang:将日志以Json格式输出到Kafka
-
在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...
- 如何从 PHP 过渡到 Golang?(php转golang)
-
我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)