当前位置: 首页 > 后端技术 > Java

Log4j2无法杀死Java!

时间:2023-04-01 13:57:51 Java

作者:ErikCostlow\译者:Crescent\原文:https://foojay.io/today/log4j...\译:https://blog.csdn.net/csdnnew...JavaastoplevelOne25年来一直活跃在企业软件开发领域的编程语言。有些人一直宣称Java已死,而另一些人则坚持认为Java还活着并且很好。近日,有消息称log4j2漏洞将再次“杀死”Java。我们曾经开玩笑说,爪哇博物馆就像一座墓地,记录着每一次“死亡”。上周,技术圈受到log4j2漏洞的冲击,各大安全公司纷纷发文介绍该漏洞的危害并给出各种临时解决方案。也有博主发文教我们如何找到漏洞所在,采取相应的防御措施。还有很多帖子起哄,讨论如何采取一些不必要的防御技巧。目前,log4j2官方团队发布了2.16.0新版本,加强了漏洞防御机制。log4j2是一个基于Java开发的开源日志系统。因此,当epic漏洞被曝光后,有人声称log4j2漏洞将再次“杀死”Java。已经“死”过无数次的Java,就像是开辟了一座墓地,记录着每一次路过的“死亡”。本文简要介绍了Java生态系统,解释了什么是日志记录框架、使用它们的位置和原因,以及团队如何观察和控制JVM的行为。一、Java开发者应该做哪些安全工作快速给JDK和库打补丁是目前避免大多数大规模黑客攻击的最有效技术。修补库文件(必需)当代码库中存在漏洞时,最有效的技术是修补以消除漏洞。如果库文件没有打补丁,应用程序很可能会被黑客攻击,攻击者将获得对系统及其数据的完全访问权限。在任何一种情况下,修补通常都能很好地工作。日志记录框架可能来自任何依赖项,可能由另一个库引入(即传递依赖项)而不是由开发人员添加(即直接依赖项)。我们可以使用依赖分析工具,例如ContrastCommunityEdition,来检测依赖和其他自定义漏洞。此外,还有一些开源的依赖分析工具,如Maven依赖树(dependency:tree)、Gradle依赖树等。NetBeans等IDE还提供依赖关系图可视化工具。对于log4j2漏洞利用,您必须升级到版本2.15.0或更高版本。给JRE打补丁并升级到Java的安全基线(推荐,定期完成)为每个主要的Java版本维护一个安全基线。随着JDK每个季度都提供具有新安全改进的补丁,此安全基线不断向前发展。低于安全基线的Java包含已知的安全问题,应该升级。这是标准的安全最佳实践,与log4j2漏洞没有直接关系,也不会修复。团队可以使用FoojayDiscoAPI自动监控安全基线并及时升级系统。开发人员可以将此更新与GitHubActions结合使用,以确保他们每次构建代码时都使用最新的安全更新。如果发生安全事件,JRE会立即升级,同时重新构建和重新部署代码。这种类型的GitHub操作包含在下面的测试矩阵中(https://github.com/foojayio/d…)。Java安全基线更新时间为:每年一月、四月、七月、十月,每周二17号左右。详细信息包含在Oracle重要补丁更新程序(https://www.oracle.com/securi...)中,OpenJDK漏洞组(https://foojay.io/pedia/secur...)也是如此计划。此外,Oracle会在出现严重问题时提供计划外的安全更新。但是log4j2的漏洞就不是这样了。以下配置演示了如何使用Java11的安全基线:jobs:java11:runs-on:${{matrix.os}}strategy:matrix:os:[ubuntu-latest,macos-latest,windows-latest]update:[x]包:[jdk,jre]fail-fast:falsemax-parallel:4name:${{matrix.package}}11.0.${{matrix.update}},${{matrix.os}}步骤:-使用:actions/checkout@v1-名称:设置JDK11Zulu使用:foojayio/setup-java@discowith:java-package:${{matrix.package}}java-version:11.0.${{矩阵。update}}distro:zulu-name:java-versionrun:java-version定期检测自定义安全漏洞(推荐用于测试)自动化安全工具可以捕获安全漏洞,不需要安全专业知识。通过将此类安全工具集成到Java应用程序中,可以实现安全监控,记录安全信息。有些工具会根据依赖的数量来判断是否存在漏洞,但是在这种方法中,集成分析器会根据依赖信息,报告这些依赖库的组合,判断组合是否安全。例如,集成分析器不仅仅检查log4j2的存在和版本,还可以确定攻击者是否控制了远程日志输入。此外,ContrastCommunityEdition等免费分析器可以即时捕获log4j2并捕获许多其他安全漏洞,例如:应用程序是否包含Hibernate、JBDC或其他任何地方的SQL注入问题?远程用户能否控制发送到Runtime.exec的任何输入,即是否存在命令注入漏洞?应用程序使用什么加密算法,在哪里使用它们,它们是否符合适当的标准?开发者是否在组合多个库时不小心引入了安全漏洞,例如OGNL输入解析?和其他特定于应用程序的安全漏洞。使用JDKFlightRecorder监控安全事件JDKFlightRecorder是现代OpenJDK发行版中包含的一种性能分析工具,可以以非常低的开销生成一些安全信息。团队可以使用JDKFlightRecorder来记录许多IO操作,例如JRE访问了哪些文件,或者反序列化了哪些类。通过使用JDKFlightRecorder监控Java应用程序事件并将事件流式传输到安全信息和事件管理(SIEM)系统中,Java团队可以监控异常行为并通过Java反序列化过滤器检查每个类是否安全来防止漏洞。2.哪些安全措施没有太大作用?关于log4j2漏洞的问题,基于网络的防御和Web应用防火墙(WAF)等工具在短期内可能会有一定的效果,但通常效果不是很好,而且工作量非常大。网络防御不太有效。网上流传的一个模因是一张经过Photoshop处理的汽车照片,其车牌上装有注射工具。这个梗的要点是,开发者都知道,车牌号经过计算机视觉分析后,会记录在日志中。构成注入的数据不会出现在网络层。同样,大多数应用程序使用数据的不同部分,对数据进行解码并记录各种信息。没有网络工具可以匹配足够多的模式来检测安全问题。通过观察和跟踪来阻止攻击者IP并不是特别有效。虽然有些团队可能会维护一个攻击者列表,但AWSIP被称为弹性IP,因为这些IP会定期更改,因此即使您阻止了一个IP,它也可能会在一段时间后再次解锁,或者很快就会被其他IP攻击。图:该图演示了网络层不可检测漏洞的影响系统属性和动态补丁通常有几个补丁和系统属性可以控制log4j2的行为并阻止攻击。有时候,有些库没有及时更新,或者团队正在努力更新依赖,但是会需要一定的时间,这两种情况都可以考虑这几个补丁和系统属性。有两个相关的Java系统属性:-Dcom.sun.jndi.rmiobject.trustURLCodebase=false-Dcom.sun.jndi.cosnaming.object.trustURLCodebase=false将这两个属性设置为false可以防止远程攻击。还有一个动态修补程序可以连接到正在运行的JVM并对其进行修补。每次JVM启动时都必须应用此补丁。这两种方法虽然有一定的效果,但是更新库还是比较简单的。3.Java如何处理日志记录Java开发人员通常可以从多种日志记录系统和记录方法中进行选择。多年来,随着社区的壮大,许多日志框架也协同工作:SystemLogger(2017,推荐)是JDK9中引入的日志系统,它改进了JDKLogger的API,提供了类似于SLF4j的日志记录方式,它可以将JDK的日志重定向到应用程序团队选择的日志系统。JDKLogger(2004年推出)是Java1.4引入的日志系统。日志系统由于在JDK中大量使用而变得流行,但API有点糟糕。这个日志系统虽然也不错,但是比不上其他框架。Log4j和Log4j2是社区推荐的日志系统,具有改进的API,因此开发团队可以更轻松地控制记录的内容以及在每个级别记录数据的方式。Logback和SLF4j也是流行的日志记录系统。SLF4J是一种简单的日志记录方式,可以帮助团队处理许多日志记录,库维护人员可以将日志输出到SLF4J,然后由应用程序开发人员配置他们将使用哪些底层日志记录系统来统一输出。此外,SLF4J有一个完善的API,可以最大限度地减少依赖性。JBossLogger是JBoss生态系统中另一个流行的日志系统。该系统运行良好且速度很快。如今,它还支持其他流行的框架,例如Quarkus。ApacheCommons-Logging(于2002年推出)早于JDK日志系统并启发了许多API。它的最后一个版本于2014年发布,从那时起人们开始采用旨在支持良好日志记录的其他API。2022年日志系统推荐的依赖越少越好,项目越新越好,可以考虑SystemLogger。一些项目有大量的依赖,但优点是它们使用与大多数依赖相同的日志记录工具,但选择不同的日志记录方法。如果你没有任何日志系统,可以考虑SystemLogger,它是一个JDK的日志工具,有很好的API。日志系统到底做了什么?日志框架使应用程序主机能够以通用格式查看日志消息、时间戳、线程名称和其他数据。此外,Teams可以将不同的输出重定向到不同的位置,甚至不显示它,例如,您可以将访问日志发送到文件,系统报告到别处,并选择显示所有级别的日志信息,或者动态查看库的调试信息.近期热点文章推荐:1.1000+Java面试题及答案(2021最新版)2.厉害了!Java协程来了。..3.玩大!Log4j2.x再次爆发。..4、SpringBoot2.6正式发布,一大波新特性。.5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!