보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

Oracle WebLogic RCE 취약점 (CVE-2019-2890) 분석 및 대응방안

2020.02.05

33,859



 

 

 


1. 개요


Oracle社에서 제공하는 Oracle Fusion Middleware의 WebLogic Server에서 역직렬화 (Deserialization)를 우회하고 특정 권한으로 악의적인 T3프로토콜 요청을 통해 원격명령실행이 가능한 취약점(CVE-2019-2890)이 발견되었다. 취약점은 WebLogic Server에서 데이터 수신 시에 바이너리 형태로 변환된 데이터를 다시 본래의 형태로 변환하는 역직렬화 과정에서 입력 값의 유효성 검증 누락으로 인해 발생된다.


CVE목록에는 2019년 10월 16일에 공개되어 2019년 10월 Oracle 긴급 패치 업데이트 목록에 포함되어 보안패치가 완료되었다. 국내에서는 12월 9일에 KISA의 ‘Oracle WebLogic Server 원격코드 실행 보안 업데이트 권고’의 보안공지를 통해 언급되어 다시 한 번 주목을 받게 되었다. CVE 취약점을 진단하는 검색엔진 Vulmon(Vulnerability Intelligence Search Engine) 의 ‘Vulnerability Trend’의 수치를 보면 왜 업데이트 권고 공지가 나왔는지 유추해 볼 수 있다.


 

 

[그림 1] Vulmon 검색엔진의 CVE-2019-2890 검색 결과


취약점 공개 이후 GitHub에서는 10여종의 PoC가 공개되어 있으며 취약점의 영향도가 높기 때문에 이번 호에서는 Oracle Fusion Middleware의 WebLogic Server에서 T3프로토콜을 이용한 원격명령실행 취약점인 CVE-2019-2890에 대해서 좀 더 상세하게 살펴보고자 한다.



2. 취약점 분석


1) 영향받는 소프트웨어


 

 

[표 1] CVE-2019-2890에 영향 받는 버전 정보


2) CVE-2019-2890 취약점 매커니즘


WebLogic 콘솔을 실행하면 RMI(Remote Method Invocation) 통신 시에 사용되는 T3 프로토콜이 Default Port 7001으로 기본 활성화되고, T3프로토콜을 통해 WebLogic Server와 Client사이에 데이터 전송이 가능하게 된다. CVE-2019-2890는 T3 프로토콜을 이용해 조작된 명령어를 서버에 전송 후 자바 프로그램에서 각 객체간, 컴퓨터간 메소드를 호출할 수 있게 해주는 기술인 RMI(Remote Method Invocation)연결을 통해 원격에서 임의의 명령어를 전송하여 실행되는 취약점이다.


T3프로토콜은 데이터를 안전하게 전송하기 위해서 데이터를 바이너리 형태로 변환하는 직렬화(Serialization)를 수행하고, 데이터를 수신한 경우에는 바이너리 형태로 변환된 데이터를 원본 데이터로 변환하는 역직렬화(Deserialization)를 수행하게 된다. 취약점이 발생되는 지점은 수신한 데이터를 원본 데이터로 변화하는 역직렬화 과정에서 입력 받은 데이터의 검증 미흡으로 인해 발생된다.


 


[그림 2] CVE-2019-2890 공격 시나리오

 

3) CVE-2019-2890 취약점 상세분석 


CVE-2019-2890의 역직렬화 취약점을 이해하기 위해서는 WebLogic Server의 직렬화 과정에 대한 이해가 필요하다. WebLogic Server의 직렬화는 weblogic.jar 파일 내의 weblogic.wsee .jaxws.persistence.PersistentContext.class를 통해서 구현된다. 


WebLogic Server에서 직렬화를 하기 위해서는 [그림 5-4]과 같이 writeSubject 메소드 내에 EncryptionUtil.encrypt()를 통해 암호화가 수행되며 이때 암∙복호화 시에 필요한 키를 관리하는 파일인 SerializedSystemIni.dat파일이 사용되게 된다. Oracle에서 CVE-2019-2809 분류 시에 인증이 필요한 취약점이라고 분류한 것도 이와 같은 이유에서다.


 


[그림 3] Oracle 공식 발표 자료 – 인증이 필요한 취약점 CVE-2019-2890




[그림 4] writeSubject 메소드 내 직렬화 코드


writeSubject 메소드에서 생성된 직렬화 데이터는 T3프로토콜을 통해 WebLogic Server로 전송되며 readObject 메소드를 통해 역직렬화 과정을 거치며 임의의 명령을 실행할 수 있게 된다. 


 


 


4) PoC 분석


PoC를 실행하면 앞서 설명한 바와 같이 T3 서비스와 통신 후 원격 명령 실행의 통로가 되는 RMI Connection 포트를 오픈하는 내용의 페이로드를 전송한다. 해당 페이로드는 RMI 관련 클래스를 참조하여 작성되었으며 서버 측의 RMI 객체 기동 후 RemoteObjectInvocationHandler를 직렬화하고 UnicasfRef를 사용하여 원격 end와의 TCP 연결을 설정하는 내용을 담고 있다.


 

 

