写点什么

再严重的 Log4j2 漏洞也伤害不了 Java  

  • 2021-12-14
  • 本文字数:3495 字

    阅读完需:约 11 分钟

再严重的Log4j2 漏洞也伤害不了Java   

12 月 10 日凌晨,Apache 开源项目 Log4j 的远程代码执行漏洞细节被公开,由于 Log4j 的广泛使用,该漏洞一旦被攻击者利用会造成严重危害。

 

Log4j 是一个被许多 Java 应用程序使用的库,它是迄今为止最普遍的 Java 库之一。Log4j 安全问题围绕 Log4j 库中的一个错误展开,该错误可能允许攻击者在使用 Log4j 写出日志消息的系统上执行任意代码。这个安全漏洞影响广泛,该漏洞一旦被攻击者利用会造成严重危害。

 

随着 Log4j 安全漏洞问题的持续发酵,一些天天唱衰 Java 的家伙,又开始借助这一漏洞问题将矛头指向 Java。他们总爱发文发帖、强调这种已经拥有 25 年历史的顶级编程语言就快不行了。不过每次 Java 都能挺过来,继续为全球无数开发者服务。这里我先要承认,不少安全厂商针对 log4j2 漏洞利用原理发布的文章确实意义重大。这个安全问题确实值得大家保持关注,也推荐各位尽快根据建议审查自己的 Java 项目是否存在隐患。

 

在本文中,我想着重聊聊 Java 生态系统,探讨日志记录框架是什么、为什么/该怎么使用这些框架,以及开发团队要如何观察并控制自己 JVM 的活动模式。

 

Java 开发者们的安全责任

 

Java 开发者们应该如何保证安全性?答案很简单——只要快速修复 JDK 和库,我们就能规避大多数潜在的普遍性违规问题。

 

修复库(必选)

一旦发现库内存在漏洞,最有效的方法当然是修复库以消除漏洞。若不及时修复,你的应用程序很可能被黑客入侵,攻击者将获得对目标系统及其数据的完全访问权限。

 

而无论面对什么状况,修复都是最有效的应对手段。

 

日志框架可以来自任何依赖项——既可以是传递依赖项(由其他库添加),也可以是直接依赖项(由你自己添加)。我们可以使用 Contrast Community Edition 等分析工具检查当前依赖项及其他自定义漏洞。

 

此外,Maven dependency tree (dependency:tree) 与 Gradle dependency tree也都是很好的开源依赖项分析工具。NetBeans 等 IDE 则提供依赖项关系图可视化工具。只要升级至 2.15.0 或更高版本,log4j2 漏洞就不会再骚扰各位。

 

按照 Java 安全基准(推荐、定期)修复 JRE

各个 Java 主版本都会维护一套持续性的安全基准。由于 JDK 每个季度都会通过新一轮安全改进实施修复,所以这套基准也在持续前进。换言之,任何低于当前安全基准的 Java 安装包都包含某些已知安全问题,应立即进行更新。

 

当然,这只是标准的安全最佳实践,与 log4j2 库漏洞没有直接关系、也解决不了这个漏洞。

 

但开发团队仍然应该使用 Foojay Disco API 自动监控安全基准并升级现有系统。开发人员可以将其与 GitHub 操作匹配起来,确保代码中的每个 build 都切实引入了最新安全更新。而一旦安全事件出现,升级 JRE 与代码的重构与重新部署也将同步进行。

 

Java 安全基准会在每年 1 月、4 月、7 月和 10 月最靠近 17 号的那个星期二迎来更新。详细信息请参考 Oracle 重要补丁更新计划,具体方式与 OpenJDK 漏洞组保持相同。当然,有时候即使没有大问题、官方也可能提供计划外的安全更新。Log4j2 并不属于此类。

 

下面我们以 Java 11 中的安全基准配置为例:

jobs:java11:runs-on: ${{ matrix.os }}strategy:matrix:os: [ubuntu-latest, macos-latest, windows-latest]update: [x]package: [jdk, jre]fail-fast: falsemax-parallel: 4name: ${{ matrix.package }} 11.0.${{ matrix.update }}, ${{ matrix.os }}steps:- uses: actions/checkout@v1- name: Set up JDK 11 Zuluuses: foojayio/setup-java@discowith:java-package: ${{ matrix.package }}java-version: 11.0.${{ matrix.update }}distro: zulu- name: java -versionrun: java -version
复制代码

定期检测自定义安全漏洞(测试中,推荐)

自动化安全工具能帮助我们在缺乏相关知识时仍准确捕捉到安全漏洞。通过将集成代理添加至 Java 应用程序当中,大家即可对应用程序中记录的安全信息进行被动检测。与前文提到的分析依赖项编号以确定是否存在漏洞的工具不同,这些自动化安全工具虽然也会跟踪同样的依赖项信息,但会通过集成分析器告知各现有库间的组合效果、特别是配合使用是否安全。

 

