情报

Apache log4j JMSSink反序列化代码执行漏洞(CVE-2022-23302):
当攻击者具有修改Log4j配置的权限或配置引用了攻击者有权访问的LDAP服务时,Log4j1.x所有版本中的JMSSink 都容易受到不可信数据的反序列化。攻击者可以提供一个TopicConnectionFactoryBindingName 配置,利用JMSSink执行JNDI请求,从而以与CVE-2021-4104类似的方式远程执行代码。Log4j默认配置时不受此漏洞影响。

Apache log4j JDBCAppender SQL注入漏洞(CVE-2022-23305):
由于Log4j 1.2.x中的JDBCAppender接受SQL语句作为配置参数,PatternLayout的消息转换器未对其中输入的值进行过滤。攻击者可通过构造特殊的字符串到记录应用程序输入的内容中来操纵SQL,从而实现非法的SQL查询。Log4j默认配置时不受此漏洞影响。

Apache log4j Chainsaw反序列化代码执行漏洞(CVE-2022-23307):
Log4j 1.2.x中的日志查看器Chainsaw中存在反序列化问题,可能造成任意代码执行,该漏洞此前被命名为CVE-2020-9493,官方已发布Apache Chainsaw 2.1.0版本进行修复。Log4j默认情况下未配置Chainsaw使用。
Chainsaw v2是由Log4j开发社区成员编写的与Log4j配套的应用程序,是一个基于GUI的日志查看器,可以读取Log4j的XMLLayout格式的日志文件。

发现者

[

](https://www.mail-archive.com/announce@apache.org/msg07042.html)

漏洞原理分析CVE-2022-23302

Class JMSSink {

// 第一二个参数是污染sink. public JMSSink( String tcfBindingName, String topicBindingName, String username, String password) { Topic topic = (Topic)ctx.lookup(topicBindingName); }

… protected static Object lookup(Context ctx, String name) throws NamingException { try { return ctx.lookup(name); } catch(NameNotFoundException e) { logger.error(“Could not find name [“+name+”].”); throw e; } } }

  1. - 下一步思考如何调用触发这个漏洞,
  2. - [https://www.tabnine.com/code/java/methods/org.apache.log4j.net.JMSSink/%3Cinit%3E](https://www.tabnine.com/code/java/methods/org.apache.log4j.net.JMSSink/%3Cinit%3E)

static public void main(String[] args) throws Exception { String tcfBindingName = args[0]; String topicBindingName = args[1]; String username = args[2]; String password = args[3];

String configFile = args[4]; if(configFile.endsWith(“.xml”)) { DOMConfigurator.configure(configFile); } else { PropertyConfigurator.configure(configFile); }

new JMSSink(tcfBindingName, topicBindingName, username, password); // 看它. } }

  1. <a name="u3ck0"></a>
  2. ## 变种分析(举一反三)
  3. - 查看有apache基金组织下项目有哪些有类似 / 同样 问题,
  4. - [https://github.com/search?q=org%3Aapache+JMSSink&type=code](https://github.com/search?q=org%3Aapache+JMSSink&type=code)
  5. - 可以看到熟悉的备注(代码抄袭),看起来就和第三个是不是顺藤摸瓜看很像.

https://github.com/apache/logging-chainsaw/blob/20612bf9478a3fbb50961e729eb137d4cf0e7ae9/src/main/java/org/apache/log4j/net/JMSReceiver.java This implementation borrows heavily from the JMSSink * implementation….

  1. <a name="m6XfV"></a>
  2. # 漏洞原理分析CVE-2022-23305
  3. - 说是**JDBCAppender**有问题,那么就看这个文件
  4. - [https://github.com/apache/logging-log4j1/blob/de9f0ea504db9d1178db2cf45323d8e182a5df0a/contribs/ThomasFenner/JDBCAppender.java](https://github.com/apache/logging-log4j1/blob/de9f0ea504db9d1178db2cf45323d8e182a5df0a/contribs/ThomasFenner/JDBCAppender.java)
  1. //Default Message-Layout
  2. if(layout == null)
  3. {
  4. layout = new PatternLayout("%m");
  5. }
  1. - 跟进去继续看PatternLayout的定义

// https://github.com/apache/logging-log4j1/blob/de9f0ea504db9d1178db2cf45323d8e182a5df0a/src/main/java/org/apache/log4j/helpers/PatternParser.java#L45 case ‘m’: pc = new BasicPatternConverter(formattingInfo, MESSAGE_CONVERTER); //LogLog.debug(“MESSAGE converter.”); //formattingInfo.dump(); currentLiteral.setLength(0); break;

  1. - 然后看有参数%m时,Configuredtrue,然后各种数据流向jlogger.configureSQL(sql);

….

else if(_option.equals(SQL_OPTION)) { sql = _value; }

….

if(!jlogger.isConfigured()) { try { jlogger.setConnection(con);

  1. if(sql == null)
  2. {
  3. jlogger.configureTable(table);
  4. }
  5. else jlogger.configureSQL(sql);
  6. }
  7. catch(Exception e)
  8. {
  9. errorHandler.error("JDBCAppender::configure(), " + e);
  10. return false;
  11. }
  12. }
  1. - 关于如何使用,一般功能google都会介绍用法,即
  2. - 注意PatternLayout不要配置,则默认为%m

http://www.manongjc.com/article/52239.html

是 Log4j2 的 JDBCAppender 的标签。

  1. <Console name="console" target="SYSTEM_OUT">
  2. <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
  3. </Console>
  1. <JDBC name="jdbc" tableName="log4j2">
  2. <ConnectionFactory class="com.littlefxc.examples.log4j2.ConnectionFactory" method="getDatabaseConnection"/>
  3. <!-- 数据表 log4j2 中的字段 -->
  4. <Column name="time" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}" />
  5. <Column name="level" pattern="%level"/>
  6. <Column name="logger" pattern="%logger"/>
  7. <Column name="message" pattern="%message"/>
  8. <Column name="exception" pattern="%ex{full}"/>
  9. </JDBC>
  10. </Appenders>

```