
经发现,Apache Log4j 2.15.0 中针对 CVE-2021-44228 的修复在某些非默认配置下并不完整。当日志配置使用非默认的模式布局(Pattern Layout),且包含上下文查找(例如 $${ctx:loginId})或线程上下文映射模式(%X、%mdc 或 %MDC)时,攻击者可以通过控制线程上下文映射(MDC)输入数据,利用 JNDI 查找模式构造恶意输入数据,从而导致拒绝服务(DOS)攻击。Log4j 2.15.0 默认尽力将 JNDI LDAP 查找限制为本地主机。Log4j 2.16.0 通过移除消息查找模式支持并默认禁用 JNDI 功能来修复此问题。
Log4j 引入了映射诊断上下文(MDC)的概念。
Log4j 2 沿用了 MDC 和 NDC 的思路,但将它们合并到单一的线程上下文中。线程上下文映射相当于 MDC,线程上下文栈相当于 NDC。虽然在 Log4j 2 中它们经常被用于诊断问题以外的用途,但由于这些缩写已广为人知,因此仍然常被称为 MDC 和 NDC。
大多数实际系统需要同时处理多个客户端。在这种系统的典型多线程实现中,不同线程会处理不同的客户端。日志记录特别适合跟踪和调试复杂的分布式应用程序。区分不同客户端日志输出的常见方法是为每个客户端实例化一个新的独立日志记录器。这会导致日志记录器数量激增,并增加日志管理的开销。
一种更轻量的技术是为来自同一客户端交互的每个日志请求打上唯一标记。Neil Harrison 在《Pattern Languages of Program Design 3》(R. Martin、D. Riehle 和 F. Buschmann 编,Addison-Wesley,1997)中的《Patterns for Logging Diagnostic Messages》一书中描述了这种方法。正如鱼可以被标记并追踪其运动一样,为日志事件打上公共标记或一组数据元素,可以追踪事务或请求的完整流程。我们称之为鱼标签。
Log4j 提供了两种实现鱼标记的机制:线程上下文映射和线程上下文栈。线程上下文映射允许添加任意数量的项目,并通过键/值对来标识。线程上下文栈允许将一个或多个项目推入栈中,然后根据它们在栈中的顺序或数据本身来标识。由于键/值对更灵活,当数据项在请求处理过程中被添加,或者数据项超过一两个时,建议使用线程上下文映射。
要通过线程上下文栈为每个请求打上唯一标记,用户需要将上下文信息推入栈中。
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45046 https://logging.apache.org/log4j/2.x/manual/thread-context.html