源于Apache Log4j2这个漏洞的描述很多,也有很多的解法。开这个博的目的就是想分析一下漏洞具体是如何被利用的,这个大黑锅下面都有哪些坑。
最近由阿里安全团队爆出来的Apache Log4j2漏洞,可以说是霸占了大部分网安人的朋友圈。同时一张热图也被传来传去,就是下面这个图片。
由于Apache Log4j2组件应用的普及性,导致了大部分的应用都受到波及。同时我们也需要知道并不是所有的log功能都是通过Apache Log4j2来实现的,其实我们还有很多选择。众所周知Log4j2是Apache 家的千金,同时CekiGulcu也提供了一系列的log功能组件Log4j, SLF4J,LogBack。由于姻亲关系,Apache家的组件大部分都使用了他们自己家的Log4j2, 比如:
1,Spring-boot-strater-log4j2,
2,Apache Solr
3,Apache Flink,
4,Apache Druid
我们再仔细看一下上面的趣图,榔头是砸在了Log4j2的小腿肚子上,但是我们一定要注意,导致这个漏洞的另外一个原因是因为JNDI的注入问题。
科普一下JNDI的小常识:
JNDI是Java Naming and Directory Interface(JAVA命名和目录接口)的英文简写,它是为JAVA应用程序提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。
1.命名的概念与应用
JNDI中的命名(Naming),就是将Java对象以某个名称的形式绑定(binding)到一个容器环境(Context)中,以后调用容器环境(Context)的查找(lookup)方法又可以查找出某个名称所绑定的Java对象。例如,Tomcat服务器在启动时可以创建一个连接到某种数据库系统的数据源(DataSource)对象,并将该数据源(DataSource)对象绑定到JNDI环境中,以后在这个Tomcat服务器中运行的Servlet和JSP程序就可以从JNDI环境中查询出这个数据源(DataSource)对象进行使用,而不用关心数据源(DataSource)对象是如何创建出来的,这种方式极大地增强了系统的可维护性,当数据库系统的连接参数发生变更时,这只是Tomcat系统管理员一个人要关心的事情,而与所有的应用程序开发人员无关。
2.目录的概念与应用 , JNDI中的目录(Directory)与文件系统中的目录概念有很大的不同,JNDI中的目录(Directory)是指将一个对象的所有属性信息保存到一个容器环境中。JNDI的目录(Directory)原理与JNDI的命名(Naming)原理非常相似,主要的区别在于目录容器环境中保存的是对象的属性信息,而不是对象本身,所以,目录提供的是对属性的各种操作。
3. JNDI使用的例子, 使用JNDI,创建一个数据源。
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!