Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求
漏洞只针对的是2.15以下版本的
现在我们来重现一下log4j的漏洞
public class Log4jTest {
private static final Logger log = LogManager.getLogger();
public static void main(String[] args) {
String str = "${java:os}";
log.info("hello {} !", str);
}
}
${}是log4j的占位符,我们可以通过占位符的方式方便我们打印日志,这段代码输出是:hello Windows 10 10.0, architecture: amd64-64 !
输出了我们当前电脑的消息,当然这样看起来没问题,但却给了别有用心之人有机可趁
下面我们来重现一下漏洞,这是一个jndi的服务类
下面这个类是我们可以通过此类进行一些操作
再写一个测试类
先启动RmiServer类,在启动测试类
运行结果:
大家可以看到他是在测试类里打印的EvilObj,而不是在RmiServer里打印的,这就非常恐怖,代表着我可以在你服务器执行我想执行的代码,所以这个漏洞是非常严重的,如果说破坏者通过前端输入然后你后台打印了用户的输入,就可以在你的服务器执行他的程序,这是一个低级且严重的问题,大家升级到2.15以上版本就行了
解决方案
a、修改jvm参数 -Dlog4j2.formatMsgNoLookups=true
b、修改配置:log4j2.formatMsgNoLookups=True
c、系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true
如果springBoot里面有引用的话,在pom文件加上以下代码,这也是spring官网给出的方案
<properties>
<log4j2.version>2.16.0</log4j2.version>
</properties>