前言
就在昨天,运维转发一条关于Apache Log4j 远程代码执行漏洞的公告,抱着吃瓜的心态,模拟复现了一波。
漏洞分析
根据公告内容,此次针对的是Apache Log4j 2.x < 2.15.0-rc2
版本。公告指出,当我们以这种格式进行日志输出的时候,存在着被黑客攻击的风险。
如,当传入的name参数形如以下格式的时, Log4j 可以去执行这个地址对应的服务。
${jndi:rmi://127.0.0.1:7777/HelloService1}
利用这个漏洞,黑客可以在被攻击者的服务器上执行黑客自己的服务,从而达到攻击的目的。
原理
能实现如上的操作,首先得感谢log4j提供的 lookups功能。它允许通过 JNDI 的方式去检索变量,而 JNDI 又可以支持远程服务调用,间接造成了该漏洞。
关于JNDI,可以看看早些年写的一篇文章:JNDI
解决方式
- 升级版本至 2.15.0-rc2
- 修改jvm参数 -Dlog4j2.formatMsgNoLookups=true
- 修改配置log4j2.formatMsgNoLookups=True
- 将系统环境变量
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS
设置为 true
关于升级版本,有时可能一时半会不好下手,特别时那种间接依赖 Log4j的情况,譬如依赖某个服务Jar包,该服务包再去依赖 Log4j。可以通过修改参数缓解。
另外,笔者在测试的时候,高版本的JDK似乎也能防止这种情况出现,譬如JDK 8u271版本,在复现时,则是安全的。