您的位置:

log4j漏洞版本详解

一、log4j漏洞

log4j是一个广泛使用的Java日志工具,由于其方便度和灵活程度,受到开发人员的喜爱。然而,log4j近期被曝出一个严重漏洞(CVE-2021-44228),攻击者可以利用该漏洞在受影响的系统中执行任意代码。这个漏洞是由于log4j在处理用户输入时存在缺陷引起的。具体而言,log4j在处理日志消息时,可以通过采用"${"和"}"包裹用户输入的参数,来将其替换到日志消息中,以便更好地组合日志消息。假如用户恶意构造这些参数,就能够在日志消息中注入命令执行语句,导致执行任意代码。

二、log4j漏洞攻击原理

攻击者可以构造恶意的日志消息,将恶意代码注入到日志消息中,通过包括但不限于HttpServletRequest、JNDI、Java Management Extensions(JMX)、Java Naming and Directory Interface(JNDI)、PrintWriter等语句执行代码。因为这些语句应用十分广泛,极容易受到攻击。由于漏洞本质上是在提供日志服务的应用程序中出现,攻击者只需向应用程序提供恶意日志消息,即可触发漏洞。

三、log4j2漏洞

除了log4j,log4j2版本也发现了漏洞。log4j2漏洞(CVE-2021-45046)功能上与log4j漏洞十分相似,由于同样存在缺陷,它在接收到特殊字符时,可以触发任意代码执行。这个漏洞在log4j2版本2.0-2.14.1和log4j-1.2-17及之前版本中出现。和log4j漏洞一样,攻击者可以构造恶意的日志消息,将恶意代码注入到日志消息中,通过脚本执行代码。

四、log4j2漏洞修复

根据官方通告,log4j2的漏洞已经修复。修复方式是在log4j-core 2.14.2之后的版本中,使用JNDI查询时默认禁用了“LDAP协议处理器”和“XBean”模块。这种修复方案的难度较低,大家只需要升级到最新版本即可。需要注意的是,如果您正在使用log4j2 2.0-2.14.1或log4j-1.2-17及之前版本,则应立即升级到最新版本。

五、log4j漏洞影响版本

根据log4j官方通告,log4j漏洞影响一系列版本,包括但不限于:

log4j-1.2.x
log4j:1.2.17及之前版本
log4j-1.2.8
log4j:1.2.14
log4j:1.2.12
log4j:1.2.11
log4j:1.2.9
log4j:1.2.3
log4j-1.2.17
log4j:1.2.15
log4j:1.2.13
log4j:1.2.16
log4j:1.2.10
log4j:1.2.7
log4j:1.2.1
log4j-1.3-Alpha (当时的实验版本,已经停止开发)
log4j-1.4.x
log4j:1.4.2至1.4.17
log4j:1.4.1
log4j:1.4
log4j-1.5.x及以上版本
log4j:1.5.0至1.5.16
log4j:1.5.17至1.5.20
log4j:1.5.21至1.5.22
log4j:1.5.23
log4j:1.5.24
log4j-1.6.x及以上版本
log4j-2.x版本
log4j:2.0至2.17 (<=2.17.0)

六、log4j漏洞是什么

log4j漏洞是一种用于java日志工具log4j的通用代码注入漏洞,允许攻击者在受污染的应用程序中执行任意代码。攻击者可以向应用程序输入带有特殊代码的字符串,以嵌入在输出日志中也得以执行。该漏洞是由于log4j中错误地实现了“${}”语法引起的。攻击者可以利用这种漏洞来编写特殊字符串,并植入mac.osx.TorsionBean类,从而窃取服务器目录中的文件。

七、log4j漏洞是谁发现的

log4j漏洞是由一名实名为“y2k23xz”(匿名人士)的中国安全研究人员发现的。实际上,他早在11月23日就向Apache Software Foundation报告了这个漏洞,并发布了漏洞利用脚本。此后,Apache Software Foundation速度非常快地发布了更新。

八、log4j2漏洞修复方案

官方提供了多种log4j2漏洞的修复方案,包括关闭JNDI查询、配置黑名单、升级新版本等。

ConfigurationBuilder builder = ConfigurationBuilderFactory.newConfigurationBuilder();
DefaultReliabilityStrategy strategy = new DefaultReliabilityStrategy();
if (useXml) {
    builder.setConfigurationName("RollingBuilderTest")
        .addProperty("filename", "target/rolling-builder-test.log")
        .addProperty("rolloverStrategy.Threshold", "1")
        // Use special entity reference for "java:" prefix to avoid outputting it as a legitimate JNDI context name
        .addProperty("log4j2.patternSelector.default.pattern",
            "
   " +
            "
    " +
            "
    
   ");
} else {
    builder.setConfigurationName("RollingBuilderTest")
        .addProperty("filename", "target/rolling-builder-test.log")
        .addProperty("rolloverStrategy.Threshold", "1")
        // Use special entity reference for "java:" prefix to avoid outputting it as a legitimate JNDI context name
        .addProperty("log4j2.patternSelector.default.pattern",
                "${java:"java.naming.factory.initial":-""}${java:"java.naming.provider.url":-""}\\tab %d{ISO8601} %p %c{1.} [%t] %m%n");
}
builder.setStatusLevel(Level.ERROR);
builder.setConfigurationReliabilityStrategy(strategy);
...