보안정보

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

Drupal Core Remote Code Execution Vulnerability

2019.04.03

13,435

보안관제센터 보안분석팀 이권혁


1. 개요

콘텐츠 관리 시스템(CMS)은 웹 사이트를 구축하거나 웹 페이지를 구성 시 코드 작성 없이 편리하게 웹 사이트나 블로그를 구성하고 관리할 수 있도록 도움을 주는 시스템으로 대표적인 시스템은 드루팔(Drupal), 워드프레스(WordPress), 줌라(Joomla) 등이 있다.


[그림 1] 오픈소스 CMS인 Drupal


그 중 PHP언어를 사용하고 있는 Drupal은 사용자가 원하는 다양한 Module들을 추가하여 웹 사이트를 구축할 수 있어, 복잡한 구조를 필요로 하는 대규모 사이트를 제작할 때 적합한 콘텐츠 관리 시스템이다. 

Drupal의 다양한 기능을 활용하기 위해선 Module을 추가로 설치하여 사용한다. 하지만 설치한 Module에 대해 보안 취약점으로 인한 문제가 발생하고 있다. 최근에는 활성화된 Module로 인하여 원격 코드 실행 취약점(CVE-2019-6340)이 발견됨에 따라 이번 호에서는 해당 취약점에 대하여 알아보고자 한다.


2. 영향 받는 소프트웨어

CVE

영향 받는 버전

보안패치 버전

CVE-2019-6340

Drupal 8.5.10 8.5 계열 버전

Drupal 8.5.11

Drupal 8.6.9 8.6 계열 버전

Drupal 8.6.10


[표 1] Drupal 취약한 버전 및 보안패치 버전


3. 취약점 분석

원격 코드 실행 취약점(CVE-2019-6340)은 Drupal에서 추가로 설치할 수 있는 다양한 Module 중에서 RESTFUL Web Services Module에서 발견되었으며, 영향 받는 소프트웨어에서는 RESTFUL Web Services Module이 활성화 되어 있을 경우 취약점이 발현된다. 해당 Module의 취약점을 설명하기 앞서 Rest API를 먼저 설명하고자 한다.

Rest API란 Representational State Transfer의 약자로 웹 아키텍쳐의 우수성을 최대한 활용할 수 있도록 만들어진 API이다. 자원(Resource), 행위(Verb), 표현(Representations)으로 구성되어 있으며 json, xml, yaml 등의 다양한 언어로 정의된다.


[그림 2] Rest API (출처 : DZone : An Introduction to RESTFUL APIs)


Rest API에서는 리소스(Resource)에 대한 행위가 일관되게 정의되며 대상 리소스가 문서, 이미지, 영상 등 상관없이 같은 Method에 의해 다뤄지며 Rest에서는 4가지의 Method만 사용하게 된다.

HTTP Method

CRUID 연산

POST

Create

GET

Read

PUT

Update / Replace

DELETE

Delete


[표 2] Rest API에서 사용하는 HTTP Method


예를 들어 사용자 생성을 위해 전송되는 Rest API는 다음 그림과 같이 POST Method와 직렬화 Payload를 붙여서 요청할 수 있으며, Payload를 해석할 수 있도록 Header 부분에 Content-Type을 추가하여 명시하여 사용할 수 있다.


[그림 3] Rest API의 사용자 생성 예시


이렇듯 Rest라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어가 RESTFUL이다. 이 용어는 공식적으로 발표된 것은 아니지만 Rest 원리를 따르는 시스템을 RESTFUL이란 용어로 지칭하고 있으며, Drupal에서도  Rest의 원칙을 준수하기 위해 사용되는 Module을 RESTFUL Web Service이라고 명시하여 사용한다.


Drupal의 RESTFUL Web Services Module이 활성화 되어 있을 때는 기본적으로 /node/{id} API 사용이 가능하며 Payload 값을 붙여서 서버로 전송할 수 있다. 


[그림 4] Drupal RESTful API 기본 예시


서버는 전송 받은 데이터를 LinkItem.php 파일의 Link 속성에서 제공된 옵션으로 역직렬화를 진행하게 된다. 이 때, 직렬화 된 데이터에 악의적인 코드가 포함되어 있을 경우에는 그대로 해당 코드를 실행하여 결과값을 Client에게 반환하게 된다.


[그림 5] LinkItem.php의 정의된 Link 속성


4. 취약점 공격 방법

공개된 원격 코드 취약점 코드를 실행하기 위해서는 Drupal 설치 전에 데이터베이스(MySQL)와 PHP, 웹서버(Apache)를 서로 연동시켜야 한다.

테스트 환경

Drupal 8.6.9
MySQL 5.5.62
Apache 2.4.38
PHP 5.6.40


취약한 버전의 Drupal을 설치하면 기본적으로 RESTFUL Web Service Module은 설치되어 있지 않기 때문에 원격 코드 실행 취약점이 가능하도록 관리자 설정페이지에 접근하여 “HAL, HTTP Basic Authentication, RESTful Web Services, Serialization” Module을 추가해야 한다.


[그림 6] 추가로 설치하는 Module


모든 설정이 끝났다면 공격자는 아래와 같은 공격 코드에서 options 설정값에 공격 코드가 삽입되는 것을 확인할 수 있다.


[그림 7] 원격 코드 실행 공격 코드


공격자가 사용한 악의적인 명령어를 입력한 뒤 공격 코드를 전송할 경우 서버에서는 전송 받은 명령어를 실행한 뒤 결과값을 공격자에게 전송한다.


[그림 8] CVE-2019-6340 PoC 실행 모습


공개된 취약점 공격 코드를 사용하지 않고도 공격이 가능하다. 공격자는 curl 명령어를 사용하여 Header 값과 Payload를 조작하여 전송할 수 있다. Drupal 8 버전에서 Guzzle을 사용하기 때문에 PHPGGC를 활용하여 악의적인 명령어가 삽입된 Payload를 생성할 수 있다.


[그림 9] 원격 실행 코드 생성


생성한 Payload와 curl 명령어를 이용하여 서버로 전송했을 경우에도 공개된 공격 코드를 전송하여 반환 받은 결과값과 동일하게 악의적인 명령어가 실행된 결과값을 확인할 수 있다.



[그림 10] 원격 실행 코드 실행 성공


5. 대응방안

CVE-2019-6340 취약점을 조치하기 위해서는 아래와 같은 방법이 존재한다.

1) Drupal Version Update
 - Drupal 8.6.10 이상, Drupal 8.5.11 이상으로 업데이트

2) RESTful Web Service Module Disenable 
 - RESTful API를 사용하지 않을 경우 관리자 설정페이지에 접근하여 해당 Module 비활성화 및 삭제


6. 참고자료

[1] Drupal Vulnerability (CVE-2019-6340) Can Be Exploited for Remote Code Execution
https://blog.trendmicro.com/trendlabs-security-intelligence/drupal-vulnerability-cve-2019-6340-can-be-exploited-for-remote-code-execution/

[2] Drupal 원격코드 실행 취약점 보안 업데이트 권고 

[3] Exploiting Drupal8's REST RCE (SA-CORE-2019-003, CVE-2019-6340)

[4] RESTful HTTP Request and Response Examples
https://docs.tibco.com/pub/tpm-rest/1.0.1/doc/html/GUID-BAA2DC07-D7DC-49BD-80A5-B4998B56B9BF.html

[5] Drupal の脆弱性 (CVE-2019-6340) に関して検証してみた

[6] Drupal < 8.6.10 / < 8.5.11 - REST Module Remote Code Execution