보안정보

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

Apache Solr – DataImport Handler RCE (CVE-2019-0193)

2019.10.07

13,192

 

 

1. 개요

 

최근 원격제어를 이용한 개인 정보 유출 및 시스템 주요 정보 탈취 공격이 다수 발견되고 있다. KISA의 '2019년 상반기 악성코드 은닉사이트 탐지 동향 보고서'에 따르면 전체 악성코드 유형 중 원격제어를 이용한 공격이 31%의 비율로 가장 높았다. 원격제어란 해커가 원격지에서 악성코드에 감염된 좀비 PC들을 제어하는 형태의 공격 유형을 의미한다.

이번 호에서는 오픈 소스 엔터프라이즈 검색 엔진 ‘Apache Solr’의 ‘DataImport Handler’ 모듈의 기능을 악용한 ‘원격코드 실행(RCE)’ 취약점에 대하여 소개하고자 한다. 

 

 

[그림 1] 악성코드 유형별 비율

 

 

2. Apache Solr란?

 

Apache Lucene을 기반으로 한 검색 라이브러리이며, XML / HTTP 및 JSON API, 적중 강조 표시, 패싯 검색, 캐싱, 복제 및 웹 관리 인터페이스를 지원하는 오픈 소스 엔터프라이즈 검색 엔진(enterprise search engine)이다. 또한 DIH(Data Import Handler)를 사용하여 데이터 베이스로부터 검색에 필요한 데이터를 추출하여 Solr 서버에 저장하고 가공하는 것이 가능하다.

 

 

 

[그림 2] Apache Solr 관리자 페이지

 

 

3. Apache Solr - DataImport Handler RCE(CVE-2019-0193)

 

DIH(DataImportHandler) 모듈은 데이터베이스로부터 데이터를 추출해서 Solr 도큐먼트로 저장해 주는 기능을 한다. XML에 쿼리문을 작성해서 사용 가능하며, 필요한 경우 JavaScript를 사용하여 데이터베이스의 내용을 수정하는 것이 가능하다.

CVE-2019-0193(DataImport Handler RCE)은 위와 같이 DIH 모듈을 사용하여 추출된 데이터에 대해 Solr 서버에서 실행 시 dataconfig 파라미터 내에 악의적인 JavaScript가 포함될 수 있는 취약점이다.

 

 

 

[그림 3] Apache Solr 보안 권고 사항 (SOLR-13669)

 

 

1) 영향을 받는 소프트웨어 버전

 

Solr Release 8.2.0 버전을 제외한 Release 1.1.0 ~ Release 8.1.1까지 취약한 버전에 해당 된다. 

 

취약한 버전 정보

Release 8.x.x

Release 4.x.x

Release 7.x.x

Release 3.x.x

Release 6.x.x

Release 1.x.x

Release 5.x.x

 

 

[표 1] 취약한 버전 정보

 

 

2) 테스트 분석 환경 정보

  

OS

Windows 10 pro 64bit

JAVA Version

1.8.0_121

Python Version

2.7.16

Solr Version

v5.5.5 (DIH example)

Solr Server IP

192.168.136.143:8983

공격 코드 Code

CVE-2019-0193.py

 

[표 2] 취약점 분석 환경 구축

 

 

3) 취약점 테스트

 

공격자 PC에서 Solr 서버에 특정 프로그램을 실행시키는 명령어를 입력한다.

 

ㆍ 명령어 구성 : python [PoC.py] [공격 대상 URL] [프로그램 실행 명령어]

​ㆍ 사용 예시 : python CVE-2019-0193.py http://192.168.136.143:8983 calc

  

 

[그림 4] 악성파일 명령어 실행

 

 

명령어 실행 시 RCE코드의 실행 로고와 함께 Solr 서버에 생성된 Core의 개수를 확인한다.

 

 

 [그림 5] Solr 서버의 core개수 확인

 

 

각각의 Core를 대상으로 악성 JavaScript가 포함된 요청 패킷을 Solr 서버로 전송하게 된다. 정상적으로 요청 패킷이 전송되고, 정상적으로 서버가 응답한 경우 공격 성공을 의미하는 ‘[Send 공격 코드 Success!]’ 문구가 출력된다. 

 

 

[그림 6] 원격코드 실행 결과 (공격자)

 

 

악성 JavaScript가 포함된 패킷을 받은 Solr 서버는 활성화된 Core의 개수(5개)만큼 원격으로 실행시키고자 했던 특정 프로그램이 실행된 것을 확인할 수 있다.

 

 

 [그림 7] 원격코드 실행 결과 (Solr server)

 

 

4) 공격 코드 분석

 

공격 코드 구성은 main 함수를 포함하여 3개의 함수로 구성되어 있다. 사용자가 공격 코드 실행 시 입력한 공격명령에 포함된 URL과 프로그램 실행 명령어를 인자로 받아 ‘admin_cores’ 함수를 실행시킨다. 

 

admin_cores 함수는 Solr 서버에서 운영되는 core 정보를 JSON 형태로 받아온다. Core가 존재할 경우 존재하는 각각의 Core마다 공격을 수행하게 된다. 실질적인 공격 수행 함수인 URL_DataSource_PoC 함수가 실행되면 사전에 작성된 악성 JavaScript를 Solr 서버로 전송되는 요청 패킷의 dataConfig 파라미터 내의 스크립트 태그에 포함하여 전송하게 된다.

 

 

