Wins blog

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

보안 정보

앞 내용 보기 다음 내용 보기
취약점 정보[CVE-2017-4971] Spring Web Flow MVC view 원격코드 실행 취
작성일 2017-07-28 조회 1537

1.개요

 Spring Web Flow(이하 SWF)는 스프링 MVC(Model-View-Controller)를 기반으로 하며 웹 애플리케이션의 "Flow" 구현을 허용합니다. SWF에서 의미하는 Flow를 이해하기 쉽게 웹 페이지에서 호텔을 예약하는 예를 들어 보겠습니다. 처음에 구매자는 자신이 원하는 예약조건을 검색할 것입니다. 그리고 그 결과를 확인하며 자신에게 가장 적합한 일정을 정하고 최종 예약까지 하게 될 텐데 Flow는 이러한 검색부터 예약까지 일련의 흐름의 묶음을 의미합니다. SWF가 가지는 특징으로는 다중 HTTP 요청 받는 것이 가능하고, 트랜잭션 데이터를 처리하며 또한 재사용이 가능하고, 동적이며 장기적으로 실행이 가능하게 하는 기능을 제공합니다.

 최근 Pivotal에서 SWF의 MVC view에 존재하는 데이터 바인딩 취약점을 수정하기 위한 업데이트 패치를 발표했습니다(CVE-2017-4971). 해당 취약점은 MVC view 객체가 생성되고 데이터를 바인딩 할 경우에 특정 속성을 지정하지 않아 사용자로부터 전달 받는 값을 검증 없이 수행하게 됩니다.이를 통해 공격자는 악의적으로 조작된 코드 실행이 가능합니다

 

2.분석내용

▶취약한 버전

Spring Web Flow 2.4.0 ~ 2.4.4

 

▶Vender

Spring by Pivotal

 

▶요약

SWF에서 useSpringBeanBinding 매개 변수의 초기 설정값은 True 입니다. 이를 False로 설정하고 BinderConfiguration을 설정하지 않으면 MVC view 객체를 생성합니다. 이를 통해 특정 함수가 호출 가능하게 되고 사용자가 전달한 데이터에 별도의 검증을 하지 않아 임의의 코드가 실행 가능해집니다. 

 

▶세부 분석

 우선 해당 취약점의 위치를 확인하기 위해 CVE-2017-4971의 패치 전후로 변경 된 부분을 확인 해보면 <그림 1>에서 보는 바와 같이 expressionParser 부분이 변경되었음을 알 수 있습니다.  AbstractMvcView.java 소스 파일내에 expressionParser 부분을 찾아보면 <그림 2>와 같습니다.

 

<그림 1 – 패치 전/후 비교>

 

<그림 2 – expressionParser 소스코드>

 

 <그림 2>에 나타나는 expressionParser는 useSpringBeanBinding파라미터가 ‘False’로 설정됐을 경우 BeanWrapperExpressionParser보다  SpelExpression 객체를 우선시하여 불러 옵니다. SpelExpression 객체는 getValueType메소를 호출할 때 표현식으로 평가하게 되어 이를 통해 임의의 코드 실행이 가능해집니다. 이제는 취약점을 트리거하기 위한 getValueType을 호출하게되는 일련의 과정을 확인해보겠습니다. <그림 3>은 RCE가 발생하기까지의 과정을 도식화 한 것입니다. 

 

<그림 3 – 취약점 트리거 과정 도식화>

 

 해당 취약점이 존재하는 AbstractMvcView를 호출하기 위해서는 기본적으로 아래와 같은 두 가지 기본 조건이 필요합니다.

 

조건 1. useSpringBeanBinding이 'False' 로 설정

<그림 4 – useSpringBeanBinding 파라미터>

 

해당 파라미터는 기본적으로 설정되어 있는데 해당 라인을 주석 처리하면 로 설정 됩니다

 

조건 2. BinderConfiguration 객체가 설정되지 않아야 함

<그림 5 – BinderConfiguration 설정>

 

<그림 5>를 확인해보면ReviewBooking 내에 BinderConfiguration이 설정이 되어 있지 않는 것을 확인할 수 가 있습니다.

 

 위의 두 가지 조건을 충족 시키면 AbstractMvcView를 호출하게 되고 여기서 사용하게 되는 MVC view객체에 RCE 취약점이 존재합니다.

 

MVC view 객체는 HTTP Request를 받을 경우 processUserEvent 객체를 시작합니다.

 

<그림 6 – 사용자 요청 전달 받을 경우 호출되는 메소드>

 

HTTP로 전달받은 매개 변수와 MVC간에 바인딩 프로세스가 시작 될 때 BinderConfiguration이 설정되어 있지 않으면 addDefaultMappings가 호출 됩니다 (그림7 참조).

 

<그림 7 – MappingResult 메소드>

 

 addDefaultMappings에서 입력되는 매개 변수가 filedMarkerPrefix 문자열(여기의 경우 “_”)로 시작하면 addEmptyValueMapping 메소드가 호출 됩니다.

 

<그림 8 – addDefaultMappings 메소드>

 

 이제 공격자가 제어 가능한 함수가 존재하는 메소드에 도달했습니다앞서 설명했듯이는 매개 변수가로 설정된 경우객체를 생성합니다이로 인해 을 통해가 가능해집니다

 

<그림 9 – addEmptyValueMapping 메소드>

 

 

 

3. 대응 방안

1) useSpringBeanBinding 파라미터를 “True”로 설정

2) JSF(Java Server Faces) 사용자는 해당 취약점에 영향을 받지 않음

3) SWF 최신버전(2.4.5)으로 업데이트.

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

- [3606] Spring Web Flow expressionParser RCE

 

4. 참고

https://blog.gdssecurity.com/labs/month/july-2017

https://pivotal.io/security/cve-2017-4971

http://www.securityfocus.com/bid/98785

https://jira.spring.io/browse/SWF-1700

 

첨부파일 첨부파일이 없습니다.
태그 CVE-2017-4971, Spring, SWF, Flow, MVC