知名的开源项目Apache Log4j出事情了

2021年12月9日,该项目被暴露出严重的安全漏洞。攻击者只需将特殊代码传输到目标机器,即可触发漏洞,并自由执行任何远程代码来控制目标机器!

说实话,光听到这个消息我就觉得很可怕。因为Log4j作为Java著名的日志记录框架,不仅被等众多自主研发项目使用,还被Redis、Kafka、Elasticsearch、ApacheFlink、Apachedruid等众多明星项目作为基本框架使用。你可以想象这个漏洞的影响有多大,甚至被很多媒体称为核弹级漏洞!

漏洞曝光后,不是无辜的程序员第一次采取行动,而是一群坏男孩。据说,在漏洞公开的第一天,就发生了近1万次利用漏洞的攻击!

Log4j 被曝核弹级漏洞,开发者炸锅了_后端

漏洞细节

JNDI:Java 命名与目录接口,提供了用名称来访问资源的能力

LDAP:轻型目录访问协议,定义了如何访问目录服务中的内容

两者配合,可以完成对服务器目录的操作,比如增删改查

Log4j 被曝核弹级漏洞,开发者炸锅了_java_02

一些使用Minecraft Java版本开服伙伴被坑了,因为该项目使用log4j来记录用户聊天日志,所以玩家只需要在聊天窗口输入一些命令代码,并注入执行,以便轻松作弊。

解决方案

我整理了三种解决方案,可以根据实际情况选用。

针对具体情况,我整理以下了三种解决办法。

1. 升级版本

目前 Apache 官方已经针对该漏洞发布了补丁版本 2.15.0-rc2,默认禁用了 lookup 行为,在确保升级该版本不会对项目的其他依赖产生冲突的情况下,建议升级。

该方案虽然比较简单粗暴,但这个版本是否稳定?是否没有漏洞呢?这很难说。

2. 修改参数

如果你不想升级 log4j 的版本,担心会和项目其他依赖产生冲突的话,可以采用 Apache 官方推荐的临时解决方案 —— 修改参数。

如果你的 log4j 版本 >= 2.10,可以通过设置系统属性 log4j2.formatMsgNoLookups 或者环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS 为 true 来禁用 lookup 行为;如果版本在 2.0-beta9 到 2.10.0 之间, 可以直接移除从 classpath 中移除 JndiLookup 类,用以下命令即可:

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

这个方案相对不容易引发项目的冲突,如果项目很紧急且重要,先用它处理吧。

3. 换框架

最暴力、也是解决最彻底的方案就是干脆不用 log4j 了,用别的!

比如我自己很早之前就弃用 log4j,改用 logback 了,不说别的,logback 的测试更加充分,质量相对有保障一些。毕竟日志框架作为一个项目必备的核心依赖,稳定性是至关重要的。

当然,这种方式对项目的影响可能会很大,如果一定要整体替换框架,建议进行充分的测试(覆盖率越高越好),可不是改几行代码那么简单。

总结

这一事件证实了软件开发中的不信任原则,没有绝对可信、完全无问题的服务。因此,我们的开发人员需要做的是始终保持更多的关注,并尝试为一些服务的不稳定性设计一些保护或降级措施。例如,如果分布式缓存会挂断,则可以设计本地缓存,继续提供临时服务,以确保系统的可用性。