log4j-core和log4j-api升级到2.15.0,但将绑定库log4j-slf4j-impl留给2.14.1是否就足够了,因为mvn dependency:tree表明log4j-slf4j-impl:2.14.1依赖于log4j-core:2.15.0和log4j-api:2.15.0,并且日志记录工作正常吗?我之所以问这个问题,是因为在昨天发生大灾难的时候,log4j-slf4j-impl还没有发布2.15.0。LOG4J_FORMAT_MSG_NO_LOOKUPS设置为true的更改?运行以下单元测试表明,变量仍然是false,第一个问题中的所有依赖项都被设置为2.15.0版本:import org.apache.logging.log4j.util.PropertiesUtil;
@Test
public void testLog4j() {
PropertiesUtil props = PropertiesUtil.getProperties();
boolean val = props.getBooleanProperty("LOG4J_FORMAT_MSG_NO_LOOKUPS");
System.out.println(val);
}发布于 2021-12-12 20:19:33
修复方法是:默认情况下,Log4j2不再格式化消息中的查找.
log4j-slf4j-impl不包含易受攻击的代码,所以应该是可以的,但是现在更新到2.15.0。
LOG4J_FORMAT_MSG_NO_LOOKUPS不存在于您的测试中,所以它返回false,但这不是在log4j中读取它的方式。该属性现在被读取为PropertiesUtil.getProperties().getBooleanProperty("log4j2.formatMsgNoLookups", true),因此如果它不存在,那么它将默认为true。这可以通过以下方式进行检查:
import org.apache.logging.log4j.core.util.Constants;
...
System.out.println(Constants.FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS);在新版本中,这是正确的,但也没有使用。相反,必须通过包含%msg{lookups}的模式启用查找。
来自MessagePatternConverterTest的测试应该显示这些查找是否正在进行:
@Test
public void testDisabledLookup() {
final Configuration config = new DefaultConfigurationBuilder()
.addProperty("foo", "bar")
.build(true);
final MessagePatternConverter converter = MessagePatternConverter.newInstance(
config, new String[] {"nolookups"});
final Message msg = new ParameterizedMessage("${foo}");
final LogEvent event = Log4jLogEvent.newBuilder() //
.setLoggerName("MyLogger") //
.setLevel(Level.DEBUG) //
.setMessage(msg).build();
final StringBuilder sb = new StringBuilder();
converter.format(event, sb);
assertEquals("${foo}", sb.toString(), "Expected the raw pattern string without lookup");
}https://security.stackexchange.com/questions/257897
复制相似问题