slf4j中的一个xml反序列化
前言
在审计某一产品时,全局搜索看到了这个xml反序列化,然后就单独拿出来研究了下,发现在18年slf4j-ext
1.7.25以后版本中就直接删除了相应的类,还给分配了一个编号CVE-2018-8088
分析
引入了以下两个依赖,其中log4j-slf4j-impl
为最新的版本
|
|
先来看xml反序列化的点,在org.slf4j.ext.EventData#EventData(java.lang.String)
中
EventData大家可能不陌生,在CVE-2019-2725 weblogic二次反序列化的时候用到过
接着在org.apache.logging.slf4j.EventDataConverter#convertEvent
中,new了一个EventData,并传入message
然后在org.apache.logging.slf4j.Log4jLogger#log
中,调用了convertEvent,在这里就想找一下是否可以通过记录日志等信息,最后传参传到这里
这里我简单的构造了一个demo,利用这个log去记录错误信息
|
|
这样构造log的话是可以rce的,但是slf4j是一个底层的框架,一般是不会直接使用它去记录日志的,而且如果使用它去记录日志还有两个条件:
- LoggerFactory.getLogger(“EventLogger”);必须使用EventLogger的Logger
- MarkerFactory.getMarker(“EVENT”); mark必须标记为EVENT
这两个条件是为了通过if的条件判断
前面提到slf4j是一个底层的框架,org.apache.logging.slf4j.Log4jLogger#log
继承了LocationAwareLogger
接口,那接下来就是去找那些依赖或工具集成了sfl4j并且使用LocationAwareLogger
接口记录信息
在网上找到了,slf4j可以和jdk-logging、log4j1、log4j2、logback集成,然后测试了下,集成后都没有使用LocationAwareLogger
去记录信息,如何集成和简单使用可以去参考这篇文章
Druid集成
在我正在审计的产品中,是Druid中使用SLF4JImpl类集成了LocationAwareLogger
前面提到了有两个条件,其中EventLogger可以通过new一个SLF4JImpl对象去满足这个条件,本身从工厂类里获取log是无法满足这个条件的,除此之外,还有一个mark必须标记为EVENT的条件,这个在SLF4JImpl中直接就全部设为了null,因此就无从下手没办法利用
小结
这个点看下来,其实利用难度很高,但也学到了一些东西,感觉这个利用点以后在审计代码的时候,可以去关注一下,说不定有的产品就可以利用呢
这是在github上搜索哪些产品集成了LocationAwareLogger
,大概看了一下,mark这个条件基本就没有满足的,有兴趣的可以去找一找
代码审计时总结如下:
- 搜索哪些类集成了
LocationAwareLogger
类 - 其次去看
mark
和EventLogger
是否可控,就是前面提到的两个条件 - 然后就是看依赖中是否有
slf4j-ext
且 ≤ 1.7.25,或者全局搜索是否有EventData
类 - 最后看log记录的错误信息是否可控