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

Java技术栈

共 2619字,需浏览 6分钟

 · 2022-01-14

点击关注公众号,Java干货及时送达

背景

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

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

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

参考文档:

  • https://docs.oracle.com/javase/jndi/tutorial/getStarted/overview/index.html
  • https://logging.apache.org/log4j/2.x/manual/lookups.html

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

版权声明!!!

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


微信官宣:一大波新年红包封面来了!
2021 年发生的 10 件技术大事!!
23 种设计模式实战(很全)
Logback 也爆雷了,惊爆了
炸了!Log4j2 再爆漏洞。。
劲爆!Java 协程要来了
重磅官宣:Redis 对象映射框架来了!!
推荐一款代码神器,代码量至少省一半!
程序员精通各种技术体系,45岁求职难!
重磅!Spring Boot 2.6 正式发布
Spring Boot 学习笔记,这个太全了!



关注Java技术栈看更多干货



获取 Spring Boot 实战笔记!
浏览 18
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报