Hacky Message Factory Wrapper

基本信息

pl.asie.foamfix.HackyMessageFactoryWrapper implements MessageFactory —— 修复 Log4j 格式串漏洞(CVE-2021-44228 的利用面之一: MessageFormat 风格参数注入)的消息工厂包装。

类名即警告

类名 Hacky* 是作者的自我标注:它用反射直接改写 Log4j 内部私有字段。

关键方法

方法 行 说明
构造器 HackyMessageFactoryWrapper(MessageFactory delegate) 13 包装委托
static Logger fixLogger(Logger logger) 17 反射入口
newMessage(Object) / newMessage(String) / newMessage(String, Object...) 38 / 46 / 54 覆写接口方法
test() 33 自检

反射实现

Field f = org.apache.logging.log4j.spi.AbstractLogger.class
        .getDeclaredField("messageFactory");

直接取 log4j 内部类 AbstractLogger 的私有字段 messageFactory, 替换为包装后的实例。

⚠️ 脆弱性

  • 依赖 log4j 内部私有字段名 messageFactory,log4j 升级即可能 NoSuchFieldException;
  • 未在该方法外层看到对 log4j 版本的存在性探测。

与字节码补丁 Log4JExploitFix 是两条互补路径: 后者针对 JndiLookup 的 JNDI 查找注入,本类针对消息格式化。

相关条目

源码

  • src/main/java/pl/asie/foamfix/HackyMessageFactoryWrapper.java