[그림 6] RMI Connection 포트 오픈을 위한 페이로드


 


 


5) CVE-2019-2890 공격 시연


분석 및 테스트를 위한 환경 구축 정보는 [표 5-3]과 같다.


 

 

[표 3] 테스트 환경


① Attacker는 RCE공격수행을 위해 Ysoserial의 JRMPListener 라이브러리를 사용해 RMI Connection 포트(1099)를 오픈한다.

 

 

 

[그림 7] Attacker RMI Connection 포트 오픈


② PoC에서는 T3프로토콜을 이용하여 소켓통신을 통해 WebLogic Server의 RMI Connection 포트를 오픈하는 페이로드를 전송한다.


 

 

[그림 8] PoC 실행 및 페이로드 전송 화면


T3프로토콜의 접속이 성공하면 WebLogic Server의 RMI Connection에 사용되는 페이로드에 포함되는 ConstantTransformer, InvokerTransformer등의 전송내역을 [그림 5-9]과 같이 네트워크 패킷을 통해서 확인할 수 있다.


 

 

[그림 9] RCE접속을 위한 페이로드 접속 내역


③ RMI Connection 포트(1099)를 통해 원격 명령 실행을 위한 페이로드를 전송한다. 


 

 

[그림 10] 역직렬화 과정을 통한 명령 실행 관련 로그


④ 원격 명령 실행 확인


 

 

[그림 11] RCE명령 실행으로 계산기를 실행한 화면


Attacker가 입력한 공격 페이로드로 RMI Connection의 역직렬화가 성공하면 WebLogic Server측의 RMI Connection 포트가 오픈되게 된다. JVM에 존재하는 객체가 다른 JVM내에서 동작하는 객체의 메소드를 호출할 수 있는 JRMP((Java Remote Method Protocol)를 통해서 Attacker에 응답코드를 전송함으로써 Attacker가 Victim에 임의의 원격명령어 전송이 가능하게 된다.


 

 

[그림 12] Attacker에서 전공한 임의의 원격명령어 실행 내역



3. 대응방안


1) WebLogic 보안패치 적용


 


[표 4] CVE-2019-2890에 안전한 WebLogic 버전

 

WebLogic Server의 12.1.1.0이하 버전의 경우 bsu, print version 명령어 및 WebLogic Server의 Admin Console화면 등을 통해서 버전 확인이 가능하다.


 

 

[그림 13] WebLogic Server 10.3.6.0 환경에서 WebLogic 버전 정보 확인 결과


취약점의 패치 전∙후 소스코드를 살펴보면 readSubject 메소드에서 문제가 된 역직렬화 구문이 WSFilteringObjectInputStream 메소드를 이용하여 검증된다는 것을 알 수 있다. 해당 메소드는 역직렬화할 객체가 subject의 서브 클래스인지 점검하고, 아니라면 에러 발생 후 역직렬화 과정을 종료시킨다.


 

 

[표 5] WebLogic 취약점 발생 소스코드 보안패치 비교


2) T3 프로토콜 비활성화


Oracle WebLogic은 HTTP 통신을 제외한 모든 커넥션에 T3 프로토콜을 사용하기 때문에 시스템 영향도가 높으나 임시적으로 T3 프로토콜을 비활성화 하여 대응 가능(시스템 영향도 반드시 확인)


 

 

[그림 14] WebLogic Server 내에 T3 프로토콜 차단 적용 화면


 

 

[표 6] WebLogic Server 내에 T3 프로토콜 차단 방법


04. 참고자료


[1] Oracle WebLogic Server 원격 코드 실행 보안 업데이트 권고(2019.12.09.)

https://www.boho.or.kr/data/secNoticeView.do?bulletin_writing_sequence=35222

https://www.oracle.com/security-alerts/cpuoct2019.html


[2] CVE-2019-2890 PoC

https://github.com/ZO1RO/CVE-2019-2890

https://github.com/SukaraLin/CVE-2019-2890


[3] WebLogic RCE (CVE-2019-2890) Debug Diary

https://paper.seebug.org/1069/

 

[4] WebLogic t3 역 직렬화 취약점 (CVE-2019-2890) 분석

http://gv7.me/articles/2019/cve-2019-2890-vulnerability-analysis/


[5] 안전하지 않은 Java 객체 deserialization을 이용하는 페이로드를 생성하기 위한 개념 증명 도구

https://github.com/frohoff/ysoserial


[6] 자바 메소드 정리 글 http://cris.joongbu.ac.kr/course/java/api/java/rmi/activation/Activator.html http://cris.joongbu.ac.kr/course/2018-1/jcp/api/java/rmi/server/class-use/RemoteObject.html


[7] Oracle 최신 버전 참고

https://blogs.oracle.com/fusionmiddlewaresupport/october-2019-oracle-weblogic-server-patch-set-update-have-been-released