引爆全球的 Log4j2 核弹级漏洞,Jndi 到底是个什么

家电修理 2023-07-16 19:17www.caominkang.com电器维修



背景

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

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



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



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

JNDI

JNDIJava 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 = ne 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 漏洞回顾

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

     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 功能,但对其影响面考虑的太少了。。

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

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

    参考文档

    https://docs.oracle./javase/jndi/tutorial/getStarted/overvie/index.html

    https://logging.apache./log4j/2.x/manual/lookups.html

    本文转载自微信公众号「Java技术栈」,可以通过以下二维码关注。转载本文请联系Java技术栈公众号。



     

    Copyright © 2016-2025 www.caominkang.com 曹敏电脑维修网 版权所有 Power by