一、漏洞介绍
Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开源日志记录工具。通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接字服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。Log4j 1.2.x版本中包含一个SocketServer类,在未经验证的情况下,该SocketServe类很容易接受序列化的日志事件并对其进行反序列化,在结合反序列化工具使用时,可以利用该类远程执行任意代码。
二、漏洞复现
这边根据作者poc进行漏洞复现:
1、开放Log4j的服务端套接字端口7777,等待客户端连接
2、利用专门的java反序列化命令生成工具ysoserial生成poc
3、nc将恶意poc重定向到Log4j的开放端口,执行calc命令
三、漏洞分析
存在这个漏洞的原因主要是因为Log4j对接收的数据直接进行反序列化,而不对其进行校验,过分信任外来数据,导致攻击者可以利用其反序列化漏洞进行任意命令执行(Jdk7u21)
1、首先开启Log4j自带的SocketServer服务器时,会监听设置的端口,然后获取Socket对象,进入SocketNode类进行处理
2、SocketNode类的构造方法中会对Socket接收的数据封装成一个object流对象
3、在run方法中会对接收到的对象直接使用readObject函数进行反序列化
四、补丁修复
Apache Log4j在1.2.17以后对产品代码进行重构,发布Log4j2.x版本,Log4j中不再出现SocketServer和SocketNode类,而是分tcp和udp对获取的socket对象进行处理,代码分别封装进TcpSockeServer和UdpSocketServer两个类中,但两个类依旧未对获取的流对象进行处理,导致产生了cve-2019-5645漏洞,本质上这两个洞其实是一个原因引起的。准确的来说,Apache Log4j的SocketServer反序列化漏洞直到2.8.2版本才算真正被修复(cve-2019-5645被修复)。
)
补丁显示,AbstractSocketServer中对流对象进行进行了过滤,只有类名属于白名单的类才能被允许在TcpSocketServer和UdpSocketServe中进行反序列化:
五、漏洞扫描
主机:
对项目的pom.xml文件中的Apache Log4j版本号查看,若
)
流量:
正常日志流对象和poc流量进行对比,
六、漏洞解决措施
1、更新Apache Log4j至2.8.2及之后(>=2.8.2)
2、禁止将Apache Log4j的SocketServer端口开放至公网
3、使用Jdk7u21以上的版本