Wins blog

글로벌 정보보안 파트너! Global Security  No.1 윈스는 국가대표 정보보안 기업에서 글로벌 강소기업으로 도약합니다.

보안 정보

앞 내용 보기 다음 내용 보기
취약점 정보자바 Commons Collections 라이브러리 역직렬화 취약점
작성일 2017-12-21 조회 2580

개요

Oracle WebLogic Server는 일반적으로 웹 어플리케이션 프로그램을 위한 Java Application Server플랫폼입니다. 구성 요소로는 Application Server, Portal, Application Integration 서비스, HTTP 웹 서버 등이 있으며 WebLogic Scripting Tool(이하 WLST)를 사용하여 원격으로 관리합니다. WebLogic은 T3프로토콜을 사용하며 7001포트를 통해 사용자의 요청을 전달받습니다. 이를 통해 사용자는 WebLogic에 직렬화된 객체를 보낼 수 있으며 취약점이 발생합니다.

 Gabriel Lawrence와 Chris Frohoff가 AppSecCali에서 역직렬화(Deserialization)로 인한 취약점을 발표하였습니다. 그 당시에는 보안업계에서는 관심을 가지지 않았는데 수 개월 후 실제로 공격이 RCE까지 구현되고 공격이 발생하자 큰 관심을 가지게 되었습니다. 이 때 발표한 내용이 Java에서는 흔히 사용되고 있는 commons-collections 라이브러리에서 발생하는 취약점이었습니다. 앞서 언급한 WebLogic 또한 commons collections 라이브러리를 사용해서 취약점에 노출된 상태입니다.

 

분석내용

*분석하기에 앞서 자바 역직렬화 취약점은 WebLogic에만 발생하지 않고 취약한 라이브러리를 사용하는 모든 애플리케이션이 취약점 대상이 될 수 있다.

 WebLogic Server의 T3은 RMI(Remote Method Invocation)를 사용하는 바이너리 프로토콜입니다. 즉, 사용자의 요청을 직렬화를 통해 페이로드를 전달받는다는 의미입니다. 직렬화가 가능한 모든 Java 객체는 Serializable 인터페이스를 구현합니다. 이 인터페이스는 개체를 각각 serialize 및 deserialize 할 때 호출되는 writeObject () 및 readObject () 메서드가 사용되는데 역직렬화를 해제하는readObject () 메소드가 호출될 때 임의의 명령을 실행할 수 있습니다. 그리고 WebLogic은 취약점이 존재하는 Apache Commons Collections Library 사용하여 구현이 됩니다.

 

<그림 1 – 직렬화, 역직렬화>

직렬화를 통해 임의의 코드를 실행하기 위해서는 다음과 같은 두 가지 조건이 있습니다.

 

1.deserialization을 위해 직렬화 된 객체를 타겟에 보낼 수 있게 해주는 진입 포인트

2.deserialization을 통해 조작 할 수있는 하나 이상의 코드 snippets

 

 자바의 직렬화 형식은 16진수 0xAX 0xED인 2바이트 매직 시그니처로 시작이 됩니다. 그 다음 2바이트는 버전 번호가 오는데 아직까지 5버전 (0x00 05)이외의 버전은 확인되지 않았습니다. 

 

<그림 2 – 직렬화 시작 Migic 시그니처>

 

 그 다음 1바이트는 <표 1>과 같은 데이터 유형의 1바이트 값이 나타납니다. 자바의 클래스 명과 함께 일반적으로 사용하는 문자가 있습니다. sr은 0x73 TC_OBJECT, 0x72 TC_CLASSDESC을 나타내며 지금까지 발견된 공격 유형은 대부분이 여기에 해당합니다. 0x73이 공격에 주로 사용되는 이유는 역직렬화-직렬화 변환을 검토 할 때 Java 객체가 교환되는 곳에는 0x73이 포함되기 때문입니다.

(세부적인 직렬화 프로토콜은 사이트 참조바랍니다. https://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html)

 

<표 1 – 데이터 구조 유형 >


0x70 - TC_NULL

0x71 - TC_REFERENCE

0x72 - TC_CLASSDESC

0x73 - TC_OBJECT

0x74 - TC_STRING

0x75 - TC_ARRAY

0x76 - TC_CLASS

0x77 - TC_BLOCKDATA

0x7A - TC_BLOCKDATALONG

0x7B - TC_EXCEPTION

0x7C - TC_LONGSTRING

0x7D - TC_PROXYCLASSDESC

0x7E - TC_ENUM


 

 

 직렬화된 데이터를 확인한 후에는 페이로드를 삽입할 수 있는 데이터의 오프셋을 식별해야합니다. readObject()는 객제의 직렬화 복원에(=역직렬화) 사용하는데 <표 1>에 직렬화 페이로드를 읽은 나타난 유형을 파악하게 됩니다. 지원 요소에 문제가 없으면 이후 페이로드에 읽어 오게 되는데 이 뒤에 특정 코드를 삽입하여 대상을 공격할 수 있게 됩니다

 

 진입할 수 있는 엔트리 포인트를 찾은 후에는 공격자의 의도대로 실행하기 위한 POP Gadjets이 필요 합니다. 해당하는 소스코드에 액세스 할 수 있는 gadgets이 존재하는지 확인하기 위해선 readObjec()를 호출해야합니다. 다양한 라이브러리에 POP gadjets가 존재하는데 쉽게 페이로드를 생성할 수 있게 만든 것이 ysoserial 도구 입니다. <그림 3>에서 보듯이 commons-collections이외에도 JSON, Spring 등등 다양한 페이로드를 생성할 수 있습니다.(Weblogic Sever는 앞서 언급했듯이 Commons-collections에 해당)

 

<그림 3 – ysoserial 도구 페이로드 생성 리스트>

 

 엔트리 포인트와 POP gadjets를 통해서 공격자는 임의의 코드를 실행할 수 있습니다. 아래 <그림 4> 실제 공격에 사용된 패킷입니다. 파란색 하이라이트 된 부분은 페이로드를 실행하기 위한 클래스 및 함수이며 이들 함수로 인해 최종적으로 빨간색 처리된 부분의 코드가 실행이 됩니다.

 

<그림 4 - 자바 역직렬화를 이용한 실제 공격 패킷>

 

 

대응방안

1) org / apache / commons / collections / functors / InvokerTransformer.class 파일 삭제
(테스트 과정 필요, 권고 사항 아님)


2) WebLogic Server 최신버전으로 업데이트


3) 당사 IPS에서는 아래의 패턴으로 대응이 가능

 

 

- [3204] Apache commons-collection Lib Vul
- [3205] Apache commons-collection Lib Vul.A
- [3776] Apache commons-collection Lib Vul.B
- [3777] Apache commons-collection Lib Vul.C
- [3778] Apache commons-collection Lib Vul.D
- [3937] Apache commons-collection Lib Vul.E
- [3938] Apache commons-collection Lib Vul.F
- [3910] JBoss Server doFilter Insecure Deserialization
- [3911] JBoss Server doFilter Insecure Deserialization.A

 

참고

https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/
https://sijmen.ruwhof.net/weblog/683-scanning-an-enterprise-organisation-for-the-critical-java-deserialization-vulnerability
https://www.exploit-db.com/exploits/42806/
https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet
https://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html

 

 

첨부파일 첨부파일이 없습니다.
태그 Deserial  java  직렬화  Weblogic  CVE-2015-4852