0x00 前言
整理一下笔记,查漏补缺,方便之后看以及重新复现
0x01 知识点汇总
1.原理
Log4j 漏洞实际上原理是很简单的,就是Log4j会对格式如${jndi:ldap:}进行解析,调用对应的lookup,从而导致的这个漏洞。
主要位置在
如何发现
都说是codeql发现了,最近可能要对这个规则分析一下看看原因。
0x0 文章导航
Java代码审计——apache log4j 远程命令执行(JNDI)
Java代码审计——apache log4j CVE-2021-45105
补充知识
补充知识
codeql
CodeQL是一种基于数据流分析的语言和工具集,用于静态代码分析和漏洞发现。它可以帮助开发者和安全研究人员识别软件系统中的安全漏洞,并提供流程化的修复建议。CodeQL的核心思想是利用数据流分析来检测程序中的漏洞,通过建模程序的行为并研究它在不同输入下的行为来识别漏洞。CodeQL支持各种编程语言,包括Java、C++、JavaScript、Python等。除了漏洞检测,CodeQL还可以用于优化代码、重构代码和改进代码规范等方面的工作。
codeql优势
CodeQL是一种静态分析工具,它提供了许多优势,如下:
-
高度可定制化:CodeQL可让用户针对自己的代码库进行自定义查询,从而帮助用户轻松发现潜在的漏洞或问题。
-
支持多种编程语言:CodeQL支持多种编程语言,包括Java、C++、C#、Python等,使其成为一种通用性的静态分析工具。
-
高效性:CodeQL能够处理大型复杂的代码库,并在短时间内提供准确的结果。
-
安全性:CodeQL不会修改代码或执行任何操作,因此可以在不影响代码或应用程序性能的情况下分析代码,同时保护源代码的安全性。
-
社区支持:CodeQL由GitHub维护,因此用户可以获得来自全球社区的支持和贡献,不断提高CodeQL的功能和性能。
log4j
log4j是一种基于Java语言的日志框架,有以下几个优势:
-
灵活性:log4j允许开发人员对日志输出进行细粒度的控制,可以设置日志的格式、级别、输出目的地等。
-
高性能:log4j采用异步日志输出机制,使用多线程来处理日志输出,保证了系统在生产环境中的高性能。
-
可扩展性:log4j提供了插件机制,用户可以按照自己的需求扩展log4j的功能。
-
配置简单:使用log4j只需在配置文件中定义一些简单的参数,就可以快速的实现日志记录。
-
可靠性:log4j在设计时考虑了系统异常、性能、可维护性等因素,保证了log4j的可靠性。
-
社区支持:由于log4j是一个开源的框架,有庞大的用户和开发者社区支持,可以快速获得问题的解答和技术支持。
log4j的优势
-
灵活性:Log4j具有高度的灵活性,可以适应多种不同的日志输出方式,包括控制台输出、文件输出、数据库输出等。
-
多级别日志:Log4j支持多个日志级别,包括DEBUG、INFO、WARN、ERROR以及FATAL,开发人员可以根据需要选择不同的日志级别,方便地进行调试和排错。
-
易于配置:Log4j可以通过简单的配置文件进行配置,配置文件可以动态加载,方便开发人员进行调整和修改。
-
性能:Log4j通过使用缓存来提高日志输出的性能,同时也支持异步日志输出。
-
扩展性:Log4j支持插件式的输出,可以方便地扩展和添加自定义的输出方式。
-
开源:Log4j是一个完全开源的项目,可以免费使用和修改。它具有完善的文档和社区支持,方便开发人员进行使用和学习。
log4j的替代品
在Java中,Log4j的替代品有:
-
Logback:是由Log4j的创始人开发的下一代日志框架。它比Log4j具有更好的性能、更丰富的功能和更灵活的配置选项。Logback具有以编程方式使用的API和XML配置文件,而且可以使用不同的Appender来将日志记录到不同的位置。
-
java.util.logging:是Java的标准日志框架,也是JDK自带的。虽然它比Log4j和Logback功能稍微逊色一些,但它仍然足以满足大多数日志需求。java.util.logging还具有可扩展性和灵活性,可以配置过滤器、格式化器和处理程序。
-
Apache Commons Logging:是一个独立的日志框架,可以与多种日志实现(如Log4j、Logback和java.util.logging)结合使用。它提供了一个简单的API来记录日志,并且可以在运行时决定使用哪个日志实现。
-
Slf4j:是一个简单的日志门面,可以将不同的日志实现绑定在一起使用。它提供了一套通用的API,可以与Log4j、Logback、java.util.logging和Apache Commons Logging等日志实现结合使用。这意味着您可以在不更改应用程序代码的情况下切换日志实现。
lookup
lookup是一种在计算机程序中常用的操作,用于查找或搜索某些数据或信息。它可以在数据集合中搜索某个特定的值,然后返回与该值相关的其他数据或信息,通常用于数据库系统、网络协议和编程语言中。lookup通常包括哈希表,二叉搜索树和线性搜索等算法。在Excel中,lookup函数用于在表格中查找特定的值并返回与该值对应的单元格中的数据。
jndi
JNDI (Java Naming and Directory Interface) 是Java提供的一种API,用于访问不同的命名和目录服务。它提供了一种标准的方式来访问不同类型的资源,如数据库、消息中间件、LDAP等。JNDI允许Java应用程序在运行时查找和访问各种资源,无论这些资源是本地还是远程。
JNDI主要由两个部分组成:命名服务和目录服务。命名服务提供了一种查找和定位Java对象的机制,而目录服务则提供了一种在层次结构中组织和管理Java对象的机制。JNDI的核心是上下文(Context)对象,它是一个接口,定义了一组方法来访问命名和目录服务。
JNDI在Java EE中被广泛使用,特别是在EJB、JMS和JDBC等技术中。它使得Java应用程序可以轻松地访问各种资源,并且可以在运行时动态地配置和管理这些资源。