例如,集成分析器并不会简单查看是否存在 log4j2 漏洞及其版本,而是检测远程输入记录功能是否会被攻击者所控制。

 

此外,Contrast Community Edition 等免费分析工具也能捕捉 log4j2 零日漏洞及其他多种安全缺陷的行踪,例如:

 

  • 我的应用程序中是否包含 SQL 注入缺陷,例如在 Hibernate、JBDC 或者其他位置?

  • 远程攻击者能否控制发送至 Runtime.exec 的任何输入,进而导致命令注入漏洞?

  • 我的应用程序中使用到哪些加密算法,具体用在何处、是否符合适当的安全标准?

  • 我们是否正以某种非常规、有风险的方式组合不同库,例如 OGNL 输入解析?


使用 JDK Flight Recorder 监控安全事件

 

JDK Flight Recorder 是各类现代 OpenJDK 发行版中普遍提供的性能分析工具,能够以低资源成本提供安全信息。开发团队可以使用 JDK Flight Recorder 记录下诸多 IO 操作,例如 JRE 访问过哪些文件、或者哪些类与反序列化配对。

 

通过使用 JDK Flight Recorder 监控 Java 应用程序事件,并将事件流传输至安全信息与事件管理(SIEM)系统当中,Java 团队即可监控异常行为并/或是将已知安全类同 Java 反序列化过滤器相配对,因此防止漏洞利用行为。

哪些安全努力不值得尝试

 

以 log4j2 场景为例,Web 应用程序防火墙(WAF)等类似的网络防御方案虽然在短期内会有一定效果,但整体表现不佳而且工作量极为巨大。

 

  • 网络防御成效捉急。大家可能都听过网上流传的段子,有人用 Photoshop 精心设计出一张看似正常、似藏玄机的车牌,识别系统一扫就会遭遇注射攻击。这办法绝了,因为开发者知道车牌识别系统会尝试解析和记录一切通过计算机视觉捕捉到的内容,而且这部分注入数据压根不用经过网络层。同样的,大多数应用程序也会有针对性地使用部分数据、解码数据并记录下各类细节。很明显,任何网络工具都没办法覆盖到如此广泛的攻击面。

 

  • 监控并跟踪攻击者,第一时间屏蔽其 IP 同样效果不佳。虽然有些组织会坚持维护一套潜在攻击者清单,但 AWS IP 之所以被命名为 Elastic(弹性),正是因为它们会定期更改。即使拉黑一个,对方要么可以等自然解禁、要么就是换个 IP 继续攻击。

系统属性与动态补丁:效果尚可

 

我们可以使用几个系统属性与补丁控制住 log4j2 的肆意活动。如果暂时无法更新库或者依赖项,那这些就是最合理的过渡性安全问题。

 

两项 Java 系统属性:

 

  • Dcom.sun.jndi.rmiobject.trustURLCodebase=false

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

 

将它们设置为 false 即可阻止远程加载。

 

另有一个动态补丁能够接入当前运行的 JVM 并执行修复。它的问题是,我们每次启动 JVM 都需要再次运行此补丁。在一部分用例中这样就够了,只是肯定不如直接更新库来得方便。

 

Java 是如何处理日志记录的?

 

Java 开发者通常会从多种日志记录系统和外观中做出选择。随着社区的多年发展、合并和交融,各类日志记录框架往往已经能够彼此协同运作:

 

  • System Logger (2017 年,推荐)在 JDK 9 中被首次引入。它改进了 JDK Logger 的 API,并提供类似于 SLF4j 的外观,能够将 JDK 日志重新定向至应用程序团队指定的记录器处。

 

  • JDK Logger (2004 年)于 Java 1.4 版本中被引入。它特别常见,只是 API 显得有点陈旧了。虽然也能用,但不像其他日志记录框架那么灵便。

 

  • Log4j与Log4j2 属于社区开发的记录器。它们改进了 API,让团队能够轻松控制需要记录的内容、检索特定数据何时出现在哪些层级。

 

  • Logback 与 SLF4j 也是两款颇具人气的记录器。SLF4J 属于一套相对简单的日志记录外观,可帮助团队管理其他多种记录器——库维护人员将直接登录到 SLF4J,之后再由应用程序开发人员具体配置要使用哪些底层记录器提供统一的输出结果。除了高质量 AIP 之外,二者还最大限度减少了我们需要面对的依赖项。

 

  • JBoss Logger 是 JBoss 生态系统中的另一款流行记录器,运行状态稳定且速度很快。它现在已经能够支持 Quarkus 等多种其他日志记录框架。

 

  • Apache Commons-Logging(2002 年)的历史比 JDK Logger 更长,也启发了后来诸多 API。它的最后一个版本发布于 2014 年,之后随着从单一项目向跨项目 API 的用户趋势变化而没落。

 

