zoukankan      html  css  js  c++  java
  • 引爆全球的 Log4j2 核弹级漏洞,JNDI 到底是个什么鬼?

    背景

    前段时间,Log4j2, Logback 日志框架频频爆雷:

    炸了!Log4j2 再爆漏洞,v2.17.1 横空出世。。。

    Logback 也爆雷了,惊爆了。。。

    究其原因,很大一部分就是因为 JNDI 这个玩意。。。

    JNDI

    JNDI:Java Naming and Directory Interface,即:Java 命名和目录接口,它专为 Java 应用程序提供命名和目录功能。

    JNDI 架构图:

    如图,JNDI 包含以下两部分:

    1)JNDI API:

    Java 应用程序即是通过 JNDI API 来访问各种命名和目录服务的。

    2)JNDI SPI(服务提供接口)

    Java 应用程序通过 JNDI SPI 插入各种命名和目录服务的,然后通过 JNDI API 进行访问。

    比如,没用 JNDI 之前,你可能要在 Java 代码中写死一些 JDBC 的数据库配置,有了 JNDI,就可以把数据源定义一种资源,然后通过名称进行查找,示例代码如下:

    Connection conn = null; 
    try { 
    	Context ctx = new InitialContext();
    	DataSource ds = (Datasource) ctx.lookup("java:MysqlDataSource");
    	conn = ds.getConnection();
    	...
    } catch(Exception e) {
    	...
    } finally {
    	...
    }
    

    当然,数据源及配置现在都是 Spring 进行管理了,这里只是介绍 JNDI 的一种用法。

    说白了,JNDI 就是 Java 的一套规范,相当于把某个资源进行注册,再根据资源名称来查找定位资源。


    要使用 JNDI,必须要有一个 JDNI 类,以及 1 个或者多个服务提供者(SPI),比如,在 JDK 中就包含以下几个服务提供者:

    • 轻量级目录访问协议 (LDAP)
    • 通用对象请求代理体系结构 (CORBA)
    • 通用对象服务命名服务 (COS)
    • Java 远程方法调用 (RMI)
    • 域名服务 (DNS)

    这里的 LDAP 协议正是频频爆漏洞的根源,攻击者屡试不爽。

    Log4j2 漏洞回顾

    网上很多复现的示例,为了不造成更大影响,这里就不实战演示了,示例代码如下:

    /**
     * 作者:栈长
     * 来源公众号:Java技术栈
     */
    public class Test {
    
        public static final Logger logger = LogManager.getLogger();
        
        public static void main(String[] args) {
            logger.info("${jndi:ldap://localhost:8080/dangerious}");
        }
        
    }
    

    这就是 Log4j2 核弹级漏洞的主因!

    LDAP 协议在上面有提到,它是一个开放的应用协议,也是 JDK JNDI 下面的一个服务提供者,用于提供目录信息访问控制。

    漏洞正是利用了 JDNI 中的 ldap 协议,以上代码中的 localhost 如果是攻击者的地址,就会造成远程代码执行漏洞,后果就不堪设想。。

    这是因为 Log4j2 有一个 Lookups 功能,它提供了一种向 Log4j 配置中添加值的方法,也就是通过一些方法、协议去读取特定环境中的信息,Jndi Lookup 就是其中一种:

    经过一系列的版本修复再调整,从 Log4j v2.17.0 开始,JNDI 操作需要通过以下参数主动开启:

    log4j2.enableJndiLookup=true

    现在这种 jndi:ldap 协议查找方式也被 Log4j2 Lookups 干掉了,仅支持 java 协议或者没有协议这种查找方式了。

    Log4j2 漏洞的后续进展,栈长也会持续跟进,关注公众号Java技术栈,公众号第一时间推送。

    结语

    Log4j2 Lookups 引发的漏洞真不少,这阵子一直在爆雷,这还真是个鸡肋功能,有几个人用到了?

    当然,这阵子的漏洞不全是因为 JNDI 造成的,JNDI 它只是提供了一套规范,用得不好总不能怪它吧?所以,我们也不能把责任全推到 JNDI 身上,Log4j2 Lookups 功能脱不了干系,既然提供了 Jndi Lookup 功能,但对其影响面考虑的太少了。。

    一个日志框架,最主要的目的是记录日志,虽然提供了许多其他丰富的功能,但如果没有考虑到位,反而会引发严重后果,毕竟安全第一,但也没办法,用开源就得接受开源的利弊。

    还有人说,自己开发,这可能是气话了。主流开源的有很多公司在用,爆漏洞还有大厂反馈,能第一时间感知,自己开发的,啥时候爆雷了,爆在哪了,怎么死的都不知道,能不能做好一款产品和持续维护还是另外一回事。

    参考文档:

    Log4j2 漏洞的后续进展,栈长也会持续跟进,关注公众号Java技术栈,公众号第一时间推送。

    版权声明!!!

    本文系公众号 "Java技术栈" 原创,转载、引用本文内容请注明出处,抄袭、洗稿一律投诉侵权,后果自负,并保留追究其法律责任的权利。

    近期热文推荐:

    1.1,000+ 道 Java面试题及答案整理(2022最新版)

    2.劲爆!Java 协程要来了。。。

    3.Spring Boot 2.x 教程,太全了!

    4.Spring Boot 2.6 正式发布,一大波新特性。。

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    012 数据类型基础
    013 数据类型:数字类型
    Codeforces 235C Cyclical Quest (后缀自动机)
    BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)
    BZOJ 4278 [ONTAK2015]Tasowanie (后缀数组)
    [加强版] Codeforces 835D Palindromic characteristics (回文自动机、DP)
    BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)
    BZOJ 2434 Luogu P2414 [NOI2011]阿狸的打字机 (AC自动机、树状数组)
    BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)
    BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
  • 原文地址:https://www.cnblogs.com/javastack/p/15783752.html
Copyright © 2011-2022 走看看