用于Minecraft的log4j2远程代码执行漏洞缓解措施
1. Minecraft 1.7.x ~ 1.16.5
注意:此版本范围的 Minecraft 使用的 log4j2 版本过低(2.8.1),不支持formatMsgNoLookups
开关。因此,添加JVM启动参数或者添加系统环境变量、使用最新的 Fabric Loader 的修补方法无效。请使用下文介绍的修补措施。
1.1 适用于 Minecraft 1.7.x ~ 1.16.5 客户端的修补措施
由于 Minecraft 启动器在启动 Minecraft 前会校验资源文件的完整性,因此不能使用 log4j-jndi-finder 直接对 log4j 的二进制文件进行修改。
- 可以使用 log4j-patch 对 Minecraft 客户端进行非侵入式修补。
该补丁作为 javaagent 随 Minecraft 加载,将旧版本的 log4j 中存在漏洞的
JndiLookup
替换为一个空实现。 由于 Minecraft 从不使用 JNDI 或 LDAP,这样做完全不会影响 Minecraft 的正常工作。 - 更新 log4j。官方启动器、HMCL、MultiMC、BakaXL、PCL2等启动器均已采取措施,但本文仅检查了 MultiMC,该启动器现在会在运行时将 log4j 版本更新至 2.15.0,这个版本是安全的。 如果您不确定,可以自行查看资源列表,以确定 log4j 版本,或者同时使用方法 1 进行非侵入式修补。
1.2 适用于 Minecraft 1.7.x ~ 1.16.5 服务端的修补措施
有两种修补策略可供选用:
- 使用
1.1
节介绍的 log4j-patch 进行修补。如果您确定没有第三方 MOD 内置了低版本的 log4j ,那么您可以使用此方法安全修补。(例如:没有任何 MOD 加载器的原版服务端) - 使用 log4j-jndi-finder 搜索并移除所有
JndiLookup
类。该脚本将遍历 Minecraft 服务端目录下的所有.jar
文件的内容,查找并移除JndiLookup.java
文件。由于 Minecraft 从不使用 JNDI 或 LDAP,这样做完全不会影响 Minecraft 的正常工作。
2. Minecraft 1.17.x 或更新的版本
此版本范围的 Minecraft 使用了较新的 log4j(2.14.1),因此可以通过设置formatMsgNoLookups
开关进行修补。
2.1 适用于 Minecraft 1.17.x 或更新的客户端的修补措施
- 添加JVM启动参数
-Dlog4j2.formatMsgNoLookups=true
。 - 将环境变量
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS
设置为true
。
2.2 适用于 Minecraft 1.17.x 或更新的服务端的修补措施
参考2.1
节介绍的措施进行修补。