2022 年最推荐的 Logger 方案

 

对于依赖项较少、发布时间不长的新兴项目,这里建议大家优先考虑 System Logger。对于包含大量依赖项的项目,我们则建议继续遵循大部分依赖项的对接的既有记录器、或者使用统一的日志记录外观(门面)。

 

如果你之前并没有使用任何记录器,则可以把 System Logger 当成是具有良好 API 的 JDK Logger 来使用。

 

参考链接:

 

https://www.infoworld.com/article/3644492/how-to-detect-the-log4j-vulnerability-in-your-applications.html

 

https://foojay.io/today/log4j-isnt-killing-java/

2021-12-14 13:485624
用户头像
李冬梅 加V:busulishang4668

发布了 946 篇内容, 共 540.8 次阅读, 收获喜欢 1111 次。

关注

评论

发布
暂无评论
发现更多内容

强化学习基础篇【1】:基础知识点、马尔科夫决策过程、蒙特卡洛策略梯度定理、REINFORCE 算法

汀丶人工智能

人工智能 深度学习 强化学习

单点登录的三种实现方式

Authing

SSO 单点登录

Amazon CodeWhisperer 初体验

Coder9527

玩转服务器之应用篇:从零开始构建小型高可用环境

京东科技开发者

高可用 云主机 云服务器 企业号 6 月 PK 榜

人工智能工程总体介绍

紫晖

人工智能 软件工程 数据开发

数据隐私为先:EMQX Cloud BYOC 架构解析

EMQ映云科技

物联网 云服务 mqtt

浅谈EOS区块链性能测试

BSN研习社

TiDB数据迁移实践DM工具

TiDB 社区干货传送门

迁移 实践案例

通过FP&A实践,释放企业深度价值

智达方通

全面预算管理 财务规划和分析 FP&A

让AI无处不在!Intel拿出全新VPU:超高能效碾压GPU

E科讯

我又和redis超时杠上了

蓝胖子的编程梦

redis 性能分析 云服务器 线上事故 接口超时

强化学习基础篇[2]:SARSA、Q-learning算法简介、应用举例、优缺点

汀丶人工智能

人工智能 深度学习 强化学习

圣邦股份:品类持续深挖,高端加速推进,模拟龙头稳健发展

华秋电子

这本数智平台白皮书讲透了大型企业数智化升级业务痛点

用友BIP

白皮书 数智底座 数智平台 平台白皮书 数智化转型白皮书

【5.26-6.02】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

rocketmq4 docker安装 阿里云linux2(centos7)

folo

Docker centos RocketMQ部署

TiDB集群数据库灾难恢复手册

TiDB 社区干货传送门

管理与运维 备份 & 恢复

TiDB 落地SAS机器实践

TiDB 社区干货传送门

实践案例 应用适配 HTAP 场景实践

分享几个索引创建的小 Tips

江南一点雨

MySQL

软件测试/测试开发丨Pytest测试框架学习笔记

测试人

程序员 软件测试 pytest

行云堡垒V7亮点有哪些?具体看这里!

行云管家

IT运维 行云堡垒

手把手实践丨基于STM32+华为云设计的智慧烟感系统

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 6 月 PK 榜

亿级大表毫秒关联,荔枝微课基于腾讯云数据仓库Doris的统一实时数仓建设实践

科技热闻

魔法门之英雄无敌3下载,死亡阴影 for Mac中文版

理理

mac游戏 英雄无敌3 英雄无敌3高清中文版 魔法门之英雄无敌3下载 死亡阴影中文版

简洁实用的文本编辑器:FSNotes中文版

真大的脸盆

Mac Mac 软件 文本编辑器 文本管理 文本处理工具

一文读懂责任分配矩阵,解决你80%的项目难题

敏捷开发

项目管理 Scrum 敏捷开发 责任分配矩阵 RACI矩阵

中移链资源管理介绍

BSN研习社

执行计划缓存,Prepared Statement性能跃升的秘密

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

堡垒机重要吗?为什么?求解!

行云管家

堡垒机 安全运维 录像审计

含有CPU芯片的PCB设计需要考虑的五个主要方面

华秋电子

2个场景实例讲解GaussDB(DWS)基表统计信息估算不准的处理方案

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

再严重的Log4j2 漏洞也伤害不了Java   _文化 & 方法_Erik Costlow_InfoQ精选文章