关于java:Log4j-2-杀不死-Java

45次阅读

共计 4432 个字符,预计需要花费 12 分钟才能阅读完成。

作者:Erik Costlow\
译者:弯月 \
原文:https://foojay.io/today/log4j…\
译文:https://blog.csdn.net/csdnnew…

Java 作为顶级编程语言之一,曾经在企业级软件开发畛域沉闷 25 年了。有人一直宣传 Java 已死,同时也有人坚称 Java 活得好好的。最近,又有报道称 log4j 2 破绽将再次“杀死”Java。咱们曾开玩笑说,Java 博物馆就如同是一个墓园,记录了每一次“死亡”的通过。

上周,技术圈被 log4j 2 破绽掀起巨浪,各大平安公司纷纷发文介绍该破绽的危害,并给出了各种长期解决方案。还有一些博主也发表文章教咱们如何找到易受攻击的中央,并采取相应的进攻措施。还有大量帖子跟着起哄,探讨如何采纳一些不必要的进攻技术。

目前,log4j 2 官网团队已公布 2.16.0 新版本,加固破绽防御机制。log4j 2 是一款基于 Java 研发的开源日志零碎,因而,当史诗级破绽被爆出后,便有人声称 log4j 2 破绽将再次“杀死”Java,曾经被“死亡”过无数次的 Java,就像是开了一个墓园,记录每次“死亡”通过。

本文将简略介绍一下 Java 生态系统,阐明什么是日志记录框架、在何处应用以及应用的起因,此外,还将介绍各个团队该当如何察看和管制 JVM 的行为。

1、Java 开发人员应该做哪些平安工作

疾速给 JDK 和库打补丁是以后最无效的技术,可防止绝大多数大规模的黑客攻击。

给库文件打补丁(必须)

当代码库中存在破绽时,最无效的技术就是打补丁以去除破绽。如果不给库文件打补丁,那么应用程序很有可能被黑客入侵,攻击者将取得零碎及其数据的残缺拜访权限。

无论在何种状况下,通常打补丁都很无效。

日志框架可能来自任何依赖项,可能由另一个库引入(即传递依赖项),而非由开发人员增加(即间接依赖项)。咱们能够应用依赖项剖析工具,例如 Contrast Community Edition,来检测依赖项和其余自定义的破绽。

此外,还有一些剖析依赖关系的开源工具,比方 Maven 依赖树(dependency:tree)和 Gradle 依赖树。NetBeans 等 IDE 也提供了依赖关系图可视化工具。

对于 log4j2 破绽,你必须降级到 2.15.0 或更高版本。

给 JRE 打补丁,降级到 Java 的平安基线(举荐,定期执行)

每个 Java 次要版本都会保护一个平安基线。因为每个季度 JDK 都会提供带有新平安改良的补丁,因而这个平安基线也会一直向前挪动。低于平安基线的 Java 蕴含已知的平安问题,应该降级。

这是规范的平安最佳实际,与 log4j 2 破绽没有间接关系,也不会修复该破绽。

