一、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查询、配置黑名单、升级新版本等。
ConfigurationBuilderbuilder = 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); ..." + "