最近,一个 0day 漏洞被披露,该漏洞利用了log4j 中的安全漏洞,允许未经授权的远程代码执行。
我想知道,真正的原因是什么,为什么 log4j 实现了这个 JNDI 查找,这根本导致了漏洞?
在 log4j 中使用此 LDAP 查找功能的示例是什么?
Log4j 是 Java 中使用的一种流行的日志框架(您可以通过查看该漏洞的广泛影响来计算流行程度)。Log4j 提供了一项特定功能,您可以在其中将标记添加到日志记录字符串中,然后对其进行插值以获取特定数据。例如,“%d{dd MMM yyyy}”将插入记录消息的日期。
同时,JNDI(Java 命名和目录接口)通常用于向多个(微)服务共享配置设置。
您可以想象这样一种情况:有人想要在错误情况下记录配置设置。
基于 Java 的应用程序可以一起使用 JNDI + LDAP 来查找包含它可能需要的数据的业务对象。例如,以下 URL ldap://localhost:3xx/o=BusinessObjectID 可从在端口 3xx 上的同一计算机 (localhost) 上运行的 LDAP 服务器或在受控环境中托管的远程计算机上远程查找并调用 BusinessObject,然后继续从中读取属性。
它引用的更新将其称为“LOG4J2-313:添加 JNDILookup 插件”。动机可以在Apache JIRA 条目中找到
目前,Lookup 插件 [1] 不支持 JNDI 资源。如果在配置中支持JNDI资源查找,那就真的很方便了。
JNDI 查找插件的一个用例如下:我想使用 RoutingAppender [2] 将来自同一 Web 应用程序上下文的所有日志放入日志文件中(每个 Web 应用程序上下文一个日志文件)。并且,我想使用 JNDI 资源查找来确定目标路由(类似于 logback [3] 的 JNDI 上下文选择器)。
通过 JNDI 查找确定目标路由可能是有利的,因为我们不必添加任何代码来设置线程上下文的属性,并且即使在单独的线程中,JNDI 查找也应该始终有效,而无需复制线程上下文变量。
[1] http://logging.apache.org/log4j/2.x/manual/lookups.html [2] http://logging.apache.org/log4j/2.x/manual/appenders.html#RoutingAppender [3] http://logback.qos.ch/manual/contextSelector.html
log4j 的一个大问题是,默认情况下所有模块的所有字符串插值都是打开的。与此同时,它已成为选择退出,但情况并非总是如此。
| 归档时间: |
|
| 查看次数: |
5570 次 |
| 最近记录: |