[그림 8] 공격 코드 동작 순서

 

 

 [그림 9] MAIN함수

 

 

admin_cores 함수 실행 시 (1)에서 서버에 설정된 Core 명을 확인하기 위해 xml 형식의 Cores 설정 파일을 JSON 형식으로 변환하여 응답하도록 요청 패킷을 전송한다.

 

응답 패킷 내에 200 응답 코드와 ‘responseHeader’이 존재할 경우 (2)에서 각각의 Core를 대상으로 공격을 수행하게 된다. URUDataSource_PoC 함수의 경우 악성행위를 목적으로 한 JavaScript가 포함된 패킷을 solr 서버로 전송하는 역할을 한다.

 

 

 [그림 10] ] admin_cores 함수

 

 

아래의 URL을 통해 다운로드 된 Config파일(json) 내에는 Apache Solr에서 현재 운영중인 5개의 코어를 확인 할 수 있다.

 

 

 [그림 11] Cores Config 파일 파싱 결과

 

 

URL_DataSource_PoC  함수는 3개의 변수(debug_model_url, payload, headers)로 구성되어 있다. 

debug_model_url은 접근 URL을 포함하고 있으며, headers는 서버로 전송되는 요청 패킷의 해더를 설정해 준다. 마지막으로 payloa는 solr 서버에서 처리할 ‘entity’ 세션과 수행할 JavaScript 즉, 악성 JavaScript 구문이 포함 되어 있다. 

 

 

[그림 12] URL_DataSource_PoC 함수

 

 

URL_DataSource_PoC 함수 실행 시 Solr 서버로 전송되는 요청 패킷이 아래의 [그림 13]와 같이 구성 되어 전송된다.

 

 

 [그림 13] Solr 요청 패킷 구성

 

 

Payload변수의 값은 URL 인코딩 되어 있으며, [그림 14]와 같이 디코딩이 가능하다.

 

Entity 세션에 지정된 URL에 대하여 solr 서버가 액세스 가능한 URL인지 검증 한다. 접근이 가능한 경우 dataConfig 파라미터 내의 포함된 악성 JavaScript 구문이 실행 된다.

 

 

[그림 14] 공격 Pyload 구성

 

 

4. 대응방안

 

▶ Apache Solr 8.2.0 버전 이상으로 업그레이드

 

Apache Solr 8.2.0 부터는 enable.dih.dataConfigParam의 경우 기본값이 ‘False’로 설정되어 있으므로 dataConfig 파라미터를 사용해야 할 경우 enable.dih.dataConfigParam을 ‘True’로 설정해야 이용이 가능하다.

 

 

 [그림 15] enable.dih.dataConfigParam 설정 권고문

 

 

 

 

[그림 16] enable.dih.dataConfigParam 설정 값 검증 로직

 

 

Apache Solr 8.2.0으로 업그레이드 한 후 취약점 시연을 통해 해당 취약점 조치되었는지 확인한다.

 

 

 

[그림 17] 취약점 조치결과 확인

 

 

정상적으로 조치된 경우 403 에러페이지가 출력된다. 또한 시스템 정보가 노출되지 않도록 별도의 동일한 에러페이지를 적용해야 한다. 

 

 

 

[그림 18] 취약점 조치결과 확인

 

 

5. 참고자료

 

[1] 마이크로소프트의 수난시대, 제품에서 취약점은 갈수록 늘어나고

https://www.boannews.com/media/view.asp?idx=79046

 

[2] [CVE-2019-0193] Remote Code Execution via DataImportHandler

https://github.com/jas502n/CVE-2019-0193?fbclid=IwAR0MUqoIcSO-aDuAVUOe_WOHF6jIjDL0999HEi7xolUeVC0MFa9buQ2yeNk

 

[3] CVE-2019-0193 Solr DataImport Handler RCE (RCE-Vuln < solr v8.12)

https://github.com/jas502n/CVE-2019-0193?fbclid=IwAR0MUqoIcSO-aDuAVUOe_WOHF6jIjDL0999HEi7xolUeVC0MFa9buQ2yeNk

 

[4] Data Import Request Handler(Atlassian Confluence)

https://cwiki.apache.org/confluence/display/solr/DataImportHandler

 

[5] K.Nero-JAMCODE(레거시에 Solr 적용하기)

https://jamcode.tistory.com/42

 

[6] Apache solr API “XPathEntityProcessor”

https://lucene.apache.org/solr/6_5_0/solr-dataimporthandler/org/apache/solr/handler/dataimport/XPathEntityProcessor.html

 

[7] Apache solr API “DataImportHandler”

https://lucene.apache.org/solr/6_5_0/solr-dataimporthandler/org/apache/solr/handler/dataimport/DataImportHandler.html

 

[8] Apache Solr 8.2.0 Download

Download link: http://lucene.apache.org/solr/downloads.html

 

[9] SOLR-13158: DIH: Add System property toggle for use of dataConfig param

https://github.com/apache/lucene-solr/commit/325824cd391c8e71f36f17d687f52344e50e9715

 

[10] 【漏洞分析】Apache Solr 远 程代码执行漏洞(CVE-2019-0193) 

https://sec.thief.one/article_content?a_id=56557f70ea2111117191a9c42781020c