Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识

系列文章

2.15.0之前版漏洞相关文章

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法)

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理

2.15.0版漏洞相关文章

Log4j2中2.15.0版存在的漏洞(CVE-2021-45046)的注入原理、复现步骤和如何修复(2.16.0修复原理)

2.16.0版漏洞相关文章

Log4j2中2.16.0版中DOS攻击(CVE-2021-45105)的漏洞原理、复现步骤和修复方法(2.17.0修复原理)

一、前言

上周五(12月10日)应该是全世界程序员都不得安宁的一天。楼主早上一到公司就收到安全部分通知Log4j2出现严重安全漏洞,攻击者可以利用该漏洞在服务器上执行任意指令,从而操控服务器。于是一整天我们整个团队都在忙于修复Log4j2漏洞。从最开始修改JVM参数,到后来的2.15.0-RC1版本,再到最后的2.15.0发布版,简直是一波三折啊。当时我们还在和同事开玩笑,“今天全世界程序员都要加班了”。

漏洞修复完成后,作为一个程序对代码起码的尊重,楼主便开始通过各种途径查找本次漏洞相关各类资料,打算对漏洞做一个全面分析了解。抱着”知其然,且知其所以然“精神。于是楼主带着如下问题,开始了查找之旅。

1、Log4j2漏洞复现步骤(攻击步骤)

2、Log4j2漏洞的原理(为什么存在)

3、Log4j2漏洞中2.15.0-RC1版本为什么会被绕过

4、Log4j2最终修复方案(2.15.0)的原理是什么

通过大量的网络查找,楼主才终于弄清楚了上面的所有问题,同时也对本次漏洞有了深入的分析和理解。在这个过程中楼主发现一个问题,网上基本没有一篇文章能够把本次漏洞讲得清楚彻底。甚至网上通用的的复现步骤,在现在的Java主流版本中,根本就无法复现。因为该漏洞在java高版本和低版本下需要不同的攻击方式,才能达到攻击的目的。

于是楼主决定编写本文来和大家一起对该漏洞进行全面深入的剖析。本文将从如下基本方面进行讲解。

1、Log4j2漏洞的基本原理

2、Log4j2漏洞在Java高低版本中的攻击原理

3、Log4j2漏洞在Java高低版本中的攻击步骤

4、Log4j2漏洞在2.15.0-RC1中被绕过的原因

5、Log4j2最终修复方案(2.15.0)的原理

其实这个漏洞在11月底就被发现了,且Log4j2官方在12月5号就已经在开始修复该漏洞。

二、基础知识

1、什么是JNDI

JNDI全称 Java Naming and Directory Interface。JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中,文件名被绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。
JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如,每个上下文提供了一个查找操作,返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。

 参考:JNDI是什么_百度知道

简单来说:通过JNDI提供了"通过名称找到对应的对象"的规范定义,即SPI功能,实现则由具体的技术支持,如:LDAP,RMI,DNS,Database。比如在JNDI支持的数据源中,如下图(具体请参考:JNDI学习总结(一)——JNDI数据源的配置 - 孤傲苍狼 - 博客园),我们可以通过”jdbc/oracle“获取到Oracle对应的数据库连接池对象,并直接用于操作数据库即可。

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识_第1张图片

2、什么是LDAP

目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。

LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。

目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。

目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。

LDAP目录服务是由目录数据库和一套访问协议组成的系统。

参考:LDAP概念和原理介绍 - WilburXu - 博客园

简单来说:LDAP是一个目录服务,可以通过目录路径查询到对应目录下的对象(文件)等。即其也是JNDI的实现,通过名称(目录路径)查询到对象(目录下的文件)。

3、什么是Codebase

Codebase就是存储代码或者编译文件的服务。其可以根据名称返回对应的代码或者编译文件,如果根据类名,提供类对应的Class文件。

参考:PSA: Log4Shell and the current state of JNDI injection – – Random ramblings, exploits and projects.

三、惯例

如果你喜欢本文或觉得本文对你有所帮助,欢迎一键三连支持,非常感谢。

如果你对本文有任何疑问或者高见,欢迎添加公众号lifeofcoder共同交流探讨(添加公众号可以获得楼主最新博文推送以及”Java高级架构“上10G视频和图文资料哦)。

系列文章

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法)

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理

你可能感兴趣的:(源码分析,技术分享,安全漏洞,Log4j2,Ldap,Codebase)