各个团队能够应用 Foojay Disco API 主动监控平安基线,并及时地降级零碎。开发人员能够将这个更新与 GitHub 操作相结合,确保在每次构建代码时,都应用最新的安全更新。如果产生安全事件,则立刻降级 JRE,同时从新构建并重新部署代码。上面这个测试矩阵中就蕴含了这类的 GitHub 操作(https://github.com/foojayio/d…)。

Java 平安基线的降级工夫为:每年 1 月、4 月、7 月和 10 月,17 日前后的周二。详细信息蕴含在 Oracle 重要补丁更新打算(https://www.oracle.com/securi…)中,OpenJDK 破绽组(https://foojay.io/pedia/secur…)也采纳了同一个打算。此外,如果呈现重大问题,Oracle 还会提供计划外的安全更新。但 log4j 2 破绽不属于这种状况。

以下配置演示了如何应用 Java 11 的平安基线:

jobs:
  java11:
    runs-on: ${{matrix.os}}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        update: [x]
        package: [jdk, jre]
      fail-fast: false
      max-parallel: 4
    name: ${{matrix.package}} 11.0.${{matrix.update}}, ${{matrix.os}}
    steps:
    - uses: actions/checkout@v1
    - name: Set up JDK 11 Zulu
      uses: foojayio/setup-java@disco
      with:
        java-package: ${{matrix.package}}
        java-version: 11.0.${{matrix.update}}
        distro: zulu
    - name: java -version
      run: java -version

定期检测自定义安全漏洞(举荐测试采纳)

自动化平安工具能够捕捉安全漏洞,不须要平安专业知识。将这类平安工具集成到 Java 应用程序,就能够实现平安监测,并记录平安信息。有些工具会依据依赖项的数量来决定是否存在破绽, 而这种办法则会依据依赖信息,由集成的分析器来报告这些依赖库的组合状况,并判断组合后是否平安。

例如,集成分析器不只是简略地查看 log4j2 存在与否及其版本,而且还能够确定攻击者是否能够管制近程日志输出。

此外,Contrast Community Edition 之类的收费分析器还可能即时捕捉 log4j 2,并捕捉许多其余的安全漏洞,例如:

  • 应用程序的 Hibernate、JBDC 或任何其余中央是否蕴含 SQL 注入问题?
  • 近程用户是否管制发送到 Runtime.exec 的任何输出,即是否存在命令注入破绽?
  • 应用程序应用了哪些加密算法,在何处应用,是否合乎适当的规范?
  • 开发人员在联合应用多个库时,是否意外引入了某个安全漏洞,例如 OGNL 输出解析?
  • 以及其余应用程序特有的安全漏洞。

应用 JDK Flight Recorder 监控安全事件

JDK Flight Recorder 是古代 OpenJDK 发行版中蕴含的性能剖析工具,它不仅能够生成一些平安信息,而且开销非常低。各个团队能够应用 JDK Flight Recorder 来记录许多 IO 操作,例如 JRE 拜访了哪些文件,或者哪些类会被反序列化。

通过应用 JDK Flight Recorder 监督 Java 应用程序事件,并通过数据流将事件传输到平安信息和事件治理(Security Information and Event Management,即 SIEM)零碎中,Java 团队就能够监督异样行为,并通过可避免破绽的 Java 反序列化过滤器来查看各个类是否平安。

2、哪些安全措施没有太大作用

对于 log4j 2 破绽的问题,Web Application Firewall(WAF)之类基于网络的进攻和工具可能在短期内有肯定的成果,但通常都没有太大作用,而且工作量十分大。

  • 网络进攻的成果不大。网上流传着一个梗,一张通过 PS 的汽车照片,其车牌号上蕴含了一条注入工具。这个梗的点就在于,开发人员都晓得,车牌号会通过计算机视觉剖析后记录到日志中。形成注入的数据并没有呈现在网络层。同样,大多数应用程序应用数据的不同局部,解码数据并记录各种信息。任何网络工具都无奈匹配足够多的模式来检测平安问题。
  • 通过观察和追踪来阻止攻击者 IP 的办法并不是特地无效。尽管有些团队可能会保护一张攻击者的列表,但 AWS IP 之所以被称为弹性 IP,是因为这些 IP 会定期变动,因而,即使你阻止了某个 IP,过一段时间可能就又解锁了,或者很快就会受到不同 IP 的攻打。

图:该图演示了网络层无奈检测到的破绽

零碎属性和动静补丁的成果个别

有几个补丁和零碎属性能够管制 log4j 2 的行为并阻止攻打。有时候,有些库无奈及时更新,或者团队在致力更新依赖项,但须要肯定的工夫,在这两种状况下,就能够思考这几个补丁和零碎属性。

相干的 Java 零碎属性有两个:

  • -Dcom.sun.jndi.rmiobject.trustURLCodebase=false
  • -Dcom.sun.jndi.cosnaming.object.trustURLCodebase=false

将这两个属性设置为 false 能够阻止近程攻打。

还有一个动静的补丁,它能够连贯到正在运行的 JVM 并给其打补丁。这个补丁必须在 JVM 每次启动时利用。尽管这两种办法有肯定的作用,但相较而言,更新库更简略。

3、Java 如何解决日志

Java 开发人员个别能够从多个日志零碎和记录形式中进行抉择。多年来,随着社区的倒退,许多日志框架也能够协同工作了:

  • System Logger(2017 年推出,举荐)是 JDK 9 中引入的日志零碎。它改良了 JDK Logger 的 API,并提供了相似于 SLF4j 的记录形式,能够将 JDK 的日志重定向到应用程序团队抉择的日志零碎。
  • JDK Logger(2004 年推出)是 Java 1.4 中引入的日志零碎。因为 JDK 中大量应用了该日志零碎,因而变得很风行,然而 API 有点糟糕。尽管这个日志零碎也不错,但不如其余框架。
  • Log4j 和 Log4j2 是社区举荐的日志零碎,二者改良了 API,因而开发团队能够更轻松地管制记录的内容以及各个级别的日志记录数据的形式。
  • Logback 和 SLF4j 也是风行的日志零碎。SLF4J 是一个简略的日志记录形式,可帮忙团队解决许多日志记录,库的保护人员能够将日志输入到 SLF4J,而后由应用程序开发人员配置他们将应用哪些底层的日志零碎来对立输入。此外 SLF4J 还建设了良好的 API,最大限度地缩小了依赖关系。
  • JBoss Logger 是 JBoss 生态系统中的另一个风行的日志零碎。该零碎性能良好,而且运行速度很快。现在它还反对其余风行框架,如 Quarkus。
  • Apache Commons-Logging(2002 年推出)诞生于 JDK 日志零碎之前,并启发了许多 API。它的最初一个版本是于 2014 年推出的,之后人们陆续开始采纳其余以反对良好的日志记录为指标的 API。

2022 年举荐的日志零碎

依赖项越少越好,我的项目越新越好,因而咱们能够思考 System Logger。

有些我的项目领有大量依赖项,但劣势在于它们应用的日志记录工具与大多数的依赖项雷同,只不过选用了其余日志记录形式。

如果你没有任何日志零碎,则能够思考 System Logger,它是一款领有良好 API 的 JDK 日志记录工具。

日志零碎到底是做什么的?

日志框架可能让应用程序的客人看到通用格局的日志音讯、工夫戳、线程名称以及其余数据。

此外,团队能够将不同的输入重定向到不同的地位,甚至无需显示进去,例如,你能够将拜访日志发送到一个文件,将零碎报告发送到其余中央,而后抉择显示所有级别的日志信息,或者动静查看某个库的调试信息。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 劲爆!Java 协程要来了。。。

3. 玩大了!Log4j 2.x 再爆雷。。。

4.Spring Boot 2.6 正式公布,一大波新个性。。

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0