Akamai 报告又一个 Log4j2 拒绝服务漏洞 (CVE-2021-45105):您需要了解的信息
近期在 Log4j2 中发现的一系列漏洞引发全网震动。我们一直在开展相关研究,12 月 17 日,Akamai 员工 Hideki Okamoto 发现了另一个拒绝服务 (DoS) 漏洞,并本着负责的职业精神加以上报,相关机构现已为该漏洞分配 CVE ID:CVE-2021-45105。
我们发现 CVE-2021-45105 漏洞的来龙去脉
我们是在分析同系列第二个漏洞 CVE-2021-45046 的过程中发现这一漏洞的。如果 Log4j2 属性包含使用上下文查找 (${ctx:FOOBAR}) 或线程上下文映射模式(%X、%mdc 或 %MDC)的自定义布局,并且应用程序将用户输入传递给线程上下文,那么精心编制的攻击载荷就可能造成不受控的递归。最初我们报告此漏洞可能引发 DoS 攻击,但后续发现这是一个远程代码执行 (RCE) 漏洞。
在尝试确定哪些攻击载荷会引发 DoS 攻击时,我们发现了一个由第三方安全团队发布的攻击载荷。该攻击载荷所执行的操作非常简单,它会引发这样一个异常:“java.lang.IllegalStateException: Infinite loop in IllegalStateException: Infinite loop in property interpolation”,而且这是一个可恢复的异常。我们当时并不确定这是否属于 CVE-2021-45046 漏洞的攻击载荷,但注意到这个异常是由 Log4j2 代码中的一种“保护机制”引发的。
StrSubstitutor.java
private void checkCyclicSubstitution(final String varName, final List<String> priorVariables) {
if (!priorVariables.contains(varName)) {
return;
}
final StringBuilder buf = new StringBuilder(BUF_SIZE);
buf.append("Infinite loop in property interpolation of ");
buf.append(priorVariables.remove(0));
buf.append(": ");
appendWithSeparators(buf, priorVariables, "->");
throw new IllegalStateException(buf.toString());
}
这就代表 Log4j2 的开发者早已注意到,在 Lookup 进程中可能发生循环引用。我们相信 Log4j2 日志记录工具的开发者希望应用程序开发者捕获这一异常,因此通过这个函数的命名指明了自己的意图:checkCyclicSubstitution()。该函数会校验用于存储值历史记录的数组列表。我们当时想到,或许有某种方法可以绕过循环引用校验。于是最终成功找到了这样一个攻击载荷,并在某些版本的 JVM 中引发了 java.lang.StackOverflowError。另外还有一点引起了我们的注意,在已经修复了 CVE-2021-45046 漏洞的 Log4j 2.16 中也能成功实施此类攻击。
在我们将问题上报给 Log4j2 安全团队后,他们为其分配了 CVE ID CVE-2021-45105,并迅速在 Log4j 2.17 中修复了此漏洞。
攻击媒介
我们发现,如果应用程序将用户输入传递给线程上下文,对于记入日志的上下文数据执行的双重求值运算可能造成服务器崩溃:
User-Agent: ${${ctx:ua}}
Twitter 和 GitHub 上已有的一些攻击报告指向与此漏洞无直接关系的其他攻击媒介,因为其中部分攻击媒介最多造成可恢复的异常,不会造成服务器崩溃。此类变体包括:
${ctx:loginId}
$${ctx:loginId}
${${::-${::-$${::-j}}}}
抵御 CVE-2021-45105 漏洞
对于拥有全部规则集的 Kona Site Defender 客户,我们已经通过当前 KRS/ASE 规则 3000014 和“命令注入”自动化攻击组 (AAG) 提供了针对这一漏洞的防御措施。
我们还会继续开展研究,并且及时发布更多相关新资讯。