背景
log4j这次的bug,我相信大家都已经知道了,仅以这篇文章来记录下从这个bug中学习到的东西。
bug的产生
log4j2 RCE 漏洞总体来说是通过 JNDI 注入来完成的,具体的有 RMI 协议的方式和 LDAP 协议等不同方式,其实简单的来说,就是你输入和输出的数据会被记录到java的日志当中,并且会打印出来,而log4j会去根据某个符合来进行解析,而不是只是把日志答应出来,当你输入的数据符合条件的时候,就会去请求远程服务器,拿到那个服务器的命令,然后回本服务器上进行命令操作,这很危险的,可能会直接导致数据丢失、泄露,服务挂掉等一系列的问题。
bug复现
JNDI
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),应用程序编程接口和服务供应商接口。应用程序编程接口提供了Java应用程序访问各种命名和目录服务的功能,服务供应商接口提供了任意一种服务的供应商使用的功能。
最好理解的就是java中对于数据库的连接方式,其实就是JAVA定义了JDBC的接口,各个厂家来去做对应实现,比如druid、Hikaricp等,springboot2 默认数据库连接池HikariCP
那当初为什么要设计一个JNDI的这个东西出来那?
其实主要是为了spring的一个扩展性,因为你作为框架,你的功能可以不那么全面,但是你的扩展性一定要好,给其他的开发者更多可以自定义的空间。但是那,现在爆出了这个log4j的bug导致出现了程序安全性的问题,所以这其实是在为了保证程序扩展性的同时,没有将对应的安全性做好而出现的问题。